【问题标题】:Finding external contours in an image在图像中查找外部轮廓
【发布时间】:2020-07-22 13:11:36
【问题描述】:

我一直试图在图像中找到白板标记的轮廓(外部轮廓)。我已经尝试为此使用openCv(似乎是最简单的)。我已经对图像进行了灰度化和过滤,但仍然无法获得足够好的结果。我正在处理的图像非常好(例如其中没有任何其他对象),我很确定这是可能的(不使用繁重的 DL 算法)。

这就是我得到的:

这(大致)是我想要得到的(这是使用 Photoshop 的魔杖完成的):

我尝试了不同的算法,但似乎都不起作用(上面的结果只是使用了 cv2.findContours 与 cv2.RETR_TREE 和 cv2.CHAIN_APPROX_SIMPLE)。我发现很多人都在问一些非常相似的问题,但给他们的答案对我不起作用。

(例如: Process image to find external contourhttps://answers.opencv.org/question/182345/how-do-i-draw-only-external-contour/)

这是原图:

无论如何,感谢您的帮助!

【问题讨论】:

  • 如果您在打开的 CV 中阅读 Findcontous,则可以将不同的模式发送到该函数。要找到外部尝试,我们需要发送 cv2.RETR_EXTERNAL 代替 cv2.RETR_TREE
  • 请发布您的代码,以便其他人更正。
  • @ashtav 我尝试使用 RETER_EXTERNAL 但轮廓由几个不同的轮廓组成。谢谢你的回答!
  • @fmw42 我在下面发布了一些代码。谢谢!

标签: python opencv image-processing contour


【解决方案1】:

看看这个question

我相信这就是你要找的。​​p>

【讨论】:

    【解决方案2】:

    因此,使用 Sergey 提供的链接并使用阈值而不是灰度,我得到了更好的结果。这是代码:

    import cv2 # Import OpenCV
    import numpy as np # Import NumPy
    from matplotlib import pyplot as plt
    
    image = cv2.imread("./image.jpg")
    
    height, width = image.shape[0], image.shape[1]
    
    white_padding = np.zeros((50, width, 3))
    white_padding[:, :] = [255, 255, 255]
    image = np.row_stack((white_padding, image))
    
    _, mask = cv2.threshold(image, 220, 255, cv2.THRESH_BINARY_INV)
    
    
    kernel = np.ones((30, 30), np.uint8)
    closing = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
    
    closing_uint8 = np.uint8(closing)
    
    
    edges = cv2.Canny(closing_uint8, 100, 200)
    
    plt.imshow(edges)
    plt.show() 
    

    这样做的问题是需要针对不同的图片改变Kernel的大小,例如这个图片:

    输出:

    关于如何面对这个问题的任何想法?谢谢你的帮助!

    【讨论】:

    • 我不明白你所说的颜色错误是什么意思。当您使用 Mathplotpy 显示和图像时,它会应用一个彩色查找表。如果要查看实际颜色,请使用 cv2.imshow()。
    猜你喜欢
    • 2014-11-02
    • 2012-11-15
    • 2020-03-14
    • 2021-08-16
    • 2011-06-13
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 2020-06-14
    相关资源
    最近更新 更多