2016-10-14 5 views
0

Я занимаюсь обработкой изображений, и мне нужно проверить, совпадает ли бинарное изображение с другим.Python Pillow: как наложить одно двоичное изображение поверх другого, чтобы создать композит?

Скорость обработки не является проблемой, и простую вещь, которую я думал сделать, это считать белые пиксели, оставшиеся после добавления обратного изображения A к изображению B (эти изображения очень близки, но не совсем - рейтинг их более или менее одинаковые важны для моей ситуации).

Однако, чтобы создать составное изображение, мне нужно включить «маску», размер которой равен двум изображениям.

У меня возникли проблемы с поиском примера создания маски онлайн и ее использования для функции Image.composite.

Вот мой код:

compA = ImageOps.invert(imgA) 
imgAB = Image.composite(compA,imgB,??? mask) 

Прямо сейчас, я создал маску всех нулей - однако, составное изображение не отображается правильно (А и В в точности те же образы, маска всех нулей - или все, что в этом отношении - не работает).

mask = Image.fromarray(np.zeros(imgA.size,dtype=int),mode='L') 
imgAB = Image.composite(compA,imgB,mask) 

Как работает эта маска?

Как просто добавить эти два бинарных изображения поверх каждого другого?

ответ

1

Очевидно, что вы используете numpy, так почему бы не просто работать с массивами numpy и явно делать то, что арифметика вы хотите сделать в этой области, такие как вычитая одно изображение от другого:

arrayA = numpy.asarray(imgA, dtype=int) 
arrayB = numpy.asarray(imgB, dtype=int) 

arrayDelta = arrayA - arrayB 

print((arrayDelta !=0).sum()) # print the number of non-identical pixels (why count them by hand?) 
# NB: this number may be inflated by a factor of 3 if there are 3 identical channels R, G, B 

imgDelta = Image.fromarray((numpy.sign(arrayDelta)*127+127).astype('uint8')) # display this image if you want to visualize where the differences are 

Вы могли бы сделать это еще проще, например

print((numpy.asarray(imgA) != numpy.asarray(imgB)).sum()) 

, но я думал, литье в знаковое целое число типа первого и последующего вычитания позволит вам визуализировать больше информации (белый и B черный -> белый пиксель в дельте, черный и B белый -> черный пиксель delta)

+0

Хорошо, я думаю, это работает. Тем не менее, изображения массивов np, когда я их конвертирую, похоже, не имеют всех пикселей ... Для их просмотра я запускаю: 'Image.fromarray (arrayA, mode = 'L'). Show() '; мой первый набор изображений - это белый контур коробки на черном фоне - не заполнен ... но визуализация первого изображения после преобразования numpy приводит к заполнению вертикально полосатой белой коробки на черном фоне. – bordeo

+0

Попробуйте 'Image.fromarray (arrayA.astype ('uint8'), mode = 'L')' – jez

+0

ok, awesome - получил его. Спасибо. – bordeo