圖像按行列裁剪爲小圖像

裁剪圖像代碼,將一張大圖按指定大小,從左到右、自上而下,裁剪爲多個小圖

有3中裁剪模式:

輸入爲4n*4n大小的大圖

1)按4*4,

  •  無重複裁剪

    得到16張n*n張圖片

2)按4*4+3*3:

  • 無重複裁剪 
  •  x、y方向各偏移n/2的重複裁剪

     得到25張n*n張圖片

3)按4*4+3*3+3*4+4*3,

  • 無重複裁剪
  • x、y方向各偏移n/2的重複裁剪
  • x方向不偏移,y方向偏移n/2的重複裁剪
  • y方向不偏移,x方向偏移n/2的重複裁剪

     得到49張n*n張圖片

def imgs_clip(divide_num, files_path, files_divide_path, dst_size):
    '''
    將單張圖片裁剪出多個不同圖片
    :param divide_num: 1個輸入圖片裁剪出的樣本圖片個數
    :param files_path: 輸入圖片的文件夾路徑
    :param files_divide_path: 輸出樣本圖片的文件夾路徑
    :param dst_size: 輸出樣本/裁剪尺寸
    :return:
    '''

    def img_divide(img, img_name, divide_num, save_path, out_size):
        '''
        裁剪圖片,原始尺寸4N*4N,目標尺寸N*N,本文有3種方案:
        按照4*4,無重複裁剪,得到16個樣本
        按照4*4+3*3,在橫縱方向各偏移0.5N距離,得到16+9個樣本
        按照4*4+3*3+3*4+4*3,在橫縱方向各偏移0.5N距離,在橫向偏移0.5N距離縱向不偏移,在縱向偏移0.5N距離橫向不偏移,得到16+9+12+12個樣本
        :param img:
        :param img_name:
        :param divide_num:
        :param save_path:
        :param out_size:
        :return:
        '''
        if divide_num == 16:
            # 4*4
            for i in range(4):
                for j in range(4):
                    dst = np.array(img[out_size * j:out_size * (j + 1), out_size * i:out_size * (i + 1)])
                    dst_name = nameAdd(img_name, '_'+str(i * 4 + j).zfill(2))
                    tif.imwrite(os.path.join(save_path, dst_name), dst)
        elif divide_num == 25:
            diff = int(out_size * 0.5)
            # 4*4
            for i in range(4):
                for j in range(4):
                    dst = np.array(img[out_size * j:out_size * (j + 1), out_size * i:out_size * (i + 1)])
                    dst_name = nameAdd(img_name, '_'+str(i * 4 + j).zfill(2))
                    tif.imwrite(os.path.join(save_path, dst_name), dst)
            # 3*3
            for i in range(3):
                for j in range(3):
                    dst = np.array(
                        img[diff + out_size * j:diff + out_size * (j + 1),
                        diff + out_size * i:diff + out_size * (i + 1)])
                    dst_name = nameAdd(img_name, '_'+str(i * 3 + j + 16).zfill(2))  # 保存序號增大
                    tif.imwrite(os.path.join(save_path, dst_name), dst)
        elif divide_num == 49:
            diff = int(out_size * 0.5)
            # 4*4
            for i in range(4):
                for j in range(4):
                    dst = np.array(img[out_size * j:out_size * (j + 1), out_size * i:out_size * (i + 1)])
                    dst_name = nameAdd(img_name, '_'+str(i * 4 + j).zfill(2))
                    tif.imwrite(os.path.join(save_path, dst_name), dst)
            # 3*3
            for i in range(3):
                for j in range(3):
                    dst = np.array(
                        img[diff + out_size * j:diff + out_size * (j + 1),
                        diff + out_size * i:diff + out_size * (i + 1)])
                    dst_name = nameAdd(img_name, '_'+str(i * 3 + j + 16).zfill(2))  # 保存序號增大
                    tif.imwrite(os.path.join(save_path, dst_name), dst)
            # 4*3
            for i in range(4):
                for j in range(3):
                    dst = np.array(
                        img[diff + out_size * j:diff + out_size * (j + 1), out_size * i:out_size * (i + 1)])
                    dst_name = nameAdd(img_name, '_'+str(i * 3 + j + 25).zfill(2))  # 保存序號增大
                    tif.imwrite(os.path.join(save_path, dst_name), dst)
            # 3*4
            for i in range(3):
                for j in range(4):
                    dst = np.array(
                        img[out_size * j:out_size * (j + 1), diff + out_size * i:diff + out_size * (i + 1)])
                    dst_name = nameAdd(img_name, '_'+str(i * 4 + j + 37).zfill(2))  # 保存序號增大
                    tif.imwrite(os.path.join(save_path, dst_name), dst)

    files = glob.glob(os.path.join(files_path, '*.tif'))
    for index, file_path in enumerate(files):
        img = tif.imread(file_path)
        img_name = os.path.basename(file_path)
        img_divide(img, img_name, divide_num, files_divide_path, dst_size)
        process_show(index + 1, len(files))


def nameAdd(src_name, suf_fix, pre_fix=''):
    filename, extension = os.path.splitext(src_name)
    return pre_fix + filename + suf_fix + extension

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章