一、打开与显示
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图像为有损压缩,PIL与opencv采用不同版本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
混合精度
PIL与opencv读取同一张图像时存在像素值差异
不同版本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)