gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:30:08 26 4
gpt4 key购买 nike

我从互联网上下载了一张随机图片,使用 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 的 R、G、B 值 ((138 != 146), (158 != 152), (131 != 142))img 不匹配,尽管它是相同的像素和相同的图像!
我查看了 SO 帖子,发现 this post谈论同样的问题,所以我使用发布的代码再次检查差异:

from PIL import Image
import cv2
import sys
from hashlib import md5
import numpy as np

def hashIm(im):
imP = np.array(Image.open(im))

# Convert to BGR and drop alpha channel if it exists
imP = imP[..., 2::-1]
# Make the array contiguous again
imP = np.array(imP)
im = cv2.imread(im)

diff = im.astype(int)-imP.astype(int)

cv2.imshow('cv2', im)
cv2.imshow('PIL', imP)
cv2.imshow('diff', np.abs(diff).astype(np.uint8))
cv2.imshow('diff_overflow', diff.astype(np.uint8))

with open('dist.csv', 'w') as outfile:
diff = im-imP
for i in range(-256, 256):
outfile.write('{},{}\n'.format(i, np.count_nonzero(diff==i)))

cv2.waitKey(0)
cv2.destroyAllWindows()

return md5(im).hexdigest() + ' ' + md5(imP).hexdigest()

if __name__ == '__main__':
print(hashIm('img.jpg'))

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

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

这有什么解释吗?

最佳答案

这可能不是 numpy/舍入问题,而是 jpg 解码变体:https://github.com/python-pillow/Pillow/issues/3833

特别是:

JPEG decoders are allowed to produce slightly different results, "a maximum of one bit of difference for each pixel component" according to Wikipedia.

( https://github.com/python-pillow/Pillow/issues/3833#issuecomment-585211263 )

关于python - 为什么相同的像素使用 PIL 和 Opencv 具有不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56254907/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com