1
出於某種原因枕頭和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的,讓像素值
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)
,當他們有沒有關係?當他們不是時,我是什麼?也許一個使用'(x,y)'座標,但其他使用'(row,col)'意味着'(y,x)'。 – furas
@furas,根據圖像不同,我沒有注意到圖案。我以爲同一個w.r.t.形狀,但這兩個物體的形狀是相同的。大致(7500像素,4500像素)。如果我理解'im.getdata()'[{docs link}](http://pillow.readthedocs.io/en/latest/reference/Image.html#PIL.Image.Image.getdata)是如何工作的,那麼他們應該是完全一樣的,他們是爲了大多數價值觀,但不是全部。 – adammenges
我期望'getpixel()'使用'x,y'座標,但'im_data []'使用'y,x'座標 - 所以你比較不同的像素 - 'x,y'和'y,x'(即。 '(100,100)'帶'(100,0)') – furas