图像数据处理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)

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

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

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

相关推荐
hairenjing1123几秒前
在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序
android·人工智能·windows·macos·智能手机
小蜗子5 分钟前
Multi‐modal knowledge graph inference via media convergenceand logic rule
人工智能·知识图谱
SpikeKing17 分钟前
LLM - 使用 LLaMA-Factory 微调大模型 环境配置与训练推理 教程 (1)
人工智能·llm·大语言模型·llama·环境配置·llamafactory·训练框架
黄焖鸡能干四碗1 小时前
信息化运维方案,实施方案,开发方案,信息中心安全运维资料(软件资料word)
大数据·人工智能·软件需求·设计规范·规格说明书
1 小时前
开源竞争-数据驱动成长-11/05-大专生的思考
人工智能·笔记·学习·算法·机器学习
ctrey_1 小时前
2024-11-4 学习人工智能的Day21 openCV(3)
人工智能·opencv·学习
攻城狮_Dream1 小时前
“探索未来医疗:生成式人工智能在医疗领域的革命性应用“
人工智能·设计·医疗·毕业
学习前端的小z2 小时前
【AIGC】如何通过ChatGPT轻松制作个性化GPTs应用
人工智能·chatgpt·aigc
埃菲尔铁塔_CV算法2 小时前
人工智能图像算法:开启视觉新时代的钥匙
人工智能·算法
EasyCVR2 小时前
EHOME视频平台EasyCVR视频融合平台使用OBS进行RTMP推流,WebRTC播放出现抖动、卡顿如何解决?
人工智能·算法·ffmpeg·音视频·webrtc·监控视频接入