我有一个二值图像,我试图表示一个图,这样图像的白色部分就是顶点和边,其中大面积白点是顶点,边是白色部分连接我检测为顶点的大白色部分。 我设法通过使用 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)
但是结果是只有黑点被识别为组件,和我需要的相反。我尝试使用倒置图像并给出了相同的结果,因为我假设算法更喜欢完全有界的 Blob ,而不是背景(在我的例子中是白色,以及我使用它的全部目的,它发现没有边界的区域 )
最佳答案
您检查过 Iwanowski 的算法吗? https://pdfs.semanticscholar.org/cd14/22f1e33022b0bede3f4a03844bc7dcc979ed.pdf “这篇论文描述了一种分析二值图像内容以找到其结构的方法。它处理的图像类别包括在其前景中显示的一组对象的图像,这些对象相互连接,形成类似图形的结构. 所描述的方法自动从图像位图中提取这种结构,并生成一个矩阵,其中包含输入图像上显示的所有对象之间的连接"
关于python - 使用 OpenCV 在二值图像中查找边缘(图形边缘),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41087827/