【问题标题】:Extract horizontal and vertical lines from an image从图像中提取水平线和垂直线
【发布时间】:2020-02-11 13:05:38
【问题描述】:

我想为附加的图像提取 2 个蒙版中的水平线和垂直线。

我已经尝试过形态学操作来做到这一点,

horizontalStructure = cv.getStructuringElement(cv.MORPH_RECT, (horizontal_size, 1))
verticalStructure = cv.getStructuringElement(cv.MORPH_RECT, (1, verticalsize))

但问题是,它将线检测为矩形,然后以 2 条线的形式绘制它,代表矩形的 2 条边。

有什么办法可以解决这个问题吗?

图片:

水平结果:

垂直结果:


编辑:这是我的另一张图片:

【问题讨论】:

    标签: python opencv image-morphology


    【解决方案1】:

    您对结构化元素做了什么?您的其余代码在哪里?

    我建议使用cv2.morphologyEx 使用形态学开场,如下所示:

    import cv2
    import numpy as np
    from skimage import io              # Only needed for web reading images
    
    # Web read image; use cv2.imread(...) for local images
    img = cv2.cvtColor(io.imread('https://i.stack.imgur.com/jnCvG.jpg'), cv2.COLOR_RGB2GRAY)
    
    # Get rid of JPG artifacts
    img = cv2.threshold(img, 128, 255, cv2.THRESH_BINARY)[1]
    
    # Create structuring elements
    horizontal_size = 11
    vertical_size = 11
    horizontalStructure = cv2.getStructuringElement(cv2.MORPH_RECT, (horizontal_size, 1))
    verticalStructure = cv2.getStructuringElement(cv2.MORPH_RECT, (1, vertical_size))
    
    # Morphological opening
    mask1 = cv2.morphologyEx(img, cv2.MORPH_OPEN, horizontalStructure)
    mask2 = cv2.morphologyEx(img, cv2.MORPH_OPEN, verticalStructure)
    
    # Outputs
    cv2.imshow('img', img)
    cv2.imshow('mask1', mask1)
    cv2.imshow('mask2', mask2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    我得到了以下两个面具,我觉得很好看:

    希望有帮助!

    ----------------------------------------
    System information
    ----------------------------------------
    Platform:    Windows-10-10.0.16299-SP0
    Python:      3.8.1
    NumPy:       1.18.1
    OpenCV:      4.2.0
    ----------------------------------------
    

    【讨论】:

    • @fracv 什么是“精巧边缘效应”?为什么不从一开始就在问题中提供实际图像?如果看不见的图像没有(显着)修改您的问题范围,请随时通过编辑您的问题来添加它们,我会看看。但是,如果它们以某种方式(完全)不同,请提出一个单独的问题,因为您会使我当前的答案无效,这在 Stack Overflow 上是不受欢迎的。
    • @fracv HansHirse 的解决方案适用于“原始”二进制输入,而不是边缘检测的结果。你需要填充斑点。不要让您的图像通过边缘检测器。您发布的图像似乎是边缘检测的结果,但实际上没有任何作用。如果这实际上是一个有效的输入而不是一个处理步骤,那么您首先需要在应用 HansHirse 的解决方案之前填充这些 blob。您的轮廓看起来完全闭合,因此您可以尝试填充背景或实际感兴趣的斑点。