Pillow和Numpy,获得像素值

时间:2017-01-21 01:45:16

标签: python image numpy python-imaging-library pillow

出于某种原因

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值,除非它们不是。知道为什么吗?

1 个答案:

答案 0 :(得分:1)

原因是numpy工作基于列,而PIL在将一维数组转换为矩阵时或其他方式基于行。这意味着getdata函数将像素从位置(1,0)放置到数组中的第二个位置,并且numpy将数组中的第二个像素放置到位置(0,1)。因此,您需要在重塑中更改大小的顺序,并在比较中反转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