Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用OpenCV查找二值图像中的边(图形边)_Python_Opencv - Fatal编程技术网

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

Python 使用OpenCV查找二值图像中的边(图形边),python,opencv,Python,Opencv,我有一个二值图像,我试图表示一个图,这样图像的白色部分是顶点和边,其中大面积的白点是顶点,边是连接在我检测为顶点的大白色部分之间的白色部分。 我通过使用OpenCV函数(如侵蚀、findContours和矩)以及矩质心找到了白色大部件的中心。 我得到了图的顶点。 我的下一个目标是获得边,这意味着找到仅在白色区域中的线,由2个点(x1,y1)和(x2,y2)表示。 我尝试使用各种功能,例如: cv2.Canny() cv2.findLine cv2.findContour在二值图像上具有不同的参数

我有一个二值图像,我试图表示一个图,这样图像的白色部分是顶点和边,其中大面积的白点是顶点,边是连接在我检测为顶点的大白色部分之间的白色部分。 我通过使用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的算法吗?
“本文描述了一种分析二值图像内容以找到其结构的方法。它处理的图像类别包括在其前景显示的图像,一组对象相互连接,形成一个类似图形的结构。所述方法从图像位图中自动提取此结构并生成这是一个矩阵,包含输入图像上显示的所有对象之间的连接“

谢谢您的回答。我将检查算法,我怀疑在这种情况下从理论到实践将花费太长时间:)希望不会,但无论如何,这有助于我更有效地搜索解决方案。好的!我之所以发布这篇文章,是因为我去实习的实验室也遇到了同样的问题,而我之前的那个家伙也使用了这个算法。这是一个相当复杂的代码,但处理的是3D图像,所以2D可能更简单。此外,算法的某些部分可能已经作为C++代码可用,例如骨架化。