Как применить пороговый метод OpenCV к выводу морфологического изображения из метода Skimage? - PullRequest
0 голосов
/ 13 февраля 2020

Я работаю с кодом, который удаляет крупные объекты из изображения на основе определенного порога.

Код, с которым я работаю, сохраняет файл после операции morphology из модуля skimage :

from skimage import measure, morphology

# EDIT: added blobs_labels calculation
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)[1]  # ensure binary        
blobs = img > img.mean()
blobs_labels = measure.label(blobs, background=1)
constant = 200

b = morphology.remove_small_objects(blobs_labels, constant)
# save the the pre-version which is the image is labelled with colors
plt.imsave('pre_version.png', b)
# read the pre-version
img = cv2.imread('pre_version.png', 0)
img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

Теперь я хотел бы напрямую применить пороговый метод - без сохранения промежуточного изображения - к выводу морфологического изображения (b):

b = morphology.remove_small_objects(blobs_labels, constant)
img = cv2.threshold(b, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

Однако, если я изменю код, как указано выше, я получу следующую ошибку:

ошибка: OpenCV (4.1.2) C: \ projects \ opencv-python \ opencv \ modules \ imgproc \ src \ трех sh. cpp: 1527:

ошибка: (-215: утверждение не выполнено) sr c .type () == CV_8UC1 в функции 'cv :: threshold'

Мои вопросы: почему я не могу напрямую применить пороговый метод для выхода морфологии?

1 Ответ

1 голос
/ 13 февраля 2020

Вы ничего не говорите нам о blobs_labels, поэтому трудно быть уверенным, но проблема, скорее всего, в типе данных изображения. skimage.morphology.remove_small_objects поддерживает исходный тип данных, поэтому если это тип, который cv2 не нужен, вы получите ошибку. Преобразование в uint8 решает проблему с моей стороны.

import cv2
import skimage.morphology

blobs_labels = skimage.data.binary_blobs()
constant = 16
b = skimage.morphology.remove_small_objects(blobs_labels, constant)
b = b.astype('uint8')
img = cv2.threshold(b, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...