不愧是腾讯,边缘检测问的巨深入。。。


hello,我是kk~
这几天有同学在腾讯的面试中,遇到一个问题,是关于边缘检测算法。
面试官让围绕Sobel、Prewitt、Canny,以及使用情况,简单的聊聊。大家觉得这个问题怎么样
咱们今天详细聊聊边缘检测算法,如Sobel、Prewitt、Canny 这个问题。
下面,逐步详解边缘检测算法,包括Sobel、Prewitt、和Canny算法的原理实现过程等等~
Sobel算法
Sobel算法是一种基于卷积的边缘检测方法,通过计算图像的梯度来检测边缘。它使用两个卷积核,一个用于水平方向,另一个用于垂直方向。
对于水平方向的Sobel核:
对于垂直方向的Sobel核:
最终梯度图像:
代码案例
import cv2import numpy as npimport matplotlib.pyplot as plt# 读取图像img = cv2.imread("lenna.jpg", cv2.IMREAD_GRAYSCALE)# Sobel滤波sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)# 计算梯度幅值gradient_magnitude = np.sqrt(sobel_x**2 + sobel_y**2)# 绘制图像plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray'), plt.title('Original Image')plt.subplot(2, 2, 2), plt.imshow(sobel_x, cmap='gray'), plt.title('Sobel X')plt.subplot(2, 2, 3), plt.imshow(sobel_y, cmap='gray'), plt.title('Sobel Y')plt.subplot(2, 2, 4), plt.imshow(gradient_magnitude, cmap='gray'), plt.title('Gradient Magnitude')plt.show()

Prewitt算法
Prewitt算法也是一种基于卷积的边缘检测方法,与Sobel类似,但使用不同的卷积核。
对于水平方向的Prewitt核:
对于垂直方向的Prewitt核:
最终梯度图像:
Python代码和图形:
# 使用cv2.filter2D函数应用Prewitt卷积核prewitt_x = cv2.filter2D(img, cv2.CV_64F, kernel=np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]]))prewitt_y = cv2.filter2D(img, cv2.CV_64F, kernel=np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]]))# 计算梯度幅值gradient_magnitude_prewitt = np.sqrt(prewitt_x**2 + prewitt_y**2)# 绘制图像plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray'), plt.title('Original Image')plt.subplot(2, 2, 2), plt.imshow(prewitt_x, cmap='gray'), plt.title('Prewitt X')plt.subplot(2, 2, 3), plt.imshow(prewitt_y, cmap='gray'), plt.title('Prewitt Y')plt.subplot(2, 2, 4), plt.imshow(gradient_magnitude_prewitt, cmap='gray'), plt.title('Gradient Magnitude (Prewitt)')plt.show()
Canny算法
原理:
Canny算法是一种多阶段的边缘检测算法,包括高斯滤波、梯度计算、非极大值抑制、双阈值边缘跟踪等步骤。
核心公式:
高斯滤波: 
梯度计算: 
 
非极大值抑制: 在梯度方向上,只保留局部最大值。
双阈值边缘跟踪: 利用高阈值和低阈值对图像进行分割,形成强边缘和弱边缘。
Python代码和图形:
# Canny边缘检测canny_edges = cv2.Canny(img, 50, 150)# 绘制图像plt.subplot(1, 2, 1), plt.imshow(img, cmap='gray'), plt.title('Original Image')plt.subplot(1, 2, 2), plt.imshow(canny_edges, cmap='gray'), plt.title('Canny Edges')plt.show()

Sobel和Prewitt是基于卷积的边缘检测算法,通过计算图像梯度来寻找
边缘。
Canny算法是一种多阶段的边缘检测方法,包括高斯滤波、梯度计算、非极大值抑制和双阈值边缘跟踪。
每种算法都有其特定的核心公式和实现步骤,用于检测图像中的边缘。
在实际应用中,根据具体需求和图像特点选择合适的边缘检测算法。
关注我们,分享更新算法内容
▽▽▽
推荐阅读
不愧是微软,巨深入
不愧是京东,面试超开心
拼多多,目前薪资天花板
到顶部