如何使用腐蚀操作分离接触物体的轮廓?

6
我遇到了这个问题:
我正在使用 Python 和 OpenCV。我试图使用 erode 分离接触的硬币轮廓。我对图像进行了阈值处理,然后尝试应用 erode 但什么也没有发生。我已经阅读了文档,但仍然不太理解 getStruturingElement 和 erode 如何工作。
1. 我已经对图像进行了阈值处理。 2. 在阈值处理后的图像上使用了 erode。
但还是没有任何结果。在这里我使用了什么错误?
以下是代码的一部分:
import cv2, numpy as np

#1.Reads Image
objectImage = cv2.imread('P1000713s.jpg')

#2.Converts to Gray level
cvtcolorImage = cv2.cvtColor(objectImage,cv2.COLOR_RGB2GRAY)

#3.Thresholds
imgSplit = cv2.split(objectImage)
flag,b = cv2.threshold(imgSplit[2],0,255,cv2.THRESH_OTSU) 

#4.Erodes the Thresholded Image
element = cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
cv2.erode(b,element)

cv2.imshow('Eroded',b)

你为什么认为没有任何改变?你用图像差异或其他方式进行了验证吗? - Tae-Sung Shin
是的,我试过了。我尝试发布输出图像,但由于我的声望不高,它不允许我这样做。也许我在使用cv2.erode时有误吗? 有人能给我一个在Python OpenCV中如何使用腐蚀的例子吗?谢谢 - Cap.Alvez
你可以尝试使用sklearn.clustering模块中的DBSCAN算法来分离在边缘重叠的两个或更多硬币。DBSCAN是一种基于密度的聚类算法,如果你调整好半径参数,就有可能成功地将这些硬币分开。 - cjohnson318
你可以尝试使用更大的元素,比如20x20。稍后再进行补偿(膨胀)即可。 - Barney Szabolcs
3个回答

3
我知道这是一个老问题,但我也遇到过类似的问题,并通过谷歌发现了这个问题。据我所知,cv2.erode()不会改变源图像,而是返回一个应用更改的新图像。将包含erode调用的行更改为:
b = cv2.erode(b,element)

当您调用cv2.imshow(...,b)时,应该让您看到更改。


2
我知道这是一个非常古老的帖子,但我认为我的回答可以帮助到某些人。 我也遇到了同样的问题。 如果使用腐蚀来分离轮廓,则形状属性信息始终会丢失。 我按照此链接的说明进行操作:OpenCV分水岭分割,其中使用分水岭分割来分离轮廓,结果非常准确。

这里再明确一下,分水岭并不是用于分离轮廓(即点的列表),实际上它使用输入图像中的像素。 - alkasm

2

看到您的图片,使用3x3十字形蒙版可能会一直停留在阈值区域内。建议使用MORPH_ELLIPSE而不是MORPH_CROSS。

如果硬币在一次调用后仍然“接触”,可以多次运行侵蚀操作,但请注意这将对您的图像产生破坏性影响。


我做到了,我已经侵蚀了图像并分离了两个硬币的轮廓。你是对的..这张图片真的很糟糕,我该如何纠正这种效果?也许使用膨胀? - Cap.Alvez
1
你可以进行膨胀操作,但这实际上是一个反向操作,你会得到原始图像。我正在使用手机,所以无法提供链接,但有一些特殊的形态学运算符用于“开放”和“关闭”形状,它们本质上只是一系列膨胀和腐蚀调用。希望这能帮到你! - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接