我有一个二进制图像,我试图表示一个图形,这样图像的白色部分是顶点和边缘,其中大区域白点是顶点,边缘是白色部分,连接我检测为顶点的大白色部分。 我设法通过使用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)
但结果是只有黑点被认为是组件,这与我需要的相反。我尝试使用倒置图像并给出相同的结果,因为我假设算法更喜欢完全有界的斑点,而不是背景(在我的情况下是白色,以及我使用它的整个目的,它找到了没有界限的区域 )
答案 0 :(得分:1)
你看过Iwanowski的算法吗? https://pdfs.semanticscholar.org/cd14/22f1e33022b0bede3f4a03844bc7dcc979ed.pdf "本文描述了一种分析二进制图像内容以便找到其结构的方法。它处理的图像类包括在其前景组中显示彼此连接的对象的图像,形成图形结构。描述的方法从图像位图自动提取此结构,并生成包含输入图像上显示的所有对象之间的连接的矩阵"