2017-01-21 5 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

とするとき、彼らはありませんか?彼らがいないときは、「i」、「j」とは何ですか?たぶん、 '(x、y)'を使うかもしれませんが、 '(y、x)'を意味する '(row、col)'を使うかもしれません。 – furas

+0

@furas、それはイメージによって違って、私はパターンに気づいていません。私は同じw.r.tと思った。形状は同じですが、これらのオブジェクトの両方の形状は同じです。概ね(7500px、4500px) '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'座標を使用することを期待しています。 '(0,100)'と '(100,0)') – furas

答えて

1

なぜなら、numpyは列ベースで動作し、PILは1次元配列を行列に変換するとき、または逆のときに行ベースで動作するからです。つまり、getdata関数はピクセルを位置(1,0)から2番目の位置に配置し、numpyは配列の2番目のピクセルを位置(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

関連する問題