Pillow和Numpy,获取像素值

3

由于某些原因

im_data = np.array(im.getdata()).reshape(im.size[0], im.size[1], 3)
p1 = im.getpixel((i, j))
p2 = im_data[i, j]

p1和p2的RGB值大部分时间是相同的,除非它们不同。有什么想法为什么会这样?


当它们不是什么时候?当它们不是什么时候?也许一个使用(x,y)坐标,而另一个使用(row, col),这意味着(y,x) - furas
@furas,这取决于图像,我没有注意到模式。我以为形状是一样的,但这两个对象的形状是一样的。大约为(7500px, 4500px)。如果我理解了im.getdata()的工作原理,那么它们应该完全相同,对于大多数值来说确实如此,但并非全部。 - adammenges
我认为 getpixel() 使用 x,y 坐标,但是 im_data[] 使用 y,x 坐标——这样你就会比较不同的像素——将 x,yy,x 进行比较(例如 (0,100)(100,0))。 - furas
1个回答

2
原因是numpy是基于列进行操作,而PIL是基于行进行操作,当将一维数组转换为矩阵或者反过来时。这意味着getdata函数将像素从位置(1,0)放置到数组的第二个位置,而numpy将数组中的第二个像素放置在位置(0,1)。因此,您需要更改reshape中的尺寸顺序,并在比较中颠倒i和j。下面的代码显示没有任何差异。
大多数像素相等的原因是巧合,并取决于您的图像。我用一张照片试了一下,除了对角线上的像素之外,几乎所有像素都不同。
import numpy as np
from PIL import Image


def reshape_img(img: Image):
    img_data = np.array(img.getdata()).reshape(img.size[1], img.size[0], 3)
    difference_found = False
    for i in range(img.size[0]):
        for j in range(img.size[1]):
            get_pixel = img.getpixel((i, j))
            data = img_data[j, i]

            if any(get_pixel != data):
                difference_found = True
                msg = 'Difference in pixel {pixel}: img.getpixel={getpixel}, ' \
                      'img_data={data}'.format(pixel=(i, j), getpixel=get_pixel, data=data)
                print(msg)
    if not difference_found:
        msg = 'The two images are identical'
        print(msg)


if __name__ == '__main__':
    ams = Image.open('amsterdam_small.jpg')
    reshape_img(ams)

Example image


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接