python - 使用 OpenCV 在二值图像中查找边缘(图形边缘)

标签 python opencv

我有一个二值图像,我试图表示一个图,这样图像的白色部分就是顶点和边,其中大面积白点是顶点,边是白色部分连接我检测为顶点的大白色部分。 我设法通过使用 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/

相关文章:

opencv - 您需要多久为 ArUco 进行一次相机校准?

python - 初学者 : python unpack

python - 我已经安装了 Python 3.7.10,但 macOS 在运行 `python --version` 时始终报告 2.7.10

python - django 中的比赛条件

python - 使用opencv2 python在图像中矩形和正方形之间的区分

python - 在 Windows 主机上使用 python (cv2.VideoCapture) 在 docker 容器中打开网络摄像头

python - PEP8 用于长方法的名称

python - 有没有办法遍历两个字典中的所有键并更改所有重复的项目,以便字典的项目全部不同

ios - 无法让 OpenCV 在 iOS 上检测到人

python-2.7 - 当 anaconda 预装了 python 3.4 时,是否可以将 python 2.7 与 julia 一起使用?