通过Sobel运算符,我已经能够确定图像的梯度大小。我在下面显示此:
现在,我想确定梯度方向。为此,我正在关注该帖子,该帖子使用了function 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)
哪个显示图像:
相关分类