图像数据处理20

五、边缘检测

5.1基于梯度的边缘检测

5.1.1梯度的基本概念: 在高等数学中,我们都已经对梯度进行了学习,梯度是一个向量,其方向反映了函数在该点变化率最快的方向(即函数沿梯度方向变化最快)。

**5.1.2梯度算子:**梯度算子在图像处理中常用于边缘检测,它通过计算图像中各像素点邻域的灰度值变化来识别图像的边缘。梯度算子的滤波模板可以对图像进行平去噪,进行边缘检测并提供边缘的方向信息。梯度算子的系数可以指定参与计算的像素(将不希望参与特定方向梯度计算的像素点的系数设置为零或接近零的值)还有其的权重大小。通常情况下,梯度算子的滤波器系数之和为零,它确保了梯度算子在恒定灰度区域不会给出错误的边缘检测结果。

5.1.3常见的梯度算子

①Sobel算子

Sobel算子是一种结合了高斯平滑和微分求导运算的离散微分算子。它通过计算图像亮度函数的梯度的近似值来工作。

沿x方向的梯度 沿y方向的梯度

②Prewitt算子

其通过计算像素点邻域的灰度值差分来实现边缘检测,且对噪声具有一定的抑制作用。

③Roberts算子

它是基于交叉差分的梯度算法。Roberts算子通过局部差分来计算检测图像的边缘线条,对具有陡峭边缘且含噪声少的图像效果较好,尤其是边缘处正负45度较多的图像。
标沿对角线方向

沿反对角线方向

Scharr算子

Scharr算子可以看作是Sobel算子的一种优化版本,它在提供更高精度的同时保持了相同的计算速度。

附图与Sobel算子一致

5.1.4:代码与应用实例

python 复制代码
import cv2
import numpy as np

# 读取图像
image = cv2.imread('fu.jpg', cv2.IMREAD_GRAYSCALE)

# 使用Sobel算子进行边缘检测
sobelx = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
sobely = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)

# 计算梯度幅值
gradient_magnitude = np.sqrt(sobelx ** 2 + sobely ** 2)

# 将梯度幅值映射到0-255范围
gradient_magnitude = np.uint8(255 * gradient_magnitude / np.max(gradient_magnitude))

# 将所有图像缩小一半
scale_percent = 40  # 百分比
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
dim = (width, height)

resized_image = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
resized_sobelx = cv2.resize(sobelx, dim, interpolation=cv2.INTER_AREA)
resized_sobely = cv2.resize(sobely, dim, interpolation=cv2.INTER_AREA)
resized_gradient_magnitude = cv2.resize(gradient_magnitude, dim, interpolation=cv2.INTER_AREA)

# 显示结果
cv2.imshow('Original', resized_image)
cv2.imshow('Sobel X', resized_sobelx)
cv2.imshow('Sobel Y', resized_sobely)
cv2.imshow('Gradient Magnitude', resized_gradient_magnitude)

cv2.waitKey(0)
cv2.destroyAllWindows()

sobelx = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)

sobely = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)

①cv2.CV_64F:表示输出图像的深度,这里使用64位浮点数。使用浮点数可以防止在计算梯度幅值时发生溢出。

②1, 0表示计算x方向的一阶导数,0, 1表示计算y方向的一阶导数。

③ksize=3:Sobel算子的大小,这里使用3x3的核。

计算梯度幅值

gradient_magnitude = np.sqrt(sobelx ** 2 + sobely ** 2)

计算平方和的平方根,得到梯度幅值

注:本人为在校学生,博客是边学边写的,主要是为了巩固知识,如有错误请积极指正。

本文的内容主要基于我对张运楚教授编著的《数字图像处理》一书的学习和理解。这本书深入浅出地介绍了数字图像处理的基本理论以及经典算法等,并且提供了丰富的示例代码和实际用例,极大地帮助了我学习图像处理知识。在此,我推荐大家阅读这本书,更加深入的学习有关图像处理的知识。

相关推荐
战族狼魂29 分钟前
GPT-5.6与Grok 4.5重磅发布
人工智能·算法·大模型·大语言模型
m沐沐1 小时前
【深度学习】dlib 人脸关键点检测
人工智能·深度学习·opencv·计算机视觉·pycharm·人脸识别·关键点检测
happyprince1 小时前
2026年07月09日全球AI前沿动态
人工智能
ACP广源盛139246256731 小时前
IX8024 PCIe4.0 交换芯片@ACP# RK3588:嵌入式 AI PC 标准化扩展方案
大数据·人工智能·分布式·单片机·嵌入式硬件
研究员子楚1 小时前
GEO行业发展标准体系白皮书V2.0-第09卷 · 适配篇:硅基主权伦理宪章与行业适配宣言
数据库·人工智能·geo
明哥聊AI1 小时前
测试时计算与推理模型深度解析:从o1到o3到DeepSeek-R1的技术演进(2026最新)
人工智能
广州灵眸科技有限公司2 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
梦想三三2 小时前
Git与GitHub基础入门:从零开始掌握版本控制与代码托管(完整图文教程)
人工智能·git·elasticsearch·github
xd1855785552 小时前
敲门砖工坊-求职信定制的HarmonyOS开发实践
人工智能·华为·harmonyos·鸿蒙