代码之家  ›  专栏  ›  技术社区  ›  kenth

如何使用Canny Edge Detection Open CV填充图像中的特定部分

  •  0
  • kenth  · 技术社区  · 2 年前

    我只想填充中间的人行横道,而不是图像的所有边缘。我该怎么做?

    import numpy as np
    import cv2 as cv2
    
    %matplotlib inline
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    mpl.rc('axes', labelsize=14)
    mpl.rc('xtick', labelsize=12)
    mpl.rc('ytick', labelsize=12)
    
    #Routine to fix 
    def fixColor(img):
    return(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    img = cv2.imread("walk.jpg")
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)
    plt.imshow(fixColor(blurred))
    canny = cv2.Canny(blurred, 30, 300)
    plt.imshow(fixColor(canny))
    
    (cnts, _) = cv2.findContours(canny.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    coins = image.copy()
    cv2.drawContours(coins, cnts, -1, (255, 0, 0), 2)
    plt.imshow(fixColor(coins))
    

    结果: enter image description here

    我想要的是: enter image description here

    原始图像: enter image description here

    1 回复  |  直到 2 年前
        1
  •  0
  •   Jeru Luke    2 年前

    我使用了您共享的代码,并执行了额外的膨胀操作来加厚Canny edge输出

    附加代码:

    kernel_ellipse = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
    dilate = cv2.dilate(canny, kernel_ellipse, iterations=1)
    
    (cnts, _) = cv2.findContours(dilate.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    coins = image.copy()
    for c in cnts:
        area = cv2.contourArea(c)
        if area > 1000:
             cv2.drawContours(coins , [c], -1, (0, 0, 255), -1)
    

    结果:

    enter image description here

    注: 为了用您选择的颜色填充轮廓 thickness 内参数 cv2.drawContours() 必须是-1。