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

2024-09-27 09:27:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个二值图像,我试图表示一个图,图像的白色部分是顶点和边,其中大面积的白点是顶点,边是连接我检测到的顶点的大白色部分之间的白色部分。 我通过使用OpenCV函数,比如腐蚀,findContents和矩,使用矩质心,找到了大的白色部分的中心。 所以我有了图的顶点。 我的下一个目标是得到边缘,这意味着只在白色区域中找到由2个点(x1,y1)和(x2,y2)表示的线。 我尝试使用各种功能,例如: 卡尼() 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

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

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

^{pr2}$

但结果是只有黑点才被认为是成分,这与我需要的恰恰相反。我试着用倒过来的图像得到了同样的结果,因为我假设算法更喜欢完全有界的点,而不是背景(在我的例子中是白色的,我使用它的目的是找到没有边界的区域) )在


Tags: 图像区域目标cv2迷宫顶点质心白色
1条回答
网友
1楼 · 发布于 2024-09-27 09:27:26

你查过Iwanowski的算法吗? https://pdfs.semanticscholar.org/cd14/22f1e33022b0bede3f4a03844bc7dcc979ed.pdf 本文描述了一种分析二值图像内容以找到其结构的方法。它所处理的图像类包括在其前景显示的对象组,这些对象组相互连接,形成一个类似于图形的结构。所述方法从图像位图中自动提取此结构,并生成一个矩阵,其中包含输入图像上显示的所有对象之间的连接

相关问题 更多 >

    热门问题