为啥用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 读取的图片在像素点上不一致