Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将OpenCV阈值方法应用于从Skimage方法输出的形态学图像?_Python_Opencv_Scikit Image - Fatal编程技术网

Python 如何将OpenCV阈值方法应用于从Skimage方法输出的形态学图像?

Python 如何将OpenCV阈值方法应用于从Skimage方法输出的形态学图像?,python,opencv,scikit-image,Python,Opencv,Scikit Image,我使用的代码是根据定义的阈值从图像中删除大型对象 我正在使用的代码在浏览模块的形态学操作后保存文件: 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

我使用的代码是根据定义的阈值从图像中删除大型对象

我正在使用的代码在浏览模块的形态学操作后保存文件:

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),而不保存中间的图像:

但是,如果我如上所述更改代码,则会出现以下错误:

错误:OpenCV(4.1.2)C:\projects\OpenCV python\OpenCV\modules\imgproc\src\thresh.cpp:1527:

错误:(-215:断言失败)函数“CV::threshold”中的src.type()==CV_8UC1


我的问题是,为什么我不能直接将阈值方法应用于形态学输出?

您没有告诉我们有关
斑点标签的任何信息,因此很难确定,但问题可能是图像的数据类型
skimage.形态学。remove_small_objects
保持原始数据类型,因此如果它是
cv2
不想要的类型,您将得到一个错误。转换为uint8解决了我这边的问题

导入cv2
进口撇渣
blobs\u labels=skimage.data.binary\u blobs()
常数=16
b=撇除。形态学。移除小对象(斑点标签,常量)
b=b.astype('uint8')
img=cv2.阈值(b,0,255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

您的图像读取代码之所以有效,可能是因为cv2正在将数据转换为它可以使用的类型。

在我身上运行良好。您确定可以正确读取图像吗?我添加了代码,用于加载图像。这段代码给出了上面的错误。我添加了关于如何计算上面的blob_标签的代码。我会试试你的解决方案,谢谢!谢谢你的建议,这很有帮助!根据你的建议,我保存了这个文件。但是,np.array_equiv(b.astype('uint8'),img)现在将导致False,这意味着图像的值已更改。你知道为什么会发生这种情况吗?你可以试试
np.allclose
(最好用浮点数组测试)。但也有可能这些值发生了变化。使用CV2尝试不同的数据类型谢谢你的帮助,我很感激!np.allclose(b.astype('uint8'),img)也返回false
b = morphology.remove_small_objects(blobs_labels, constant)
img = cv2.threshold(b, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]