【困惑实验记录】对图像操作选用PIL还是cv2?答:最好还是PIL吧

结论:对于图像处理,还是直接用PIL先处理比较好

再补充一点:在深度学习中最好采用png的图像格式,可参考:深度学习中图像格式选用jpg还是png?答:png

关于numpy.array的两个知识点:

  1. 取得array所有元素中的的最大值:np.max(array)
  2. 对比两个array是否所有元素都相同:(array1 == array2).any(),只会返回一个True或者False,如果没有.any()进行比较,则会返回很多个True或False

1. 用PIL读入后,是直接对图像整体做操作

常用操作:

先用PIL读入:

from PIL import Image
image = Image.open(image_path)
  1. 裁剪 crop:newimage = image.crop(box),box是一个四元组: ( x m i n , y m i n , x m a x , y m a x ) (x_{min},y_{min},x_{max},y_{max}) (xmin,ymin,xmax,ymax),指明了左上、右下两个坐标位置

  2. 缩放 resize:newimage = image.resize((w, h), Image.ANTIALIAS),(w,h)是指定缩放后的宽高,Image.ANTIALIAS表示会高质量缩放,不过现在使用的话会有警告,介意的话按照指示更改为Resampling.LANCZOS即可
    在这里插入图片描述

  3. 旋转 rotate:newimage = image.rotate(-45)-45表示指定的旋转角度(当旋转角度为负数时,则表示顺时针旋转),可改为其他任意数字,旋转后默认以黑色填充画面(若想要更改填充颜色为其他颜色,则可参见我的另一篇博客:【数据增强】用cv2旋转图像并自定义填充背景颜色(主要用到cv2.getRotationMatrix2D 和 cv2.warpAffine)

  4. 翻转 transpose:newimage = image.transpose(0),0表示选择的某种方式进行翻转,翻转共有6种方式,取值为0~5,依次为:[‘左右镜像’, ‘上下镜像’, ‘旋转90°’, ‘旋转180°’, ‘旋转270°’, ‘颠倒顺序’]

2. 如果要涉及到像素的处理(3个步骤)

  1. 则先用PIL读入
  2. 再转成nmupy后对一部分的像素值调整
  3. 再转回PIL保存(这样可以保留图片的原始模式,特别是对于图像分割中的8bit标签图,采用PIL模式保存还是会同样是8bit)

留坑2:要再去写一下代码试试


3. 以下为本次实验记录

from PIL import Image
import numpy as np
import cv2

if __name__ == '__main__':
    # 1. ---------验证mask用cv2 和 PIL读取后再转为numpy的像素值是否相同:相同------- #
    path = r'D:\SoftWareInstallMenu\JetBrains\PycharmProjects\tunnel_datadeal\crackop\augment\labels\1.png'
    image = Image.open(path)
    image_cv = cv2.imread(path, 0)

    pil2np = np.array(image)
    pil2np_2 = np.asanyarray(image)

    # 全都为True
    print((pil2np == image_cv).any())
    print((pil2np_2 == image_cv).any())
    print((pil2np_2 == pil2np).any())
    print(f'image_cv = {image_cv}, shape = {image_cv.shape}, ndim = {image_cv.ndim}')
    print(f'pil2np = {pil2np}, shape = {pil2np.shape}, ndim = {pil2np.ndim}')

    # 2. ----------或者cv2读取后的数组用PIL保存后,用PIL读取出来的像素值是否相同:不相同(期待值是11)----- #
    # -------------但是用pil2np转回pil,用PIL读取出来的像素值是否相同:相同(期待值是11)--------------- #
    # image_cv2pil = Image.fromarray(image_cv)      # 89
    # image_cv2pil = Image.fromarray(pil2np)          # 11
    image_cv2pil = Image.fromarray(pil2np_2)        # 11
    width, height = image_cv2pil.size
    pixels1 = set()  # 存放原始pil的像素值。集合,只会存储不同的元素
    pixels2 = set()  # 存放cv2pil的像素值
    for w in range(width):
        for h in range(height):
            pixels1.add(image.getpixel((w, h)))
            pixels2.add(image_cv2pil.getpixel((w, h)))

    print(f'pixels1 = {pixels1}')
    print(f'pixels2 = {pixels2}')

    # 3. ----------将cv2pil的再转回numpy,看是否与image_cv相同:相同---------------- #
    image_cv2pil_2cv = np.array(image_cv2pil)
    print((image_cv == image_cv2pil_2cv).any())	# True
    print((pil2np == image_cv2pil_2cv).any())	# True
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孟孟单单

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值