裁剪图像代码,将一张大图按指定大小,从左到右、自上而下,裁剪为多个小图
有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