Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 枕头和Numpy,获取像素值_Python_Image_Numpy_Python Imaging Library_Pillow - Fatal编程技术网

Python 枕头和Numpy,获取像素值

Python 枕头和Numpy,获取像素值,python,image,numpy,python-imaging-library,pillow,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值,除非它们不是。知道为什么吗?原因是,在将一维数组转换为矩阵或其他方式时,numpy基于列工作,PIL基于行工作。这意味着getdata函数将像素从位置(1,0)放置到数组中的第二个位置,numpy将数组中的第二个像素

出于某种原因

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

原因是,在将一维数组转换为矩阵或其他方式时,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)

什么时候不是?什么是
i
j
?可能一个使用
(x,y)
坐标,但另一个使用
(行,列)
,这意味着
(y,x)
@furas,这取决于图像,我没有注意到模式。我认为形状是一样的,但这两个物体上的形状是一样的。大约(7500px,4500px)。如果我理解了
im.getdata()
的工作原理,那么它们应该完全相同,对于大多数值,它们都是相同的,但不是所有值。我希望
getpixel()
使用
x,y
坐标,但是
im\u数据[]
使用
y,x
坐标-所以你可以比较不同的像素-
x,y
y,x
(即
(0100)
(100,0)