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

OpenCV中的梯度方向

  •  2
  • Wizard  · 技术社区  · 6 年前

    通过Sobel算子,我可以确定图像的梯度大小。我在下面显示:

    GradMag

    现在我想确定梯度方向。为此,我正在跟踪 this post,它利用了函数 cv2.phase . 然后,根据函数返回的度数,将角度硬编码为特定颜色。我的问题是这个函数为我返回的值在0到90度之间。因此,我得到的图像只有红色和青色。

    我的代码如下:

    # where gray_blur is a grayscale image of dimension 512 by 512
    
    # 3x3 sobel filters for edge detection
    sobel_x = np.array([[ -1, 0, 1], 
                       [ -2, 0, 2], 
                       [ -1, 0, 1]])
    
    
    sobel_y = np.array([[ -1, -2, -1], 
                       [ 0, 0, 0], 
                       [ 1, 2, 1]])
    
    
    # Filter the blurred grayscale images using filter2D
    
    filtered_blurred_x = cv2.filter2D(gray_blur, -1, sobel_x)  
    filtered_blurred_y = cv2.filter2D(gray_blur, -1, sobel_y)
    
    # Compute the orientation of the image
    orien = cv2.phase(np.array(filtered_blurred_x, np.float32), np.array(filtered_blurred_y, dtype=np.float32), angleInDegrees=True)
    
    image_map = np.zeros((orien.shape[0], orien.shape[1], 3), dtype=np.int16)
    
    # Define RGB colours
    red = np.array([255, 0, 0])
    cyan = np.array([0, 255, 255])
    green = np.array([0, 255, 0])
    yellow = np.array([255, 255, 0])
    
    # Set colours corresponding to angles
    for i in range(0, image_map.shape[0]):
        for j in range(0, image_map.shape[1]):
            if orien[i][j] < 90.0:
                image_map[i, j, :] = red
            elif orien[i][j] >= 90.0 and orien[i][j] < 180.0:
                image_map[i, j, :] = cyan
            elif orien[i][j] >= 180.0 and orien[i][j] < 270.0:
                image_map[i, j, :] = green
            elif orien[i][j] >= 270.0 and orien[i][j] < 360.0:
                image_map[i, j, :] = yellow
    
    # Display gradient orientation
    f, ax1 = plt.subplots(1, 1, figsize=(20,10))
    
    ax1.set_title('gradient orientation')
    ax1.imshow(image_map)
    

    显示图像:

    Orien

    提前谢谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   w-m    6 年前

    这个 ddepth 参数 cv2.filter2D 很重要。您将其设置为-1,这意味着过滤后的图像将具有与输入相同的深度。 gray_blur 似乎是一个无符号整数(可能是uint8),因此过滤器输出也是。

    因为你的过滤器可以产生负值,所以它们在uint8的下面流动。设置ddepth以从筛选器接收完整的值范围:

    filtered_blurred_x = cv2.filter2D(gray_blur, cv2.CV_32F, sobel_x)  
    filtered_blurred_y = cv2.filter2D(gray_blur, cv2.CV_32F, sobel_y)
    

    有了这个,你的过滤图像现在编码一个方向,方向将映射完整的360度。