Невозможно обработать изображение, преобразованное в OpenCV, с помощью scikit-image

Я хочу скелетировать изображение, используя модуль scikit-image для скелетирования. Это изображение предварительно обработано библиотекой OpenCV. Получив изображение «Feb_16-0.jpg», я конвертирую его в оттенки серого, выполняю морфологическое преобразование при открытии изображения, затем применяю размытие по Гауссу и адаптивное пороговое значение с помощью OpenCV и Python:

import cv2
import numpy as np
from matplotlib import pyplot as plt
from skimage.morphology import skeletonize
from skimage.viewer import ImageViewer
img = cv2.imread('Feb_16-0.jpg',0)
kernel = np.ones((1,1),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
blur = cv2.GaussianBlur(opening,(1,1),0)
ret3,th4 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

Теперь я хочу скелетонизировать изображение, используя scikit-image skimage.morphology.skeletonize. Я попытался написать код для выполнения эрозии и расширения, чтобы вручную скелетировать изображение с помощью OpenCV и Python. Но это оказалось очень неэффективной обработкой, поэтому я решил переключиться на библиотеку scikit-image. Однако, когда я передаю массив numpy, предварительно обработанный OpenCV, в модуль scikit-image, используя код:

skel = skeletonize(th4)

и попробуйте просмотреть результаты того же, я получаю ошибку:

Image contains values other than 0 and 1

Я не могу интерпретировать причину того же самого. Может ли кто-нибудь помочь мне в устранении этой ошибки типа данных?


person Anindita Bhowmik    schedule 11.07.2016    source источник


Ответы (2)


Пожалуйста, посмотрите, работает ли приведенный ниже код.

import cv2
import numpy as np
from matplotlib import pyplot as plt
from skimage.morphology import skeletonize
from skimage.viewer import ImageViewer
img = cv2.imread('Feb_16-0.jpg',0)
kernel = np.ones((1,1),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
blur = cv2.GaussianBlur(opening,(1,1),0)
ret3,th4 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
th4[th4 == 255] = 1
skel = skeletonize(th4)
viewer = ImageViewer(skel)
viewer.show()
person Community    schedule 11.07.2016

Входная матрица для skeletonize() должна быть двоичной с элементами 0/1 или True/False. Выход cv2.threshold() двоичный, но со значениями 0/255. Чтобы преобразовать матрицу th4 в форму 0/1, вы можете, например, сделать:

th4[th4 == 255] = 1

person user1337    schedule 11.07.2016
comment
Здравствуйте, я благодарю вас за ваше любезное предложение. Но я получаю аналогичную ошибку на бинаризованном вводе th4 вместо img. th4 — пороговое бинаризованное изображение. - person Anindita Bhowmik; 11.07.2016
comment
Похоже, что cv2.treshold() возвращает массив с 255 белыми и 0 черными. Вы можете преобразовать матрицу th4. я отредактирую свой пост - person user1337; 11.07.2016