关于使用PIL库对tif图像进行尺寸裁剪所遇到的问题

项目场景:

将数据集中尺寸为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

因此代入上述函数中可以得到正确的裁剪。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值