Как конвертировать изображение в режиме «1» между PIL и numpy?

Я новичок в обработке изображений с помощью Python и столкнулся со странной проблемой.

Например, у меня есть черно-белое растровое изображение размером 2 * 2, пиксели которого следующие:

  

черный белый

     

белый черный

Используйте PIL и преобразуйте его в numpy:

>>> import Image
>>> import numpy
>>> im = Image.open('test.bmp')
>>> im
<BmpImagePlugin.BmpImageFile image mode=1 size=2x2 at 0x95A54EC>
>>> numpy.asarray(im)
array([[ True,  True],
       [False, False]], dtype=bool)
>>>

Меня озадачивает порядок пикселей в массиве. Почему бы не [[True, False], [False, True]]? Спасибо.


ОБНОВЛЕНИЕ: растровое изображение здесь: http://njuer.us/clippit/test.bmp

4 голоса | спросил Clippit 29 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 29 Sep 2011 16:45:47 +0400 2011, 16:45:47

1 ответ


0

Похоже, есть некоторые ошибки при конвертации в /из numpy в режиме 1.

Если вы сначала конвертируете его в L, он будет работать нормально:

>>> im
<BmpImagePlugin.BmpImageFile image mode=1 size=2x2 at 0x17F17E8>
>>> im2 = im.convert('L')
>>> numpy.asarray(im2)
array([[  0, 255],
       [255,   0]], dtype=uint8)

Кроме того, если вы попытаетесь преобразовать пустой массив bool в PIL, вы получите странные результаты:

>>> testarr = numpy.array([[True,False],[True,False]], dtype=numpy.bool)
>>> testpil = Image.fromarray(testarr, mode='1')
>>> numpy.asarray(testpil)
array([[False, False],
       [False, False]], dtype=bool)

Однако то же самое с uint8 работает нормально:

>>> testarr = numpy.array([[255,0],[0,255]], dtype=numpy.uint8)
>>> Image.fromarray(testarr)
<Image.Image image mode=L size=2x2 at 0x1B51320>
>>> numpy.asarray(Image.fromarray(testarr))
array([[255,   0],
       [  0, 255]], dtype=uint8)

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

>>> im
<BmpImagePlugin.BmpImageFile image mode=1 size=2x2 at 0x17F17E8>
>>> im2 = im.convert('L')
>>> arr = numpy.asarray(im2)
>>> arr
array([[  0, 255],
       [255,   0]], dtype=uint8)
>>> arr = arr == 255
>>> arr
array([[False,  True],
       [ True, False]], dtype=bool)

Затем преобразовать обратно:

>>> backarr = numpy.zeros(arr.shape, dtype=numpy.uint8)
>>> backarr[arr] = 255
>>> backarr
array([[  0, 255],
       [255,   0]], dtype=uint8)
>>> Image.fromarray(backarr).convert('1')
<Image.Image image mode=1 size=2x2 at 0x1B41CB0>
ответил jterrace 29 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 29 Sep 2011 18:57:41 +0400 2011, 18:57:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132