二阶导数算子——坎尼算子

坎尼算子

在这里插入图片描述

(1)用高斯滤波器平滑图像以减轻噪声影响

a)滤波器模板的尺寸可随尺度不同而改变,大的模板会使图像更模糊,不过可以检测出数量较少但更为突出的边缘;

(2)检测滤波图像中灰度梯度的大小和方向

b)为梯度的幅度图;

(3)细化借助梯度检测得到的边缘像素构成的边界

c)考虑梯度幅值的小邻域(如3*3模板),在其中比较中心像素与梯度方向上的相邻像素实现,若中心不大于沿梯度方向的相邻像素,将其置零,否则作为局部最大保留;

(4)选取两个阈值(高低阈值)并借助滞后阈值化方法确定边缘点

d)首先标记梯度大于高阈值的边缘像2素,然后再对这些相连的像素低阈值(认为梯度大于低阈值、且与大于高阈值像素邻接的像素也是边缘像素;这样可以避免阈值过低产生的虚假边缘和过高产生的边缘丢失。

坎尼算子(Canny Edge Detection)是一种广泛用于图像边缘检测的经典算法,它由John F. Canny于1986年提出。这个过程可以分为以下几个步骤: 1. **高斯滤波**:首先对输入图像应用高斯滤波器,这有助于平滑图像,减少噪声,并准备后续计算。 ```python import cv2 import numpy as np # 高斯核大小可以根据需要调整 kernel_size = 5 blur = cv2.GaussianBlur(image, (kernel_size, kernel_size), 0) ``` 2. **计算梯度幅值和方向**:通过x和y方向的一阶导数计算出每个像素点的梯度强度(幅值)和方向。这里通常使用Sobel算子或者Prewitt算子。 ```python sobel_x = cv2.Sobel(blur, cv2.CV_64F, 1, 0, ksize=kernel_size) sobel_y = cv2.Sobel(blur, cv2.CV_64F, 0, 1, ksize=kernel_size) gradient_magnitude = np.sqrt(sobel_x**2 + sobel_y**2) gradient_angle = np.arctan2(sobel_y, sobel_x) ``` 3. **非极大值抑制**:沿着梯度方向,保留局部极值点(即最大值和最小值),消除其他像素,得到更精确的边缘候选。 ```python grad_mag = gradient_magnitude _, edges = cv2.threshold(grad_mag, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU) # 按阈值分割 aperture_size = 3 edges = cv2.Canny(edges, aperture_size * 3, aperture_size * 5) # 第一阈值,第二阈值 ``` 4. **双阈值策略**:最后,使用两个阈值(低阈值和高阈值)来确定边缘。对于小于低阈值的区域,标记为“不确定”;大于高阈值的区域保持原样,其余介于两者之间的区域细化处理,形成最终的边缘。 ```python low_threshold, high_threshold = ... # 根据应用场景自定阈值 edges = cv2.dilate(edges, None) # 稍微膨胀边缘,连接附近的边缘点 edges = cv2.erode(edges, None) # 再次收缩,去除细小的断裂 final_edges = np.zeros_like(edges) final_edges[edges > high_threshold] = 255 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值