MATLAB-梯度Roberts算子、拉普拉斯算子、Sobel算子、Prewitt算子对图像进行锐化

MATLAB-梯度Roberts算子、拉普拉斯算子、Sobel算子、Prewitt算子对图像进行锐化1.锐化1.锐化(Sharpening):图像在传输或变换过程中(如未聚焦好)、受到各种干扰而退化,典型的是图像模糊,而图像的判读和识别中,常需突出目标的轮廓或边缘信息。2.边缘锐化:主要增强图像的轮廓边缘、细节(灰度跳变部分灰度跳变部分),以突出图像中景物的边缘或纹理,形成完整的物体边界,使边缘和轮廓模糊的图像清晰,又叫空域高通滤波(俗称为勾边处理)。从数学角度看,图像模糊相当于图像………

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

? 博客首页:安静到无声

⛳️ 欢迎关注 ❤️ 点赞 ? 收藏 ✏️ 留言

? 系列专栏:Verilog学习

?由于HDLBits刷题并不方便,在这里给大家强烈推荐一款嵌入式硬件模拟面试、刷题神器——牛客网( [ VerilogC等基础更有一些硬件知识点拨

❤️ 点击免费注册和我一起刷题吧

在这里插入图片描述

1. 锐化

1.锐化(Sharpening) :图像在传输或变换过程中(如未聚焦好)、受到各种干扰而退化,典型的是图像模糊,而图像的判读和识别中,常需突出目标的轮廓或边缘信息。
2.边缘锐化:主要增强图像的轮廓边缘、细节( 灰度跳变部分),以突出图像中景物的边缘或纹理,形成完整的物体边界,使边缘和轮廓模糊的图像清晰,又叫空域高通滤波(俗称为勾边处理)。
从数学角度看,图像模糊相当于图像被平均或者积分,为实现图像的锐化,我们需要运用它的反运算“微分”——加强高频分量,实现轮廓清晰。

2. 梯度运算

设图像 f ( x , y ) f(x,y) f(x,y)为定义在点 ( x , y ) (x,y) (x,y)的梯度矢量为 G [ f ( x , y ) ] G[f(x,y)] G[f(x,y)]
G [ f ( x , y ) ] = [ ∂ f ∂ x ∂ f ∂ y ] = [ ∂ f ∂ x ∂ f ∂ y ] ⊤ = ∇ f ( x , y ) \mathbf{G}[f(x, y)]=\left[\begin{array}{c} \frac{\partial f}{\partial x} \\ \frac{\partial f}{\partial y} \end{array}\right]=\left[\frac{\partial f}{\partial x} \frac{\partial f}{\partial y}\right]^{\top}=\nabla f(x, y) G[f(x,y)]=[xfyf]=[xfyf]=f(x,y)
性质:

  1. 梯度的方向是在 f ( x , y ) f(x,y) f(x,y)的最大变化率方向
  2. 梯度的幅度用 G [ f ( x , y ) ] G[f(x,y)] G[f(x,y)]表示:

G [ f ( x , y ) ] = [ ( ∂ f ∂ x ) 2 + ( ∂ f ∂ y ) 2 ] 1 / 2 G[f(x, y)]=\left[\left(\frac{\partial f}{\partial x}\right)^{2}+\left(\frac{\partial f}{\partial y}\right)^{2}\right]^{1 / 2} G[f(x,y)]=[(xf)2+(yf)2]1/2
对于数字图像来说,梯度的求解从求偏导变成了相减
G [ f ( x , y ) ] = { [ f ( i , j ) − f ( i + 1 , j ) ] 2 + [ f ( i , j ) − f ( i , j + 1 ) ] 2 } 1 / 2 G[f(x, y)]=\left\{[f(i, j)-f(i+1, j)]^{2}+[f(i, j)-f(i, j+1)]^{2}\right\}^{1 / 2} G[f(x,y)]={
[f(i,j)f(i+1,j)]2+[f(i,j)f(i,j+1)]2}
1/2

简化为 G [ f ( x , y ) ] ≈ ∣ f ( i , j ) − f ( i + 1 , j ) ∣ + ∣ f ( i , j ) − f ( i , j + 1 ) ∣ G[f(x, y)] \approx|f(i, j)-f(i+1, j)|+|f(i, j)-f(i, j+1)| G[f(x,y)]f(i,j)f(i+1,j)+f(i,j)f(i,j+1)

3. 边缘检测的分类

(1)一阶导数的边缘算子
通过模板作为核与图像的每个像素点做卷积和运算,然后选取合适的阈值来提取图像的边缘。常见的有Roberts算子、Sobel算子和Prewitt算子。
(2)二阶导数的边缘算子
依据于二阶导数过零点,常见的有Laplacian 算子,此类算子对噪声敏感。
(3)其他边缘算子
前面两类均是通过微分算子来检测图像边缘,还有一种就是Canny算子,其是在满足一定约束条件下推导出来的边缘检测最优化算子。

4. Roberts算子

对于第二节所讲的数字梯度运算,我们将其公式改变为 G [ f ( x , y ) ] ≈ ∣ f ( i , j ) − f ( i + 1 , j + 1 ) ∣ + ∣ f ( i + 1 , j ) − f ( i , j + 1 ) ∣ G[f(x, y)] \approx|f(i, j)-f(i+1, j+1)|+|f(i+1, j)-f(i, j+1)| G[f(x,y)]f(i,j)f(i+1,j+1)+f(i+1,j)f(i,j+1)
这种交叉梯度我们称之为Roberts梯度。
在这里插入图片描述

5. sobel算子

基本思想:以待增强图像的任意象素 ( i , j ) (i,j) (i,j)为中心,截取一个 3 × 3 3×3 3×3的象素窗口,先分别计算窗口中心象素在 x x x y y y方向的梯度:
S x = [ f ( i − 1 , j + 1 ) + 2 f ( i , j + 1 ) + f ( i + 1 , j + 1 ) ] − [ f ( i − 1 , j − 1 ) + 2 f ( i , j − 1 ) + f ( i + 1 , j − 1 ) ] S y = [ f ( i + 1 , j − 1 ) + 2 f ( i + 1 , j ) + f ( i + 1 , j + 1 ) ] − [ f ( i − 1 , j − 1 ) + 2 f ( i − 1 , j ) + f ( i − 1 , j + 1 ) ] \begin{aligned} &S_{x}=[f(i-1, j+1)+2 f(i, j+1)+f(i+1, j+1)]-[f(i-1, j-1)+2 f(i, j-1)+f(i+1, j-1)]\\&S_{y}=[f(i+1, j-1)+2 f(i+1, j)+f(i+1, j+1)]-[f(i-1, j-1)+2 f(i-1, j)+f(i-1, j+1)]\end{aligned} Sx=[f(i1,j+1)+2f(i,j+1)+f(i+1,j+1)][f(i1,j1)+2f(i,j1)+f(i+1,j1)]Sy=[f(i+1,j1)+2f(i+1,j)+f(i+1,j+1)][f(i1,j1)+2f(i1,j)+f(i1,j+1)]
增强后的 ( i , j ) (i,j) (i,j)的灰度: f ′ ( i , j ) = S x 2 + S y 2 f^{\prime}(i, j)=\sqrt{S_{x}^{2}+S_{y}^{2}} f(i,j)=Sx2+Sy2

可以简化为 f ′ ( i , j ) = ∣ S x ∣ + ∣ S y ∣ f^{\prime}(i, j)={|S_{x}|+|S_{y}|} f(i,j)=Sx+Sy
优点:

  • 由于引入了加权平均,所以对图像中的随机噪声具有一定的平滑作用。
  • 由于采用间隔两行或两列的差分,边缘两侧的象素得到增强,锐化图像的边缘显得粗而亮。

S x , S y Sx,Sy Sx,Sy可用卷积模板来实现 可用卷积模板来实现:
S x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] S y = [ − 1 − 2 − 1 0 0 0 1 2 1 ] S_{x}=\left[\begin{array}{ccc}-1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1\end{array}\right] \quad S_{y}=\left[\begin{array}{ccc}-1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1\end{array}\right] Sx=
121000121
Sy=

101202101

可见:其重点放在接近于模板中心的象素点

6. Prewitt算子

基本思想:与Sobel算子相同,方程的形式相同,但其中系数不同:
S x = [ − 1 0 1 − 1 0 1 − 1 0 1 ] S y = [ − 1 − 1 − 1 0 0 0 1 1 1 ] S p = S x 2 + S y 2 \begin{array}{c} S_{x}=\left[\begin{array}{ccc} -1 & 0 & 1 \\ -1 & 0 & 1 \\ -1 & 0 & 1 \end{array}\right] \quad S_{y}=\left[\begin{array}{ccc} -1 & -1 & -1 \\ 0 & 0 & 0 \\ 1 & 1 & 1 \end{array}\right] \\\\ S_{p}=\sqrt{S_{x}^{2}+S_{y}^{2}} \end{array} Sx=
111000111
Sy=
101101101
Sp=Sx2+Sy2

可见:与Sobel算子不同 ,其重点没有放在接近于模板中心的象素点。

7. 拉普拉斯算子

基本思想:拉普拉斯(Laplacian) 算子是 n 维欧几里德空间中的一个二阶微分算子。 ∇ 2 f = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 \nabla^{2} f=\frac{\partial^{2} f}{\partial x^{2}}+\frac{\partial^{2} f}{\partial y^{2}} 2f=x22f+y22f 具有各向同性。

  1. 对于数字图像 f ( x , y ) f(x,y) f(x,y) ,其一阶导数为:
    { ∂ f ( i , j ) ∂ x = Δ x f ( i , j ) = f ( i , j ) − f ( i − 1 , j ) ∂ f ( i , j ) ∂ y = Δ y f ( i , j ) = f ( i , j ) − f ( i , j − 1 ) \left\{\begin{array}{l} \frac{\partial f(i, j)}{\partial x}=\Delta_{x} f(i, j)=f(i, j)-f(i-1, j) \\\\ \frac{\partial f(i, j)}{\partial y}=\Delta_{y} f(i, j)=f(i, j)-f(i, j-1) \end{array}\right.

    xf(i,j)=Δxf(i,j)=f(i,j)f(i1,j)yf(i,j)=Δyf(i,j)=f(i,j)f(i,j1)
  2. f ( x , y ) f(x,y) f(x,y) ,其二阶导数为:
    { ∂ 2 f ( i , j ) ∂ x 2 = Δ x f ( i + 1 , j ) − Δ x f ( i , j ) = [ f ( i + 1 , j ) − f ( i , j ) ] − [ f ( i , j ) − f ( i − 1 , j ) ] = f ( i + 1 , j ) + f ( i − 1 , j ) − 2 f ( i , j ) ∂ 2 f ( i , j ) ∂ y 2 = f ( i , j + 1 ) + f ( i , j − 1 ) − 2 f ( i , j ) \left\{\begin{aligned} \frac{\partial^{2} f(i, j)}{\partial x^{2}} &=\Delta_{x} f(i+1, j)-\Delta_{x} f(i, j) \\ &=[f(i+1, j)-f(i, j)]-[f(i, j)-f(i-1, j)] \\ &=f(i+1, j)+f(i-1, j)-2 f(i, j) \\\\ \frac{\partial^{2} f(i, j)}{\partial y^{2}} &=f(i, j+1)+f(i, j-1)-2 f(i, j) \end{aligned}\right.

    x22f(i,j)y22f(i,j)=Δxf(i+1,j)Δxf(i,j)=[f(i+1,j)f(i,j)][f(i,j)f(i1,j)]=f(i+1,j)+f(i1,j)2f(i,j)=f(i,j+1)+f(i,j1)2f(i,j)
  3. 拉普拉斯算子为: ∇ 2 f ( i , j ) = Δ x 2 f ( i , j ) + Δ y 2 ( i , j ) = f ( i + 1 , j ) + f ( i − 1 , j ) + f ( i , j + 1 ) + f ( i , j − 1 ) − 4 f ( i , j ) = − 5 { f ( i , j ) − 1 5 [ f ( i + 1 , j ) + f ( i − 1 , j ) + f ( i , j + 1 ) + f ( i , j − 1 ) + f ( i , j ) ] } \begin{aligned} \nabla^{2} f(i, j) &=\Delta_{x}^{2} f(i, j)+\Delta_{y}^{2}(i, j) \\ &=f(i+1, j)+f(i-1, j)+f(i, j+1)+f(i, j-1)-4 f(i, j) \\ &=-5\left\{f(i, j)-\frac{1}{5}[f(i+1, j)+f(i-1, j)+f(i, j+1)+f(i, j-1)+f(i, j)]\right\} \end{aligned} 2f(i,j)=Δx2f(i,j)+Δy2(i,j)=f(i+1,j)+f(i1,j)+f(i,j+1)+f(i,j1)4f(i,j)=5{
    f(i,j)51[f(i+1,j)+f(i1,j)+f(i,j+1)+f(i,j1)+f(i,j)]}

其中,Laplacian算子四邻域模板如下所示:
H = [ 0 − 1 0 − 1 4 − 1 0 − 1 0 ] \mathrm{H}=\left[\begin{array}{ccc} 0 & -1 & 0 \\ -1 & 4 & -1 \\ 0 & -1 & 0 \end{array}\right] H=
010141010

Laplacian算子八邻域模板如下所示
H = [ − 1 − 1 − 1 − 1 8 − 1 − 1 − 1 − 1 ] \mathrm{H}=\left[\begin{array}{ccc} -1 & -1 & -1 \\ -1 & 8& -1 \\ -1 & -1 & -1 \end{array}\right] H=
111181111

可见:

  • 当邻域内像素灰度相同时,模板的卷积运算结果为0;
  • 当中心像素灰度高于邻域内其他像素的平均灰度时,模板的卷积运算结果为正数;
  • 当中心像素的灰度低于邻域内其他像素的平均灰度时,模板的卷积为负数。对卷积运算的结果用适当的衰弱因子处理并加在原中心像素上,就可以实现图像的锐化处理。

8. matlab代码实现

clc;clear all;
img = imread('C:\Users\lihuanyu\Desktop\opencv\image\lena256.bmp');
figure;
imshow(img),title("原图像");
[ROW,COL] = size(img);
img = double(img);
new_img = zeros(ROW,COL); %新建画布
%定义robert算子
roberts_x = [1,0;0,-1];
roberts_y = [0,-1;1,0];
for i = 1:ROW - 1
    for j = 1:COL - 1
        funBox = img(i:i+1,j:j+1);
        G_x = roberts_x .* funBox;
        G_x = abs(sum(G_x(:)));
        G_y = roberts_y .* funBox;
        G_y = abs(sum(G_y(:)));
        roberts_xy  = G_x * 0.5 + G_y * 0.5;
        new_img(i,j) = roberts_xy;
    end
end
figure(2);
imshow(new_img/255),title("robert算子的图像");
% 定义laplace算子
laplace = [0,1,0;1,-4,1;0,1,0];
for i = 1:ROW - 2
    for j = 1:COL - 2
        funBox = img(i:i+2,j:j+2);
        G = laplace .* funBox;
        G = abs(sum(G(:)));
        new_img(i+1,j+1) = G;
    end
end
figure(3)
imshow(new_img/255),title("laplace算子的图像");
%定义sobel算子
sobel_x = [-1,0,1;-2,0,2;-1,0,1];
sobel_y = [-1,-2,-1;0,0,0;1,2,1];
for i = 1:ROW - 2
    for j = 1:COL - 2
        funBox = img(i:i+2,j:j+2);
        G_x = sobel_x .* funBox;
        G_x = abs(sum(G_x(:)));
        G_y = sobel_y .* funBox;
        G_y = abs(sum(G_y(:)));
        sobelxy  = G_x * 0.5 + G_y * 0.5;
        new_img(i+1,j+1) = sobelxy;
    end
end
figure(4);
imshow(new_img/255),title("sobel的图像");
%定义Prewitt算子
sobel_x = [-1,0,1;-1,0,1;-1,0,1];
sobel_y = [-1,-1,-1;0,0,0;1,1,1];
for i = 1:ROW - 2
    for j = 1:COL - 2
        funBox = img(i:i+2,j:j+2);
        G_x = sobel_x .* funBox;
        G_x = abs(sum(G_x(:)));
        G_y = sobel_y .* funBox;
        G_y = abs(sum(G_y(:)));
        sobelxy  = G_x * 0.5 + G_y * 0.5;
        new_img(i+1,j+1) = sobelxy;
    end
end
figure(5);
imshow(new_img/255),title("Prewitt的图像");

Jetbrains全家桶1年46,售后保障稳定

原图:
在这里插入图片描述

结果:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227652.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SpringBoot验证码

    SpringBoot验证码原生 js SpringBoot hutool 工具 实现浏览器验证码功能 点击可刷新

    2025年6月17日
    5
  • 6种常见的测试用例设计方法及应用_测试用例设计的方法

    6种常见的测试用例设计方法及应用_测试用例设计的方法测试前准备作为一个测试人员,软件测试的流程首先是要非常熟悉的,何时何地都能脱口而出,避免一切翻车的可能。需要注意的是流程没有唯一答案,具体由项目决定。所以给出的只是一个还算通用的参考流程。  我们要熟知的测试流程:  总结一下:在测试流程中,有6个部分,其中3个部分涉及到了用例,可见写好用例的重要性。  所以,结合这些年吃过的亏,我来给大家缕缕,如何快速的get到测试用例的设计方法。  5种常见的测试用例设计方法  一、等价类划分  1)概念  某个输入域的集合,在这个集合中每个输入条件都是

    2022年10月9日
    3
  • 吐血推荐:VBScript教程及语言参考电子书「建议收藏」

    吐血推荐:VBScript教程及语言参考电子书「建议收藏」经过两次练手之后,花费一天时间,通过对从迅雷上所下载所有VBScript资源的整合,鼎力制作了此本VBScript教程及语言参考书。全书资源丰富,主要包括两部分内容。第一部分是教程部分,通过此章节的学习,我们可以很轻松的掌握VBScript的基础知识。第二部分是语言参考,提供一个搜索页面,在我们使用的时候可以随时查找到自己所需要查找的函数等的…

    2022年6月25日
    32
  • 如何通过maven打包可执行jar包[通俗易懂]

    如何通过maven打包可执行jar包[通俗易懂]一、目的将代码打包成jar包有四种形式:1、只打包本项目的代码,不包括依赖的jar包,并且不可直接通过java-jarxxx.jar执行(应用场景:我们日常使用依赖的jar包)2、只打包本项目的代码,不包括依赖的jar包,并且可以直接通过java-jarxxx.jar执行(应用场景:执行时依赖的jar包存在在本jar包外部,减少jar体积)3、打包本项目的代码,同时将依赖的jar包解压后的文件复制到本jar包中,可以直接通过java-jarxxx.jar执行(应用场景:直接执行,

    2022年10月4日
    2
  • msf win10漏洞_Kali对Windows2008/7的MS17010漏洞测试(MSF自带模块)

    msf win10漏洞_Kali对Windows2008/7的MS17010漏洞测试(MSF自带模块)Kali-TheVulnerablityofMS17010forWindowsServer2008R20x01说明其实这个MSF自带的exp模块还是挺让人伤脑筋的,因为它支持的OS并不是很多,也就WindowsServer2008和Win7能用一下,比他们版本低的xp/2003以及比他们版本高的8/2012都不可用,但是纯粹对于Win2008/7而言,这个方案还是比较方便…

    2022年5月15日
    58
  • linux 驱动移植_免驱动led灯好吗

    linux 驱动移植_免驱动led灯好吗通过前两篇文章的介绍,我们已经把linux内核移植到了tiny210上,但是看到的现象都是通过超级终端来观察的,下面了,我们介绍一下led灯的移植,给大家一个更直观的感受。这篇文章主要的内容如下:1.对平台总线的简介;2.led驱动的移植。一.平台总线   首先介绍一下,我们为什么要简单介绍一下平台总线呢?因为我们是做led驱动的移植,而不是自己编写led的驱动代码。我们要移植

    2022年9月25日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号