Почему PIL convert ('RGB') делает некоторые прозрачные в черном, а некоторые в белом? - PullRequest
2 голосов
/ 03 мая 2019

У меня есть два похожих маскированных изображения с прозрачным фоном. Я хочу получить разницу в изображении и ожидать, что она будет иметь низкое значение, поскольку изображения похожи.

lenna1.png lenna2.png

Но результат показывает, что существует разница в огромной прозрачной области, которая выглядит точно так же. (белый означает разницу)

diff_res = ImageChops.difference(lenna1, lenna2).convert('RGB')

diff_res

Я проверил разницу изображений lenna1, lenna2 на каком-то веб-сайте, и там написано, что изображения такие же, за исключением небольших различий на границах.

Затем я заподозрил значение альфа-канала и преобразовал lenna1, lenna2 в 'RGB'. и он показывает один фон как черный, а другой как белый.

lenna1 = Image.open('lenna1.png')
lenna2 = Image.open('lenna2.png')

converted_lenna1 = lenna1.convert('RGB')
converted_lenna2 = lenna2.convert('RGB')

преобразованный_ленна1 преобразованный_ленна2

Теперь я знаю, что convert () по умолчанию делает прозрачную область черной. Но я все еще не понимаю.

  1. Почему разница между изображениями в прозрачной области?
  2. Почему какое-то прозрачное изображение стало белым, и как я могу сделать свое собственное прозрачное изображение "будет белым"?

* Я также тестировал с тем же уровнем альфа, используя .putalpha ()

Спасибо, что прочитали этот вопрос.

Ответы [ 2 ]

2 голосов
/ 03 мая 2019

В Imagemagick 7 вы можете выполнять маскированное сравнение, чтобы игнорировать области изображения. (Python Wand 0.5.3 поддерживает Imagemagick 7, хотя я пока не знаю, поддерживает ли он маскированное сравнение). Вот пример в командной строке Imagemagick 7:

белый

enter image description here

Зеленый:

enter image description here

Mask:

enter image description here

magick compare -metric rmse -read-mask hat_mask.png hat_white.png hat_green.png hat_diff.png

0 (0)


Различия будут отображаться красным цветом.

enter image description here

Если я использую ваши изображения:

magick image1.png -alpha extract mask.png
magick compare -metric rmse -read-mask mask.png image1.png image2.png -alpha deactivate diff.png

or

magick compare -metric rmse  \( image1.png -alpha extract -write mpr:mask +delete \) -read-mask mpr:mask image1.png image2.png -alpha deactivate diff.png


7179.85 (0.109557) <--- ~11% different in opaque area


enter image description here

Если мы сравним все изображение, включая области под прозрачными областями, то

magick compare -metric rmse image1.png image2.png -alpha off null:
59598.7 (0.909419) <--- ~91% different over the whole area

Если мы включим альфа-канал, то из-за включения двух одинаковых альфа-каналов это уменьшает метрику сравнения, которая вводит в заблуждение, и мы получаем:

magick compare -metric rmse image1.png image2.png null:

or

magick compare -metric rmse -channel rgba image1.png image2.png null:

2828.15 (0.0431548) <--- ~4.3% different.
2 голосов
/ 03 мая 2019

Оба изображения имеют прозрачность, просто у одного белые пиксели сделаны прозрачными, а у другого черные пиксели прозрачными.Еще один способ сказать то же самое: основной цвет прозрачных пикселей - черный на одном изображении и белый на другом.Вы не можете видеть разницу, потому что они прозрачны!

Вот lenna1 с удаленным альфа-слоем слева, а затем сам альфа-слой справа:

enter image description here

А вот lenna2 с удаленным альфа-слоем слева, а затем сам альфа-слой справа:

enter image description here

Вы можете сделать их одинаковыми, найдя все прозрачные пиксели и сделав их белыми, например:

# Load the image and make into Numpy array
rgba = np.array(Image.open('lena2.png'))

# Make image transparent white anywhere it is transparent
rgba[rgba[...,-1]==0] = [255,255,255,0]

# Make back into PIL Image and save
Image.fromarray(rgba).save('result.png')

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

rgba[rgba[...,-1]==0] = [0,0,255,255]

Если у вас установлено ImageMagick , вы можете заставить все прозрачные пиксели стать цветом по вашему выбору, скажем, пурпурным,в терминале:

magick lenna1.png -background magenta -alpha background result.png

Это часто означает, что вы можете улучшить сжатие PNG и уменьшить размеры файлов PNG, сделав все прозрачные пиксели черными, и в результате изображение, вероятно, будет сжиматься намного лучше, чем если бы прозрачные пикселивсе дико отличаютсяEnt цвета:

magick image.png -background black -alpha background result.png
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...