PIL работает с лыжным магом? - PullRequest
0 голосов
/ 29 июня 2018

Почему, когда я делаю это:

from skimage import feature, io
from PIL import Image

edges = feature.canny(blimage)
io.imshow(edges)
io.show()

Я получаю именно то, что я хочу, это изображение с полным краем. Но когда я делаю это:

edges = feature.canny(blimage)
edges = Image.fromarray(edges)
edges.show()

Я получаю целый беспорядок случайных точек, линий и других вещей, которые больше напоминают картину Джексона Поллока, чем изображение? Что не так, и как я могу исправить это так, чтобы я мог получить то, что я хочу, с помощью обоих методов?

для полного кода, посетите мой Github здесь:

https://github.com/Speedyflames/Image-Functions/blob/master/Image_Processing.py

1 Ответ

0 голосов
/ 30 июня 2018

Давайте посмотрим, какое изображение получается skimage.feature.canny:

edges = feature.canny(blimage)

>>> print(edges.dtype)
bool

Это логическое изображение, True для белого, False для черного. PIL правильно идентифицирует тип данных и пытается сопоставить его с его собственным 1-битным режимом, который "1" (см. Документы PIL об этом ). Это выглядит сломанным, хотя, кажется, он не получает должную ширину в байтах или что-то в этом роде.

Возникла проблема , похоже, они исправили преобразование PIL в NumPy, но, очевидно, обратное все еще не работает.

В любом случае, короче говоря, ваша лучшая ставка для успешного преобразования двоичного изображения из NumPy в PIL - преобразование его в оттенки серого:

edges_pil = Image.fromarray((edges * 255).astype(np.uint8))

>>> print edges_pil.mode
L

Если вам действительно нужно 1-битное изображение, вы можете затем преобразовать его с помощью

edges_pil = edges_pil.convert('1')
...