为什么使用PIL和Opencv,相同的像素具有不同的值?

时间:2019-05-22 10:36:45

标签: python opencv python-imaging-library

我从互联网上下载了一个随机图像,使用PIL.Image.open()cv2.imread()将其打开,然后检查了一些像素的值。问题是使用PIL和Opencv获得的相同像素的值不同!
这是我尝试过的图像:
enter image description here 这就是我所做的:

>>> import cv2
>>> from PIL import Image
>>> img = cv2.imread('img.jpg')
>>> im = Image.open('img.jpg')
>>> img[0][0]
>>> array([142, 152, 146], dtype=uint8)
>>> im.getpixel((0, 0))
>>> (138, 158, 131)

im和{{1的R,G,B值((138!= 146),(158!= 152),(131!= 142)) }}不匹配,尽管它是相同的像素和相同的图像!
我查看了SO帖子,发现this post在谈论同一问题,因此我使用发布的代码再次检查了差异:

img

我得到的哈希值是不同的,图像之间的差异也不是黑色!

其他信息:
 -操作系统: Ubuntu 18.04
 - Python: 3.6
 - Opencv: opencv-python == 4.0.0.21
 - PIL:枕头== 5.4.1

对此有什么解释吗?

1 个答案:

答案 0 :(得分:1)

Opencv将图像存储为numpy ndarray。

import cv2
cv_img = cv2.imread(img_path)
from PIL import Image
pil_img = Image.open(img_path)

当您执行cv_img[x][y]时,您将访问第y列和第x行,但是如果执行pil_img.getpixel((x,y))则将枕头访问第x列的像素和第y行。

另一个因素是枕头返回(R, G, B)格式,而opencv返回(B, G, R)格式。

对我来说cv_img[20][10]给出了array([127, 117, 129], dtype=uint8)。在此处B = 127G = 117R = 129中检查。

但是pil_img[10][20]给出了(129, 117, 127)。在此处检查R = 129G = 117B = 127