Преобразовать логический массив NumPy в образ подушки - PullRequest
0 голосов
/ 02 мая 2018

В настоящее время я работаю с обработкой изображений в Python, используя библиотеку scikit-image. Я пытаюсь сделать двоичное изображение, используя пороговое значение sauvola со следующим кодом:

from PIL import Image
import numpy
from skimage.color import rgb2gray
from skimage.filters import threshold_sauvola

im = Image.open("test.jpg")
pix = numpy.array(im)
img = rgb2gray(pix)

window_size = 25
thresh_sauvola = threshold_sauvola(img, window_size=window_size)
binary_sauvola = img > thresh_sauvola

Что дает следующий результат: enter image description here

вывод - массив numpy с типом данных этого изображения - bool

[[ True  True  True ...  True  True  True]
 [ True  True  True ...  True  True  True]
 [ True  True  True ...  True  True  True]
 ...
 [ True  True  True ...  True  True  True]
 [ True  True  True ...  True  True  True]
 [ True  True  True ...  True  True  True]]

Проблема в том, что мне нужно преобразовать этот массив обратно в изображение PIL, используя следующую строку кода:

image = Image.fromarray(binary_sauvola)

что делает изображение похожим на это:

enter image description here

Я также пытался изменить тип данных с bool на uint8, но тогда я получу следующее исключение:

AttributeError: 'numpy.ndarray' object has no attribute 'mask'

До сих пор я не нашел решения для получения изображения PIL, которое выглядит как результат установки порога.

1 Ответ

0 голосов
/ 02 мая 2018
Функция

PIL Image.fromarray содержит ошибку в режиме '1' изображений. Этот Гист демонстрирует ошибку и показывает несколько обходных путей. Вот лучшие два обходных пути:

import numpy as np
from PIL import Image

# The standard work-around: first convert to greyscale 
def img_grey(data):
    return Image.fromarray(data * 255, mode='L').convert('1')

# Use .frombytes instead of .fromarray. 
# This is >2x faster than img_grey
def img_frombytes(data):
    size = data.shape[::-1]
    databytes = np.packbits(data, axis=1)
    return Image.frombytes(mode='1', size=size, data=databytes)

Также см. Ошибка преобразования изображений PIL B & W в массивы Numpy .

...