CV2与PIL

一、打开与显示

import cv2
from PIL import Image
import matplotlib.pyplot as plt

img_path = 'E:\\360MoveData\\Users\\Administrator\\Desktop\\111.JPG'
img_cv = cv2.imread(img_path)
cv2.imshow('111', img_cv)
cv2.waitKey()

img_PIL = Image.open(img_path)
plt.imshow(img_PIL)
plt.show()


二、CV2转PIL

img_PIL = Image.fromarray(cv2.cvtColor(img_cv,cv2.COLOR_BGR2RGB))

三、PIL转CV2

import numpy as np
img_cv = cv2.cvtColor(np.asarray(img_PIL), cv2.COLOR_RGB2BGR)

四、判断一张图是CV2

flag = isinstance(img_cv,np.ndarray)

五、判断一张图是PIL

from PIL import ImageFile
flag = isinstance(img_PIL,ImageFile.ImageFile)

六、区别

Opencv 读取为BGR,PIL读取为RGB(误X),对普通的图像是RGB,如果图片本身是其他模式,就不是RGB了

七、比较PIL和jpeg读取图像是否一致

img = cv2.imread(img_path)
fd = Image.open(img_path)  # opencv BGR ,PIL RGB, 读出来的图片不一样
pil_fd = cv2.cvtColor(np.array(fd), cv2.COLOR_RGB2BGR)
img_sha, pil_sha = img.shape, pil_fd.shape
print(img_sha==pil_sha)   # 尺寸是一致的
#可以查看具体哪些位置不同
# for a in range(img_sha[0]):
#     for b in range(img_sha[1]):
#         for c in range(img_sha[2]):
#             if img[a][b][c] != pil_fd[a][b][c]:
#                 print(a,b,c,img[a][b][c], pil_fd[a][b][c])
#可以查看整体是否相同
print((img==pil_fd).all())

八、查看libjpeg版本

Jpeg图像为有损压缩,PILopencv采用不同版本libjpeg时读取的图像存在像素级差异

工作小记:PIL和opencv读取图片的差异_georgeandgeorge的博客-CSDN博客

opencv, pillow读取jpg图像的坑_Thunder的博客-CSDN博客_xxoo图片

一个简单的比较方式是查看cv2和PIL下libjpeg文件的大小

find XXXX/Python/3.6/lib/python/site-packages -name libjpeg*

du -sh XXXX/Python/3.6/lib/python/site-packages/cv2/.dylibs/libjpeg.9.dylib

du -sh XXXX/Python/3.6/lib/python/site-packages/ PIL/.dylibs/libjpeg.9.dylib

九、同个模型在不同环境下输出不同可能原因

预处理、后处理不一致,如不同的resize

混合精度

PILopencv读取同一张图像时存在像素值差异

不同版本opencv

十、报错:ndarray is not C-contiguous

        对一个图取子图,再计算md5码时,抛出该异常。报错提示为数据在内存中不连续,把不连续转为连续即可。

解决方法:

python 保存二进制文件及大数组保存报错 ndarray is not C-contiguous_qq9313的博客-CSDN博客

img = np.ascontiguousarray(img)

十一、PIL的模式

 PIL中有九种不同模式,分别为1、L、P、RGB、RGBA、CMYK、YCbCr、I、F

各模式具体介绍:Python:PIL九种不同模式_@Elaine的博客-CSDN博客_pythonpil能打开那些格式

查询PIL图片模式:

print(img.mode)

转换PIL图片模式,这里转换为RGB:

img=img.convert("RGB")

十二、cv2.imread打开图片,提示 libpng error:IEND:CRC error

有张图本地可以预览,但是cv2打不开,如题报错。于是想到利用PIL打开后转cv2格式,转完后颜色很奇怪,黑乎乎的,反色后颜色还是很奇怪。在本地查看简介,比普通图片多一行“颜色描述文件:sRGB IEC61966-2.1”;查看了一下PIL打开后的模式mode,是‘P’。有个解决方法是Image.open打开——convert将其从P模式转为RGB模式——cvtColor转BGR

十三、查看某个像素的值

        本地预览无法查看rgb三通道的值,可以通过opencv打开后imshow,左下角会显示3通道的值,或者通过代码显示具体某个像素的颜色。可以看到2种方法显示的颜色通道顺序不同

# cv2
im = cv2.imread(path)
print(im[0][0])
#[239,234,231]

#PIL
im = Image.open(path)
print(im.mode)  # RGB
im = im.load()
print(im[0,0])
#(231,234,239)


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值