项目场景:
将数据集中尺寸为384x384的图像全部进行中心裁剪,裁剪为256x256的新图像。
问题描述
使用PIL.Image库中的resize或者crop函数进行图像分辨率调整,然后使用save函数进行保存。但经过单步调试发现,每当运行到上述三个函数中的任意一个时,程序都会在不执行任何操作的前提下自动跳出,并且无法跳到库函数内部进行调试。
错误代码如下:
def cut_img_by_xy(src_dir_path, x_min, x_max, y_min, y_max, save_dir_path):
name_lst = os.listdir(src_dir_path)
for name in name_lst:
img_path = os.path.join(src_dir_path, name)
img = Image.open(img_path)
img_crop = img.crop((x_min, y_min, x_max, y_max))
save_path = os.path.join(save_dir_path, name)
img_crop.save(save_path)
原因分析:
如上所述,在程序的运行当中没有给出任何提示信息,均是自动结束进程。但是Image.open函数可以正常读取图像,并且打印图像的具体元数据。此外,在网上搜索PIL库进行图像裁剪操作,基本都是针对png、jpg等常用的图像格式,而搜索对tif图像进行中心裁剪,基本都是使用ArcGIS等专业的遥感图像处理平台进行处理。因此,个人猜测PIL.Image库主要针对常用的图像格式进行处理,其中的resize、crop和save函数本就无法服务于tif格式的专业图像。
解决方案:
使用cv2(即opencv-python)进行替代处理。处理命令如下:
def cut_img_by_xy(src_dir_path, x_min, x_max, y_min, y_max, save_dir_path):
name_lst = os.listdir(src_dir_path)
for name in name_lst:
img_path = os.path.join(src_dir_path, name)
img = cv2.imread(img_path, 0)
img_crop = img[x_min : x_max, y_min : y_max]
save_path = os.path.join(save_dir_path, name)
cv2.imwrite(save_path, img_crop)
其中原始图像的尺寸为384x384,因此图像的中心点坐标为(192,192)。如果需要裁剪成256x256的图像,就需要手工计算出裁剪后的图像的四个顶点所在原图像中的坐标,这里容易得到:
x_min = y_min = 192 - 128
x_max = y_max = 192 + 128
因此代入上述函数中可以得到正确的裁剪。