繁体   English   中英

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

[英]Find edges (graph edges) in a binary image using OpenCV

我有一个二进制图像,我试图表示一个图形,这样图像的白色部分是顶点和边缘,其中大区域白点是顶点,边缘是连接之间的白色部分我检测到的大白色部分是顶点。 我设法通过使用OpenCV函数找到大白部分的中心,例如侵蚀,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

就像我发现质心一样,我想找到更多质心(使图像更少腐蚀)然后找到连接在这些质心之间的所有边缘。 这似乎不是一个好方法,所以我希望在答案中得到更好的方法。

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

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

但结果是只有黑点被认为是组成部分,这与我的需要相反。 我尝试使用倒置图像并给出相同的结果,因为我假设算法更喜欢完全有界的斑点,而不是背景(在我的情况下是白色,以及我使用它的整个目的,找到没有界限的区域)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM