我从互联网上下载了一个随机图像,使用PIL.Image.open()
和cv2.imread()
将其打开,然后检查了一些像素的值。问题是使用PIL和Opencv获得的相同像素的值不同!
这是我尝试过的图像:
这就是我所做的:
>>> 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
对此有什么解释吗?
答案 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 = 127
,G = 117
,R = 129
中检查。
但是pil_img[10][20]
给出了(129, 117, 127)
。在此处检查R = 129
,G = 117
,B = 127
。