我使用的代码根据定义的阈值从图像中删除大型对象。
我正在使用的代码在从 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\thresh.cpp:1527:
错误: (-215:断言失败( src.type(( == 函数 'cv::threshold' 中的CV_8UC1
我的问题是,为什么我不能直接将阈值方法应用于形态输出?
你没有告诉我们任何关于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 正在将数据转换为它可以处理的类型。