构建属于自己的理想型的图像Resize函数应对图像裁剪出不定大小

简介: 构建属于自己的理想型的图像Resize函数应对图像裁剪出不定大小

项目需求


  近期在做项目的适合碰到了一个问题:进行图像分割裁剪时由于目标物不规范,我裁剪出的目标矩形框也不是一样的大小,这给我后面的工作进行造成了一定的麻烦,起初自己想直接暴力采用Resize,但是后面发现图像存在失真现象,主要有如下两种:


  1. 大图变小图:被拉的瘦长了


  1. 小图变大图:被填充成个胖墩墩了


  现在需要解决这个小麻烦,保证存起来的图像都是一般大并且尽量不失真




需求分析



  根据项目需求里面所阐述的那般,我想大家都想到了给图像添加灰条(OR其他颜色),这样可以保证小图可以在进行“变大”的过程中不会被拉伸失真。没错机制如我,我也采用了这种方式;但是如何解决大图转小图时能够不那么失真呢?


  由于暂时没找到一个很好的方式解决大图转小图时候被拉的瘦长这个问题,我选择了一个折中的方案:对切割下来的图像数据Size统计,剔除极少数异常值,分别取众数、平均数和中位数设置为标准的Size,在项目中尽量兼顾各项指标。(不知大家有什么合适的方法,望指点指点小弟我!)


  分析标准Size和待转的Size,我们分别取WidthHeight 代表图像的宽度和高度,对标准的WidthHeight以及待转的分别命名为:


  1. 标Width


  1. 标Height


  1. 原Width


  1. 原Height


对从原始图像中裁剪下来的图像Height&Width共有如下9种情况:


  1. 标Width  =  原Width and 标Height = 原Height


  1. 标Width  =  原Width and 标Height > 原Height


  1. 标Width  =  原Width and 标Height < 原Height


  1. 标Width  >   原Width  and 标Height = 原Height


  1. 标Width  <  原Width  and 标Height = 原Height


  1. 标Width  >  原Width  and 标Height > 原Height


  1. 标Width  <  原Width and 标Height < 原Height


  1. 标Width  >  原Width and 标Height < 原Height


  1. 标Width  <  原Width and 标Height > 原Height




解决思路


  从上面的9种情况分析可以得到有如下几种情况:


  1. 可以将原图贴到标准图上去直接使用,这样的情况有:1、2、4、6


  1. 不需要标准图像,直接将原图像进行缩放到标准图像的Size,这样的情况有:3、5、7


  1. 原图像的Width 或 Height存在小于标准的Width或Height这个时候会存在两种情况:


3.1 先执行Resize到小的一边然后再执行填充到标准的Size
3.2 先执行填充小的一边到同大的一边,再执行Resize




实践验证


情况1:这也三种情况中比较理想的情况。


数据准备: 这里的第一张图三标准图(经过缩小到10显示),第二张图像是原图像(未经缩放)image.pngimage.png

  1. 读取标准图像命名StandardImage


  1. 读取待Resize图像命名ArbitraryImage


  1. 将ArbitraryImage与StandardImage进行叠加(注意二者左上角对齐)


def MyResizeFun(BImgName, LImgName):
    with Image.open(BImgName) as BImg:  # 被粘贴的大图
        with Image.open(LImgName) as LImg:  # 要粘贴的小图
            BImg.paste(LImg, (0, 0))  # 小图 放在大图的坐标为0 0 的位置
            NewImg = BImg.copy()
    return NewImg
复制代码


image.png

情况3: 面对情况三这种一大一小的,我们分别实验两种进行比对看看。 先Resize后填充:


def MyResizeFun2(BImgName, LImgName):
    LImg = Image.open(LImgName)
    L_Width, L_Height = LImg.size
    if L_Width > L_Height:
        RImg = LImg.resize((L_Height, L_Height), Image.ANTIALIAS)
        with Image.open(BImgName) as BImg:  # 被粘贴的大图
            with RImg as RImg:  # 要粘贴的小图
                RImg.paste(LImg, (0, 0))  # 小图 放在大图的坐标为0 0 的位置
                OutImg = BImg.copy()
    if L_Width < L_Height:
        RImg = LImg.resize((L_Width, L_Width), Image.ANTIALIAS)
        with Image.open(BImgName) as BImg:  # 被粘贴的大图
            with RImg as RImg:  # 要粘贴的小图
                RImg.paste(LImg, (0, 0))  # 小图 放在大图的坐标为0 0 的位置
                OutImg = BImg.copy()
    return OutImg
复制代码


情况2: 这种情况较为简单,直接resize即可完成任务,我就不过多赘述了



相关文章
|
机器学习/深度学习
深度学习数据增强方法-内含(亮度增强,对比度增强,旋转图图像,翻转图像,仿射变化扩充图像,错切变化扩充图像,HSV数据增强)七种方式进行增强-每种扩充一张实现7倍扩)+ 图像缩放代码-批量
深度学习数据增强方法-内含(亮度增强,对比度增强,旋转图图像,翻转图像,仿射变化扩充图像,错切变化扩充图像,HSV数据增强)七种方式进行增强-每种扩充一张实现7倍扩)+ 图像缩放代码-批量
|
1月前
|
自然语言处理
LLM上下文窗口突破200万!无需架构变化+复杂微调,轻松扩展8倍
【5月更文挑战第12天】LongRoPE研究突破LLM上下文窗口限制,无需架构变更和复杂微调,实现8倍扩展至2048万个token。该方法利用位置嵌入非均匀性,通过高效搜索和优化初始化,适用于处理长文本任务,对模型性能影响小。但可能需要较多计算资源,且2048万的长度是否足够所有任务尚待探讨。[论文链接](https://arxiv.org/abs/2402.13753)
31 1
|
1月前
|
弹性计算 Serverless
函数计算的功能变化
函数计算的功能变化
18 2
|
1月前
|
数据可视化 网络可视化
混合图形模型MGM的网络可预测性分析
混合图形模型MGM的网络可预测性分析
|
1月前
|
机器学习/深度学习 Python
网络训练需要的混合类型数据的组织方式
网络训练需要的混合类型数据的组织方式
|
8月前
|
数据处理 C++ 计算机视觉
C++-掩膜外数据填补(边缘扩展法)
C++-掩膜外数据填补(边缘扩展法)
|
11月前
|
传感器
如何利用波段组合解决同物异谱和异物同谱现象?
如何利用波段组合解决同物异谱和异物同谱现象?
169 0
|
机器学习/深度学习 编解码 算法
速度精度均超越SOLOv2 | 看FastInst如何实现最优秀的实例分割模型(一)
速度精度均超越SOLOv2 | 看FastInst如何实现最优秀的实例分割模型(一)
365 0
速度精度均超越SOLOv2 | 看FastInst如何实现最优秀的实例分割模型(二)
速度精度均超越SOLOv2 | 看FastInst如何实现最优秀的实例分割模型(二)
196 0
|
机器学习/深度学习 算法 测试技术
图像大面积缺失,也能逼真修复,新模型CM-GAN兼顾全局结构和纹理细节(1)
图像大面积缺失,也能逼真修复,新模型CM-GAN兼顾全局结构和纹理细节
163 0