Pillow 和 Numpy,获取像素值
Pillow and Numpy, getting pixel values
出于某种原因
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 工作 column-based 而 PIL 工作 row-based。这意味着 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)
出于某种原因
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 工作 column-based 而 PIL 工作 row-based。这意味着 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)