【问题标题】:Python Open CV canny is detecting everything but the edgePython Opencv canny 正在检测除边缘之外的所有内容
【发布时间】:2019-12-29 09:23:04
【问题描述】:

Canny 正在检测除道路以外的任何地方的边缘。 这是原始图像。 https://imgur.com/a/O4ZVvb6

这是一个示例图像。 https://imgur.com/a/AqENNbq

我已经尝试过使用 Canny 阈值。 并应用 GaussianBlur、medianBlur 、bilateralFilter,

我也尝试过首先使用黑白图像阈值拟合器,但问题是地形会稍微改变颜色并导致问题。

import numpy as np
from PIL import ImageGrab
import cv2
import time

def screen_record(): 
    last_time = time.time()
    while(True):

        # record upper left corner of screen to get the image. 
        printscreen =  np.array(ImageGrab.grab(bbox=(0,40,1098,728)))
        print('loop took {} seconds'.format(time.time()-last_time))
        last_time = time.time()
        color = cv2.cvtColor(printscreen, cv2.COLOR_BGR2GRAY)
        canny = cv2.Canny(color, 20, 100)
        cv2.imshow('edges',canny)

        if cv2.waitKey(25) & 0xFF == ord('q'):
            cv2.destroyAllWindows()
            break

screen_record()

我希望只有一条实线。 如下图。 https://imgur.com/a/09vTE9e

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    您可以同时使用开闭运算来过滤canny 中的噪声边缘。代码如下。

    import numpy as np
    import cv2
    import matplotlib.pyplot as plt
    
    img = cv2.imread('vLnzxEs.png')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    canny = cv2.Canny(gray, 20, 100)
    
    # visualize the canny image
    plt.figure
    plt.imshow(canny, cmap='gray')
    
    #decleare kernel for closing and opening operations
    kernel = np.ones((75,75),np.uint8)
    # apply closing and opening
    closing = cv2.morphologyEx(canny, cv2.MORPH_CLOSE, kernel)
    opening = cv2.morphologyEx(closing, cv2.MORPH_OPEN, kernel)
    
    # visualize the opening 
    plt.figure
    plt.imshow(opening, cmap='gray')
    

    输出看起来像

    【讨论】:

      【解决方案2】:

      计算机不像人类那样“看”事物!假设您更关心检测“道路”而不是为什么 Canny 过滤器无法“工作”,我只是将红色通道与绿色通道进行比较,这可以在道路和草地之间提供非常好的分离(在这种类型的图像中)。例如:

      img_bgr = cv2.imread('road.png')
      
      delta = img_bgr[:,:,1] - img_bgr[:,:,2]
      delta = cv2.blur(delta, (200, 200))
      road = delta > 128
      

      给我:

      True 值(白色)是道路,False 值是草。这应该比 canny 中的“线条”更容易解释。

      这当然会在其他地方做一些奇怪的事情,但可能足以让你开始

      【讨论】:

      • “情节代码”是什么意思?如果这就是您的意思,该图像是cv2.imwrite('road_out.png', road.astype(delta.dtype) * 255) 的结果。否则你可以使用 matplotlib 来做plt.imshow(road)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      相关资源
      最近更新 更多