💌 所属专栏:【数字图像处理笔记】
😀 作 者:我是夜阑的狗🐶
🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询!
💖 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信 😘 😘 😘
您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!🤩 🤩 🤩
前言
大家好,又见面了,我是夜阑的狗🐶,本文是专栏【数字图像处理笔记】专栏的第4篇文章;
这是今天学习到数字图像处理笔记 – Matlab实现微分法图像锐化 罗伯特(Roberts)-索贝尔(Sobel)-普瑞维特(Prewitt)-拉普拉斯(Laplace)算子 💖💖💖,开启新的征程,记录最美好的时刻🎉,每天进步一点点。
专栏地址:【数字图像处理笔记】 , 此专栏是我是夜阑的狗对数字图像处理学习过程的总结,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
一、原理
在图像锐化中,最常用的微分法采用梯度的概念来实现。设有一幅图像 f ( x , y ) f(x,y) f(x,y),它的梯度采用数学概念描述,是一个向量,定义为
G [ f ( x , y ) ] = [ ∂ f ∂ x ∂ f ∂ y ] T G[f(x,y)]=\begin{bmatrix} \frac {\partial f} {\partial x} \frac {\partial f} {\partial y} \end{bmatrix}^T G[f(x,y)]=[∂x∂f∂y∂f]T
该梯度向量的模为
∣
G
[
f
(
x
,
y
)
]
∣
=
[
(
∂
f
∂
x
)
2
+
(
∂
f
∂
y
)
2
]
1
/
2
(4-1)
\tag{4-1}\begin{vmatrix}G[f(x,y)]\end{vmatrix}=\begin{bmatrix} \bigg( \frac {\partial f} {\partial x}\bigg)^2 + \bigg( \frac {\partial f} {\partial y}\bigg)^2 \end{bmatrix}^{1/2}
G[f(x,y)]
=[(∂x∂f)2+(∂y∂f)2]1/2(4-1)
数字图像处理中,把
(
4
−
36
)
)
(4-36))
(4−36))式所表示的值,
∣
G
[
f
(
x
,
y
)
]
∣
\begin{vmatrix}G[f(x,y)]\end{vmatrix}
G[f(x,y)]
称为图像
f
(
x
,
y
)
f(x,y)
f(x,y)的梯度,它是
x
x
x,
y
y
y的函数,因而实际上是图像
f
(
x
,
y
)
f(x,y)
f(x,y)的梯度图像。
对于数字图像
f
(
x
,
y
)
f(x,y)
f(x,y)来讲,微分∂f/∂x
和 ∂f/∂y
只能用差分来近似。
(
4
-
1
)
(4-1)
(4-1)式按差分运算近似以后的梯度表达式为
∣ G [ f ( x , y ) ] ∣ = { [ f ( x + y ) − f ( x + 1 , y ) ] 2 + [ f ( x , y ) − f ( x , y + 1 ) 2 ] } 1 / 2 (4-2) \tag{4-2} \begin{vmatrix}G[f(x,y)]\end{vmatrix}= \{[f(x+y)-f(x+1,y)]^2+[f(x,y)-f(x,y+1)^2] \}^{1/2} G[f(x,y)] ={[f(x+y)−f(x+1,y)]2+[f(x,y)−f(x,y+1)2]}1/2(4-2)
另一种常用的梯度称为 Roberts
梯度,定义为
∣ G [ f ( x , y ) ] ∣ = { [ f ( x + y ) − f ( x + 1 , y + 1 ) ] 2 + [ f ( x + 1 , y ) − f ( x , y + 1 ) 2 ] } 1 / 2 (4-3) \tag{4-3} \begin{vmatrix}G[f(x,y)]\end{vmatrix}= \{[f(x+y)-f(x+1,y+1)]^2+[f(x+1,y)-f(x,y+1)^2] \}^{1/2} G[f(x,y)] ={[f(x+y)−f(x+1,y+1)]2+[f(x+1,y)−f(x,y+1)2]}1/2(4-3)
利用 ( 4 — 37 ) (4—37) (4—37)和 ( 4 - 38 ) (4-38) (4-38)式计算梯度时,计算量较大,为节省计算机计算时间,在计算精度允许的情况,可采用绝对差算法。对应 ( 4 — 37 ) (4—37) (4—37)式和 ( 4 — 38 ) (4—38) (4—38)式的绝对差算法为
∣ G [ f ( x , y ) ] ∣ = ∣ f ( x , y ) − f ( x + 1 , y ) ∣ + ∣ f ( x , y ) − f ( x , y + 1 ) ∣ (4-4) \tag{4-4} \begin{vmatrix}G[f(x,y)]\end{vmatrix}= \begin{vmatrix}f(x,y) - f(x+1,y)\end{vmatrix} + \begin{vmatrix} f(x,y)-f(x,y+1)\end{vmatrix} G[f(x,y)] = f(x,y)−f(x+1,y) + f(x,y)−f(x,y+1) (4-4)
∣ G [ f ( x , y ) ] ∣ = ∣ f ( x , y ) − f ( x + 1 , y + 1 ) ∣ + ∣ f ( x + 1 , y ) − f ( x , y + 1 ) ∣ (4-4) \tag{4-4} \begin{vmatrix}G[f(x,y)]\end{vmatrix}= \begin{vmatrix}f(x,y) - f(x+1,y+1)\end{vmatrix} + \begin{vmatrix} f(x+1,y)-f(x,y+1)\end{vmatrix} G[f(x,y)] = f(x,y)−f(x+1,y+1) + f(x+1,y)−f(x,y+1) (4-4)
二、实现过程
1、罗伯特算子(Roberts)
代码:
%不同算子边缘检测具体函数实现:
%罗伯特算子
function [edge]= RobertsOperator(pic)
edge = zeros(size(pic));
h = size(pic, 1); %获取图像的高
w = size(pic, 2); %获取图像的宽
for i = 1 : h - 1
for j = 1 : w - 1
edge(i, j) =abs(pic(i, j) - pic(i + 1, j + 1)) + abs(pic(i, j + 1) - pic(i + 1, j));
end
end
end
罗伯特算子函数核心源码分析:
function [edge]= RobertsOperator(pic)
edge = zeros(size(pic));%初始化边缘矩阵
h = size(pic, 1); %图片行数
w = size(pic, 2);%图片列数
%利用局部差分计算梯度算子,即对角方向相邻两像素值之差。
for i = 1 : h - 1
for j = 1 : w - 1
edge(i, j) =abs(pic(i, j) - pic(i + 1, j + 1)) + abs(pic(i, j + 1) - pic(i + 1, j));
end
end
end
2、索贝尔算子(Sobel)
代码:
%索贝尔算子
function [edge] = SobelOperator(pic)
edge = zeros(size(pic));
h = size(pic, 1); %获取图像的高
w = size(pic, 2); %获取图像的宽
gx = [-1, -2, -1; 0, 0, 0; 1, 2, 1]; %索贝尔模板
gy = gx';
for i = 2 : h - 1
for j = 2 : w - 1
sub = double(pic(i - 1 : i + 1, j - 1 : j + 1));
g1 = abs(sum(sum(sub .* gx)));
g2 = abs(sum(sum(sub .* gy)));
if g1 > g2
edge(i, j) = g1;
else
edge(i, j) = g2;
end
end
end
end
3、普瑞维特算子(Prewitt)
代码:
function [edge] = PrewittOperator(pic)
edge = zeros(size(pic));
h = size(pic, 1); %获取图像的高
w = size(pic, 2); %获取图像的宽
gx = [-1, -1, -1; 0, 0, 0; 1, 1, 1]; %普瑞维特模板
gy = gx';
for i = 2 : h - 1
for j = 2 : w - 1
sub = double(pic(i - 1 : i + 1, j - 1 : j + 1));
g1 = abs(sum(sum(sub .* gx)));
g2 = abs(sum(sum(sub .* gy)));
if g1 > g2
edge(i, j) = g1;
else
edge(i, j) = g2;
end
end
end
end
4、拉普拉斯算子(Laplace)
代码:
function [edge] = LaplaceOperator(pic)
edge =zeros(size(pic));
h = size(pic, 1); %获取图像的高
w = size(pic, 2); %获取图像的宽
l = [0, 1, 0; 1, -4, 1; 0, 1, 0]; %拉普拉斯模板
for i = 2 : h - 1
for j = 2 : w - 1
sub = double(pic(i - 1 : i + 1, j - 1 : j + 1));
d = sum(sum(sub .*l));
edge(i, j) =d;
end
end
end
拉普拉斯算子函数核心源码分析:
function [edge] = LaplaceOperator(pic)
edge =zeros(size(pic)); %初始化边缘矩阵
h = size(pic, 1); %图片行数
w = size(pic, 2); %图片列数
l = [0, 1, 0; 1, -4, 1; 0, 1, 0];% 拉普拉斯算子模板矩阵
for i = 2 : h - 1
for j = 2 : w - 1
sub = double(pic(i - 1 : i + 1, j - 1 : j + 1));
d = sum(sum(sub .*l));%卷积求和运算
edge(i, j) =d;%更新边缘矩阵
end
end
end
运行结果如下图所示:
从图中可以看出,不同的梯度算子对原图像进行边缘提取的效果不同。其中,
- 罗伯特算子:采用的是对角方向相邻像素值之差,定位比较精准。
- 索贝尔算子:对灰度渐变和噪声较多的图像处理效果较好,采用的是加权平均再进行微分运算的方法。
- 普瑞维特算子:利用局部差分平均方法寻找边缘,效果和索贝尔算子接近。
- 拉普拉斯算子:一种二阶导数算子,对噪声更敏感,能对任何走向的界线和线条进行锐化,无方向性。
因此一般用于判断边缘像素相对图像的明暗程度,不直接用于边缘检测。
总结
感谢观看,如果觉得有帮助,请给文章点个赞吧,让更多的人看到。🌹 🌹 🌹
也欢迎你,关注我。👍 👍 👍
原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!!💕 💕 💕 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!下期再见。🎉
更多专栏订阅:
- 😀 【LeetCode题解(持续更新中)】
- 🌼 【鸿蒙系统】
- 👑 【Python脚本笔记】
- 🚝 【Java Web项目构建过程】
- 💛 【微信小程序开发教程】
- ⚽ 【JavaScript随手笔记】
- 🤩 【大数据学习笔记(华为云)】
- 🦄 【程序错误解决方法(建议收藏)】
- 🚀 【软件安装教程】
订阅更多,你们将会看到更多的优质内容!!