一、边缘检测算子
梯度算子
1、Roberts 算子
import cv2
import numpy as np
import matplotlib.pyplot as plt
image = cv2.imread("../images/1.png", cv2.IMREAD_GRAYSCALE)
# 1.定义 Roberts 算子的卷积核
roberts_x = np.array([[1, 0], [0, -1]], dtype=np.float32)
roberts_y = np.array([[0, 1], [-1, 0]], dtype=np.float32)
# 2.二维卷积操作
# 使用 filter2D 函数应用 Roberts 算子卷积核
gradient_x = cv2.filter2D(image, cv2.CV_64F, roberts_x)
gradient_y = cv2.filter2D(image, cv2.CV_64F, roberts_y)
# 3.计算梯度幅值
gradient_magnitude = np.sqrt(gradient_x**2 + gradient_y**2)
# 转换结果为8位图像
gradient_magnitude = np.uint8(gradient_magnitude)
# 显示原图、Roberts算子的结果和应用结果
plt.subplot(1, 4, 1)
plt.imshow(image, cmap='gray')
plt.title("Original Image")
plt.axis("off")
plt.subplot(1, 4, 2)
plt.imshow(gradient_x, cmap='gray')
plt.title("Roberts X")
plt.axis("off")
plt.subplot(1, 4, 3)
plt.imshow(gradient_y, cmap='gray')
plt.title("Roberts Y")
plt.axis("off")
plt.subplot(1, 4, 4)
plt.imshow(gradient_magnitude, cmap='gray')
plt.title("Magnitude")
plt.axis("off")
plt.show()
2、Prewitt 算子
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
img = cv2.imread("../images/1.png", cv2.IMREAD_GRAYSCALE)
# 1.使用Prewitt算子
kernelx = np.array([[1, 0, -1], [1, 0, -1], [1, 0, -1]], dtype=int)
kernely = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=int)
# 2.卷积
gradient_x = cv2.filter2D(img, cv2.CV_64F, kernelx)
gradient_y = cv2.filter2D(img, cv2.CV_64F, kernely)
# 3
# 计算梯度幅值
gradient_magnitude = np.sqrt(gradient_x**2 + gradient_y**2)
# 转换结果为8位图像
gradient_magnitude = np.uint8(gradient_magnitude)
# 显示原图、水平梯度、垂直梯度、Prewitt算子的结果
plt.subplot(141), plt.imshow(img, cmap='gray'), plt.title('Original Image'), plt.axis('off')
plt.subplot(142), plt.imshow(gradient_x, cmap='gray'), plt.title('X'), plt.axis('off')
plt.subplot(143), plt.imshow(gradient_y, cmap='gray'), plt.title('Y'), plt.axis('off')
plt.subplot(144), plt.imshow(gradient_magnitude, cmap='gray'), plt.title('Prewitt Operator'), plt.axis('off')
plt.show()
3、Laplace
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
image = cv2.imread('../images/1.png', cv2.IMREAD_GRAYSCALE)
# 高斯滤波降噪
gaussian = cv2.GaussianBlur(image, (5, 5), 0)
# 使用Canny算子进行边缘检测
edges = cv2.Canny(gaussian, 50, 150) # 50和150是Canny算子的两个阈值,可调整
# 显示原始图像和边缘检测结果
plt.subplot(121), plt.imshow(image, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(edges, cmap='gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()
5、四种算子的比较
二、角点检测
1.Moravec
注:权重函数当像素位置 (x,y) 位于滑动窗口内时,权重函数为1,否则为0。