【问题标题】:Applying colours to gradient orientation将颜色应用于渐变方向
【发布时间】:2018-08-03 19:53:35
【问题描述】:

参考this帖子,当将颜色渐变方向的程度硬编码到图像上时,强度变化的地方应该着色,而没有变化的地方,图像应该是黑色的。

我不确定该帖子是如何实现的。由于所有度数都被分配了一种颜色,因此对图像中的所有像素进行着色而不留下任何黑色。

我的代码如下:

# 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 orginal and blurred grayscale images using filter2D
filtered = cv2.filter2D(gray_noise, cv2.CV_32F, sobel_x)

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

# Compute the orientation of the image
orien = cv2.phase(filtered_blurred_x, filtered_blurred_y, 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)

我的代码在左侧生成输出,而我认为正确的表示是右侧的图像:

我想我错过了将每个像素硬编码为这些颜色之一的东西。

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    您缺少的是幅度的阈值。通过幅度,您可以知道它是否实际上具有任何相关的方向......在某种程度上,它是一种过滤方向,只给出具有强烈响应的方向,在大多数情况下是边缘。

    如果此步骤未完成,那么每个像素至少有 4 种颜色中的一种,我认为这不是您想要的。

    这是一个示例代码来说明我的观点:

    import numpy as np
    import cv2
    
    # reads the image
    img = cv2.imread("lena.png", 0
    
    # sobel derivatives
    derivX = cv2.Sobel(img, cv2.CV_32F, 1, 0)
    derivY = cv2.Sobel(img, cv2.CV_32F, 0, 1)
    
    # orientation and magnitude
    orien = cv2.phase(derivX, derivY, angleInDegrees=True)
    mag = cv2.magnitude(derivX, derivY)
    
    # thresholding of the magnitude values, play with the thresh value adjust it too your liking
    thresh = 50
    _, mask = cv2.threshold(mag, thresh, 255, cv2.THRESH_BINARY)
    
    # I used OpenCV imshow instead of matplotlib, so the colors are in BGR (use yours)
    red = np.array([0, 0, 255])
    cyan = np.array([255, 255, 0])
    green = np.array([0, 255, 0])
    yellow = np.array([0, 255, 255])
    
    # for the same reason I use np.uint8
    image_map = np.zeros((orien.shape[0], orien.shape[1], 3), dtype=np.uint8)
    
    # setting the colors, maybe there is a better way, my numpy skills are rusty
    # it checks that magnitude is above the threshold and that the orientation is in range
    image_map[ (mask == 255) & (orien < 90) ] = red
    image_map[(mask == 255) & (orien > 90) & (orien < 180)] = cyan
    image_map[(mask == 255) & (orien > 180) & (orien < 270)] = green
    image_map[(mask == 255) & (orien > 270)] = yellow
    
    # just for showing it with opencv, replace it with matplotlib if you prefer
    cv2.imshow("frame", image_map)
    cv2.waitKey(0)
    

    结果是:

    【讨论】:

    • 谢谢,这更有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2020-12-14
    • 1970-01-01
    相关资源
    最近更新 更多