2017-01-21 70 views
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值,除非他們不是。任何想法爲什麼?

+0

,當他們有沒有關係?當他們不是時,我是什麼?也許一個使用'(x,y)'座標,但其他使用'(row,col)'意味着'(y,x)'。 – furas

+0

@furas,根據圖像不同,我沒有注意到圖案。我以爲同一個w.r.t.形狀,但這兩個物體的形狀是相同的。大致(7500像素,4500像素)。如果我理解'im.getdata()'[{docs link}](http://pillow.readthedocs.io/en/latest/reference/Image.html#PIL.Image.Image.getdata)是如何工作的,那麼他們應該是完全一樣的,他們是爲了大多數價值觀,但不是全部。 – adammenges

+0

我期望'getpixel()'使用'x,y'座標,但'im_data []'使用'y,x'座標 - 所以你比較不同的像素 - 'x,y'和'y,x'(即。 '(100,100)'帶'(100,0)') – furas

回答

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