深圳的网站,手游源码资源网,快手刷作品双击自助网站,如何百度收录我的网站图像的边缘简单来说就是图像中灰度不连续的地方。
1.图像梯度
图像梯度是指图像像素灰度值在某个方向上的变化#xff1b;图像梯度是图像的一阶导数#xff0c;实际计算时可以使用差分来近似。
1.1 什么是图像梯度#xff1f;
图像梯度是一种数学工具#xff0c;用于描…图像的边缘简单来说就是图像中灰度不连续的地方。
1.图像梯度
图像梯度是指图像像素灰度值在某个方向上的变化图像梯度是图像的一阶导数实际计算时可以使用差分来近似。
1.1 什么是图像梯度
图像梯度是一种数学工具用于描述图像中像素值变化的速度和方向。换句话说它反映了图像亮度值在空间上的变化率因此是边缘检测、特征提取和图像分析中常用的重要概念。
1.1.1 图像梯度的定义
给定一幅二维灰度图像 I ( x , y ) I(x, y) I(x,y)它的梯度是一个向量定义如下 ∇ I ( ∂ I ∂ x , ∂ I ∂ y ) \nabla I \left( \frac{\partial I}{\partial x}, \frac{\partial I}{\partial y} \right) ∇I(∂x∂I,∂y∂I) ( ∂ I ∂ x ) ( \frac{\partial I}{\partial x} ) (∂x∂I)图像在 x x x-方向上的变化率水平梯度。 ( ∂ I ∂ y ) ( \frac{\partial I}{\partial y} ) (∂y∂I)图像在 y y y-方向上的变化率垂直梯度。
梯度的大小和方向定义如下
梯度大小Gradient Magnitude ∣ ∇ I ∣ ( ∂ I ∂ x ) 2 ( ∂ I ∂ y ) 2 |\nabla I| \sqrt{\left( \frac{\partial I}{\partial x} \right)^2 \left( \frac{\partial I}{\partial y} \right)^2} ∣∇I∣(∂x∂I)2(∂y∂I)2 梯度方向Gradient Direction θ arctan ( ∂ I ∂ y ∂ I ∂ x ) \theta \arctan\left(\frac{\frac{\partial I}{\partial y}}{\frac{\partial I}{\partial x}}\right) θarctan(∂x∂I∂y∂I)
1.1.2 如何计算图像梯度
在离散图像中梯度的计算通常使用滤波器卷积核近似求导数。以下是常见方法
1. 基本差分Finite Difference
利用相邻像素值的差分近似求导数 ( ∂ I ∂ x ≈ I ( x 1 , y ) − I ( x , y ) ) ( \frac{\partial I}{\partial x} \approx I(x1, y) - I(x, y) ) (∂x∂I≈I(x1,y)−I(x,y)) ( ∂ I ∂ y ≈ I ( x , y 1 ) − I ( x , y ) ) ( \frac{\partial I}{\partial y} \approx I(x, y1) - I(x, y) ) (∂y∂I≈I(x,y1)−I(x,y))
2. Sobel算子
Sobel算子是一种常用的离散梯度滤波器使用以下卷积核
水平梯度核 G x G_x Gx [ − 1 0 1 − 2 0 2 − 1 0 1 ] \begin{bmatrix} -1 0 1 \\ -2 0 2 \\ -1 0 1 \end{bmatrix} −1−2−1000121 垂直梯度核 G y G_y Gy [ − 1 − 2 − 1 0 0 0 1 2 1 ] \begin{bmatrix} -1 -2 -1 \\ 0 0 0 \\ 1 2 1 \end{bmatrix} −101−202−101
使用 Sobel 算子计算出的梯度既平滑了噪声又能准确提取边缘。
3. Scharr算子
Scharr算子是 Sobel 算子的改进版能更好地处理图像细节。它的权值分布更均匀适合高精度梯度计算。
4. 拉普拉斯算子
拉普拉斯算子计算的是二阶导数用于检测图像的变化区域而不是简单的一阶变化。
1.2 梯度的计算示例
import cv2 as cv
import numpy as np# 加载图像
img cv.imread(example.jpg, cv.IMREAD_GRAYSCALE)# 计算水平和垂直梯度
grad_x cv.Sobel(img, cv.CV_64F, 1, 0, ksize3) # 水平梯度
grad_y cv.Sobel(img, cv.CV_64F, 0, 1, ksize3) # 垂直梯度# 计算梯度大小
magnitude cv.magnitude(grad_x, grad_y)# 显示结果
cv.imshow(Original, img)
cv.imshow(Gradient X, cv.convertScaleAbs(grad_x))
cv.imshow(Gradient Y, cv.convertScaleAbs(grad_y))
cv.imshow(Gradient Magnitude, cv.convertScaleAbs(magnitude))
cv.waitKey(0)
cv.destroyAllWindows()1.3 梯度的应用
边缘检测 梯度强度大的地方往往是图像边缘结合阈值可以提取轮廓如 Canny 边缘检测。 特征提取 梯度方向是许多特征描述符如 SIFT、HOG的基础。 图像增强 利用梯度信息可以增强图像的边缘或细节。 运动检测 梯度变化在时间序列中的对比可以用来检测运动或变化区域。
2.Canny边缘检测
Canny边缘检测是一种经典的多步骤边缘检测算法由 John F. Canny 在 1986 年提出。它以鲁棒性、高准确性和抗噪性著称广泛用于图像处理和计算机视觉任务中。
2.1 算法步骤
Canny 边缘检测分为以下几个步骤
1. 噪声抑制平滑处理 目标减少噪声对边缘检测的影响。 方法对图像进行高斯模糊。 高斯模糊会平滑图像中的细节和噪声同时保留大的结构边缘。 公式高斯滤波器 G ( x , y ) 1 2 π σ 2 e − x 2 y 2 2 σ 2 G(x, y) \frac{1}{2\pi\sigma^2} e^{-\frac{x^2 y^2}{2\sigma^2}} G(x,y)2πσ21e−2σ2x2y2 其中 σ \sigma σ 决定平滑程度模糊核的标准差。
2. 计算图像梯度 目标找出图像中的边缘即像素值变化剧烈的区域。 方法使用 Sobel 算子计算水平梯度 ( G x G_x Gx) 和垂直梯度 ( G y G_y Gy)然后计算梯度的大小和方向。 梯度大小强度计算公式 ∣ G ∣ G x 2 G y 2 |G| \sqrt{G_x^2 G_y^2} ∣G∣Gx2Gy2 梯度方向计算公式 θ arctan ( G y G x ) \theta \arctan\left(\frac{G_y}{G_x}\right) θarctan(GxGy) 梯度强度大的地方可能是边缘。梯度方向用于后续的非极大值抑制。
3. 非极大值抑制Non-Maximum Suppression 目标精确定位边缘去除非边缘的噪声响应。 方法 在梯度方向上检查当前像素值是否为局部极大值。如果不是局部极大值则将该像素设为 0非边缘。 操作 将梯度方向分为四个主方向0°、45°、90°、135°。比较当前像素与梯度方向上相邻两个像素的大小。
4. 双阈值边缘检测
目标区分强边缘、弱边缘和非边缘。方法 设置两个阈值高阈值 ( T h i g h T_{high} Thigh) 和低阈值 ( T l o w T_{low} Tlow)。对梯度强度进行分类 强边缘梯度强度 T h i g h T_{high} Thigh。弱边缘 T l o w 梯度强度 ≤ T h i g h T_{low} \text{梯度强度} \leq T_{high} Tlow梯度强度≤Thigh。非边缘梯度强度 l e q T l o w leq T_{low} leqTlow。
5. 边缘连接Hysteresis Thresholding
目标确定最终的边缘。方法 强边缘直接保留。弱边缘若与强边缘相连则保留为边缘否则丢弃。
2.2 Canny 边缘检测的代码实现
import cv2 as cv
import numpy as np# 加载图像灰度模式
img cv.imread(example.jpg, cv.IMREAD_GRAYSCALE)# Canny 边缘检测
edges cv.Canny(img, threshold150, threshold2150)# 显示结果
cv.imshow(Original Image, img)
cv.imshow(Canny Edges, edges)
cv.waitKey(0)
cv.destroyAllWindows()2.3 Canny 函数参数详解
cv.Canny(image, threshold1, threshold2, apertureSize3, L2gradientFalse)image输入图像必须为灰度图像。threshold1低阈值用于区分弱边缘和非边缘。threshold2高阈值用于区分强边缘和弱边缘。apertureSizeSobel 算子的核大小默认为 3。常用值3、5、7。L2gradient布尔值是否使用更精确的梯度计算默认为 False。 如果为 True则使用 L2 范数 G x 2 G y 2 \sqrt{G_x^2 G_y^2} Gx2Gy2 。如果为 False则使用 L1 范数 ∣ G x ∣ ∣ G y ∣ |G_x| |G_y| ∣Gx∣∣Gy∣。
2.4 Canny 边缘检测的优点
鲁棒性可以很好地抵抗噪声适用于复杂场景。多步骤处理包括平滑、梯度计算和非极大值抑制结果更加精确。边缘连接通过双阈值和滞后连接有效去除了孤立的边缘点。
2.5 Canny 边缘检测的缺点
参数敏感双阈值的选择对结果影响很大需要手动调整。计算成本高多步骤处理增加了算法复杂度不适合实时性要求高的应用。
2.6 应用场景
边缘检测 图像分割前的边缘提取。 特征提取 用于形状识别或物体检测。 运动检测 对帧差图像进行边缘检测以识别移动物体的轮廓。