当前位置: 首页 > news >正文

关于使用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

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

相关文章:

  • 在英特尔独立显卡上部署YOLOv5 v7.0版实时实例分割模型
  • 什么是闭包,Python闭包(初学者必读)
  • SpringBoot+Actuator+Prometheus+Grafana进行可视化应用监控
  • C/C++ Qt QThread 线程组件应用
  • 关于小程序订单中心页设置的公告
  • 基于Python + Requests 的Web接口自动化测试框架
  • sed命令详解及demo
  • Allegro关闭线段显示不连续效果操作指导
  • 【408篇】C语言笔记-第十五章( 考研必会的查找算法考研真题实战)
  • 【排序】详细聊聊归并排序(含非递归)
  • kafka单条消息过大导致线上OOM,运维连夜跑路了!
  • ValidateCode验证码的使用详解(初学看完都会用)
  • 肝了一周总结的SpringBoot常用注解大全,一目了然!
  • 无线电信号密钥WiFi完整版学习教程
  • Linux----paste命令使用详解
  • .pyc 想到的一些问题
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • CSS相对定位
  • input的行数自动增减
  • Javascript Math对象和Date对象常用方法详解
  • Java知识点总结(JavaIO-打印流)
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • php中curl和soap方式请求服务超时问题
  • Python打包系统简单入门
  • Spring核心 Bean的高级装配
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 分布式熔断降级平台aegis
  • 复杂数据处理
  • 给Prometheus造假数据的方法
  • 简单数学运算程序(不定期更新)
  • 近期前端发展计划
  • 力扣(LeetCode)56
  • 如何设计一个微型分布式架构?
  • 追踪解析 FutureTask 源码
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ionic入门之数据绑定显示-1
  • #### go map 底层结构 ####
  • #《AI中文版》V3 第 1 章 概述
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (13)Hive调优——动态分区导致的小文件问题
  • (python)数据结构---字典
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (转)Oracle存储过程编写经验和优化措施
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET命名规范和开发约定
  • .NET企业级应用架构设计系列之结尾篇
  • .NET委托:一个关于C#的睡前故事
  • .NET正则基础之——正则委托
  • .net专家(张羿专栏)
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...