Правильная загрузка двоичной маски/GIF с помощью PIL и Imageio


person Mr Vinagi    schedule 13.04.2021    source источник
comment
Почему они ведут себя по-разному? Потому что это совершенно разные реализации. Кроме того, попробуйте использовать RGB PNG вместо GIF с палитрой?   -  person AKX    schedule 13.04.2021


Ответы (1)


Если вы сделаете это:

im = Image.open('mask.gif')
print(im)

Вывод

<PIL.GifImagePlugin.GifImageFile image mode=P size=683x512 at 0x7FC0C86FF430>

вы увидите, что ваше изображение является изображением палитры, потому что mode=P. Это означает, что значения в изображении не являются значениями RGB или оттенков серого, а являются индексами в палитре. Если посмотреть на палитру:

np.array(im.getpalette()).reshape(256,3)
Out[25]: 
array([[255, 255, 255],      <--- palette entry 0
       [  0,   0,   0],      <--- palette entry 1
       [  2,   2,   2],
       [  3,   3,   3],
       [  4,   4,   4],
       [  5,   5,   5],
       ...
       ...

вы увидите, что запись 0 — это rgb (255 255 255), так что это означает, что везде, где у вас есть ноль на вашем изображении, он должен отображаться белым! И где бы он ни был на вашем изображении, он должен отображаться черным.

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

maskPIL = np.array(Image.open('mask.gif').convert('L'))

Более полное объяснение здесь.

person Mark Setchell    schedule 13.04.2021