为啥用Python的openCV读取图片与PIL读取的图片像素值会不一样?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥用Python的openCV读取图片与PIL读取的图片像素值会不一样?相关的知识,希望对你有一定的参考价值。

我首先尝试用PIL读取同一张图片,
img1 = Image.open('000008.jpg')
print(img1.mode)
print(img1.getpixel((252,252)))
print(img1.size)
输出对角线(252,252)位置的像素值为:(0, 4, 40)
再用opencv读取相同图片,已经考虑转换为RGB通道的情况下,输出同样位置的像素值,
img2 = cv2.imread('000008.jpg')[..., ::-1]
# img2 = cv2.cvtColor(img2,cv2.COLOR_BGR2RGB)
print(img2[252][252])
print(img2.shape)
结果却为:[ 0 4 38]

接着,我又将PIL转换为numpy格式,img1 = np.array(img1,dtype=np.float32)
结果与PIL一致,为(0, 4, 40),和opencv依然不同,

有没有大神能够帮助解答一下为啥相同位置的像素值不一样呢?有没有办法解决这个问题?

经测试,同一张图片,使用 PIL 和 OpenCv 库读取的数据是一样的(经过BGR转成RGB):

执行结果:

建议:可以尝试更新 PIL 或是 OpenCv 库。

本机测试环境: Python 3.7+Pillow 6.2 +opencv-python 4.1

参考技术A 的确是不一样的。
以下是我用两种方法对一张图片做的差值。解决方案暂时没有想到。建议还是只用一种读取方式。
[[[254 1 0]
[254 1 0]
[254 1 0]
...
[ 0 0 4]
[ 0 255 3]
[ 0 0 1]]
[[ 0 0 0]
[255 1 0]
[ 0 0 0]
...
[ 0 255 2]
[ 0 255 2]
[255 1 0]]
[[ 0 0 0]
[254 0 1]
[ 0 0 0]
...
[ 0 0 2]
[ 0 255 2]
[ 0 0 0]]
...
[[ 0 0 0]
[ 0 0 0]
[ 0 0 0]
...
[ 0 0 0]
[ 0 0 0]
[ 0 0 0]]
[[ 0 0 0]
[ 0 0 0]
[ 0 0 0]
...
[ 0 0 0]
[ 0 0 0]
[ 0 0 0]]
[[ 0 0 0]
[ 0 0 0]
[ 0 0 0]
...
[ 0 0 0]
[ 0 0 0]
[ 0 0 0]]]

以上是关于为啥用Python的openCV读取图片与PIL读取的图片像素值会不一样?的主要内容,如果未能解决你的问题,请参考以下文章

PIL.Image.open 与 cv2.imread 读取的图片在像素点上不一致

opencv-PIL-matplotlib-Skimage-Pytorch图片读取区别与联系

python中用Pillow库进行图片处理

opencv和PIL读取图片的速度对比

opencv和PIL读取图片的速度对比

opencv和PIL读取图片的速度对比