1. Canny算法介绍
边缘检测是图像处理中的重要技术之一,可以用于提取图像中目标物体的轮廓信息。Canny算法是一种经典的边缘检测算法,具有很好的边缘保持和抗噪声能力。
Canny算法的基本思想是利用图像中像素值的梯度信息来确定边缘。它的具体步骤如下:
1.1 高斯滤波
在Canny算法中,首先对原始图像进行高斯滤波,目的是平滑图像并减少噪声的影响。高斯滤波是一种线性平滑滤波器,通过将图像中每个像素点的值与周围像素点的值进行加权平均,来实现平滑效果。具体公式如下:
import cv2
import numpy as np
def gaussian_blur(image, kernel_size=5):
return cv2.GaussianBlur(image, (kernel_size, kernel_size), 0)
上述代码中,cv2.GaussianBlur()
函数用于进行高斯滤波,kernel_size
参数指定了滤波器的大小。
1.2 计算梯度幅值和方向
接下来,对经过高斯滤波后的图像进行梯度计算,得到每个像素点的梯度幅值和方向。常用的方法是使用Sobel算子进行卷积运算,计算得到水平方向和垂直方向的梯度。具体代码如下:
def gradient(image):
x_gradient = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
y_gradient = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)
gradient_magnitude = np.sqrt(x_gradient**2 + y_gradient**2)
gradient_direction = np.arctan2(y_gradient, x_gradient)
return gradient_magnitude, gradient_direction
cv2.Sobel()
函数用于计算图像的梯度,ksize
参数指定了Sobel算子的大小。
1.3 非最大抑制
非最大抑制的目的是将梯度图像中的边缘细化,保留像素值最大的边缘点,同时抑制非边缘点。具体步骤如下: