2016-05-20 4 views
1

Итак, у меня есть два изображения PIL RGBA. То, что я хочу сделать, это найти все места, где значения RGB являются одинаковыми и альфа 255. выглядит следующим образом:Numpy, где используются различные размеры массива

from PIL import Image 
import numpy as np 
img1 = np.array(Image.open(/path/to/img1).convert('RGBA'), float).reshape(32,32,4) 
img2 = np.array(Image.open(/path/to/img2).convert('RGBA'), float).reshape(32,32,4) 

# Checks to see if RGB of img1 == RGB of img2 in all locations that A=255 
np.where((img1[:,:,:-1] == img2[:,:,:-1]) &\ # RGB check 
     (img1[:,:,3] == 255)) # Alpha check 

Но это приводит к operands could not be broadcast together with shapes (32,32,3) (32,32).
Я не думал, что я пытался передать их вместе, я просто хотел найти детексы, которые, я думаю, в свою очередь транслирует их в этом заявлении. Есть ли другой способ сделать это или способ не транслировать неравные формы?

+1

'img1 [:,::: -1]' приводит к массиву формы '32, 32, 3'. 'img1 [:,:, 3]' приводит к массиву формы '32, 32'. – mgilson

+0

@mgilson да, я знаю. Но что я пытаюсь сделать ясно? Я думал, что вышеупомянутое будет работать, потому что я думал, что «np.where» разрешит несколько операторов «где», а не транслировать их вместе. – ZWiki

+0

И, чтобы указать немного стиля, здесь продолжение '' 'для продолжения строки здесь не нужно. Python объединяет строки, которые находятся в незакрытых скобках, скобках или скобках (как это имеет место здесь). Фактически, PEP 8 («официальный» стиль) рекомендует использовать скобки для продолжения строк и _never_ с помощью '' 'для продолжения строки. – mgilson

ответ

3

Используйте .all(axis=-1), чтобы найти места, где все три значения RGB равны:

np.where((img1[..., :-1] == img2[..., :-1]).all(axis=-1) 
     & (img1[..., 3] == 255)) 

Как mgilson points out, (img1[..., :-1] == img2[..., :-1]) имеет форму (32, 32, 3). Вызов .all(axis-1) уменьшает последнюю ось к скалярному логическому значению, так что

(img1[..., :-1] == img2[..., :-1]).all(axis=-1) 

имеет форму (32, 32). Это соответствует форме (img1[..., 3] == 255), поэтому эти булевы массивы можно комбинировать с bitwise-and operator, &.

+2

+1 Я думаю, что сокращение вдоль последней оси - это то, о чем просит ОП. Интересно, хочет ли OP убедиться, что альфа-значения одинаковы ... (В этом случае он упрощается до '(img1 == img2) .all (axis = -1)' без эллипса) – mgilson

+0

Удивительный! Это именно то, чего я хотел. И да @mgilson я смог добавить ваш, чтобы получить альфа-чек. Благодаря! – ZWiki

+0

Я также укажу, что '&' не является логическим и оператором (хотя он часто используется как таковой). Это _binary_ '&' оператор, который имеет специальную оболочку для возврата массива логических, если правая и левая стороны являются логическими массивами. Для _logical_ и, я всегда рекомендовал использовать 'np.logical_and' (у которого нет проблем с приоритетом, которые оператор' & 'имеет, что иногда кусает людей, пытающихся его использовать) ... – mgilson

Смежные вопросы