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

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

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

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

相关推荐
廾匸07056 分钟前
《人工智能安全治理框架》1.0版
人工智能·安全
爱敲代码的小崔13 分钟前
深度神经网络
人工智能·深度学习·神经网络
张3蜂1 小时前
人工智能领域的AGI指的是什么?
人工智能·agi
芙蓉姐姐陪你写论文1 小时前
别再为创新点发愁了!ChatGPT助你快速搞定!
大数据·论文阅读·人工智能·chatgpt·ai写作·论文笔记·aipapergpt
96771 小时前
神经网络的线性部分和非线性部分
人工智能·深度学习·神经网络
富士达幸运星2 小时前
模板匹配应用(opencv的妙用)
人工智能·opencv·计算机视觉
安科瑞蒋静2 小时前
介绍 TensorFlow 的基本概念和使用场景
人工智能
Aha_aho2 小时前
【pytorch】keepdim参数解析
人工智能·pytorch·python
AI大模型训练家2 小时前
大模型 LLM(Large Language Models)如今十分火爆,对于初入此领域的新人小白来说,应该如何入门 LLM 呢?是否有值得推荐的入门教程呢?
人工智能·语言模型·自然语言处理·chatgpt·aigc·agi
天润融通2 小时前
AI客服机器人开启企业客户服务新纪元
人工智能·其他·机器人