使用OpenCV在二值图像中查找边(图形边)

b4wnujal  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(161)

我有一个二进制图像,我试图表示一个图,这样图像的白色部分是顶点和边缘,其中大面积白点是顶点,边缘是连接我检测到的大白色部分之间的白色部分。我设法找到白色大部分的中心,使用OpenCV函数,如侵 eclipse ,findContours和矩,使用矩质心。所以我有图的顶点。我的下一个目标是得到边缘,这意味着找到仅在白色区域中的线,由2个点(x1,y1)和(x2,y2)表示。我尝试使用各种功能,例如:cv2.Canny()cv2.findLine cv2.findContour在二进制图像上使用不同参数
为了理解我的目标,人们可以把它想象成一个迷宫,迷宫的开始是图像中最大的白色,迷宫的结束是第二大的白点,你可以走过的地方都是图像中的白色区域。
我在项目中使用的一些代码段:首先找到边,给定一个二进制图像(finalImage)并返回质心

def findCentroids(finalImage):
_, contours0, hierarchy = cv2.findContours(finalImage.copy(), cv2.RETR_LIST,                    cv2.CHAIN_APPROX_NONE)
moments = [cv2.moments(cnt) for cnt in contours0]
centroids = []
for M in moments:
    if M["m00"] != 0:
        cX = int(M["m10"] / M["m00"])
        cY = int(M["m01"] / M["m00"])
        centroids.append((cX, cY))
return centroids

所以就像我找到质心一样,我想找到更多的质心(使图像更少被侵 eclipse ),然后可能找到连接这些质心的所有边。这似乎不是一个好方法,所以我希望得到更好的答案。

编辑所以我想到了另一个想法,那就是使用连通分量方法。我尝试使用cv2提供的连接组件,同样:

output = cv2.connectedComponentsWithStats((imageForEdges), 8, cv2.CV_32S)

但结果是,只有黑点被识别为组件,这与我所需要的恰恰相反。我尝试使用反转图像,它给出了相同的结果,因为我假设算法更喜欢完全有界的斑点,而不是背景(在我的情况下是白色,我使用它的全部目的是它找到没有边界的区域)

bhmjp9jg

bhmjp9jg1#

你查过伊瓦诺夫斯基的算法了吗https://pdfs.semanticscholar.org/cd14/22f1e33022b0bede3f4a03844bc7dcc979ed.pdf
本文介绍了一种方法,用于分析的内容的二进制图像,以找到其结构。它所处理的图像类由在其前景处显示对象组的图像组成,这些对象组彼此连接,形成类似图形的结构。所描述的方法从图像位图中自动提取该结构,并产生包含输入图像上所示的所有对象之间的连接的矩阵

相关问题