2017-01-21 9 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)', но другие использовать '(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' (т.е. '(0,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