图像平滑(均值和中值滤波)和锐化(四种教科书卷积算子)处理以及MATLAB代码实现

目录

一、平滑的两种卷积(均值滤波和中值滤波)运算流程

依据百度百科的定义:由于图像受传感器和大气等因素的影响,遥感图像上会出现某些亮度变化过大的区域,或出现一些亮点(也称噪声)。这种为了抑制噪声,使图像亮度趋于平缓的处理方法就是图像平滑。图像平滑实际上是低通滤波,平滑过程会导致图像边缘模糊化。
以下是图像平滑的分类。
在这里插入图片描述

均值滤波:

注释:下面的待处理像元就是图像的像元,以迭代的方法依次遍历图像的每一个像元
%%均值滤波:所谓均值滤波就是以图像周围的其他像元值的平均值代替原值的方法,以达到能够消除像元周围像元值较大或异常的像元。通过遍历之后,我们会发现不同的像元之间具有一定的相关性
当n=3时,
1:3×3均值滤波就是取待处理像元的外围的8个像元值的平均值代替该像元的值。
当n>3时,
1:取待处理像元的外围的(n×n)-1个像元的平均值代替。
2:取待处理像元的上、下、左、右、右上、右下、左上、左下的的像元的方差和平均值,以方差最大的平均值代替。
在这里插入图片描述

中值滤波:

%%中值滤波:而中值滤波原理和均值滤波相同,但采用却是以周围像元的中值代替,中值就是中位数,周围像元顺序排列后取中值,会使不同像元之间也具有相关性
以3×3中值滤波为例:
1.设待处理像元的领域8像元集合为:在这里插入图片描述
2.通过顺序排列之后:在这里插入图片描述
3.因此待处理像元值为:在这里插入图片描述
中值滤波窗口的选取也至关重要:
一般有方形或者圆形窗口,当图像的情况特殊时,也可采用十字形,交叉型进行处理。不同的窗口可处理不同的图像,效果方面也不同。

二、锐化的四种卷积算子介绍

锐化基本概念:

所谓锐化就是应用锐化工具可以快速聚焦模糊边缘,提高图像中某一部位的清晰度或者焦距程度,使图像特定区域的色彩更加鲜明。就如同我们手机相册里面的图片锐化功能,能够是图片变的更加具体看起来细节更高。
而图像的锐化处理,则是采用与滤波窗口同样大小的数值矩阵(此矩阵一般被称为算子),与窗口对应的图像上的像元值矩阵进行相乘处理,最后求和取绝对值赋值给待处理像元,遍历完之后就实现了整个图像的锐化操作。
在这里插入图片描述
需要注意的是:
由于图像边缘的待处理像元进行卷积运算时,外围相邻的像元没有,因此我们一般采用扩充图像像元矩阵,也就是在图像周围扩充一圈零值或者采用邻近像元的方法代替这些零值,使其能够使图像边缘也能够运算,且能够保持原有图像的大小。

关于锐化算子的确定,大家可以参考博客:https://blog.csdn.net/zaishuiyifangxym/article/details/89840396
我下面值简单介绍我代码所用到的四种模板算子,仅垂直方向和水平方向

四种锐化卷积算子:

sobel算子:

垂直方向:在这里插入图片描述
水平方向: 在这里插入图片描述

perwitt算子:

垂直方向:在这里插入图片描述
水平方向:在这里插入图片描述

roberts算子:

水平方向:在这里插入图片描述
垂直方向:在这里插入图片描述

lapacian算子:

8领域模板:在这里插入图片描述

三、基于平滑的两种方法以及锐化的四种算子利用matlab进行实现

代码很长但是过程详细且函数较少,为了方便读者理解在此就不简化了。

MATLAB平滑代码案例:

代码函数清单:
图像矩阵2=padarray(图像矩阵1,[扩充范围]):此函数用于给图像像元矩阵外围扩充一定范围
%
矩阵2=reshape(矩阵1,[要改变的矩阵维度]):此函数用于改变矩阵维度
%
矩阵2=median(矩阵1):此函数用于计算矩阵的中值,默认顺序排列之后取中位数
%
histogram(图像像元矩阵):此函数用于绘制图像的像元值直方图

image=imread("待处理平滑图像.jpg");
[rows,cols]=size(image);
%下面的操作是为了使图像迭代后能够保持原来的大小或者是为了防止图像的信息丢失
image=padarray(image,[1,1]);
%注意,为了下面能够正常运算,通常要将图像像元矩阵转换为双精度浮点型的数据
x1=double(image);
[x2,x3,x4]=deal(x1);
%下面的循环是1到rows-2,是因为下面x1取的是i+2,以防止循环超出范围
for i=1:rows-2
    for j=1:cols-2
         NR=x1(i:i+2,j:j+2);    %由于每一次迭代是3*3的窗口,因此下面取的是x1矩阵的3*3的部分赋值给NR
         %中值滤波
         ER=reshape(NR,[1,3*3]);%将每一个3*3的部分排成一行也就是1行9列的行向量
         R=median(ER);          %median函数是用于取上面的行向量的中值R
         x2(i+1,j+1)=R;         %利用索引将第一个中值赋值给x2的第二行第二列,也就是赋值给3*3窗口的中间像元,然后依次迭代
         %均值滤波
         R1=sum(NR,'all')/9;    %将上面的每一个3*3的部分求均值R2
         x4(i+1,j+1)=R1;
    end
end
%成图区域
figure;
subplot(2,2,[1,2]);
imshow(image);
title('原噪声图');
subplot(2,2,3);
image2=uint8(x2);
imshow(image2);
title('中值滤波去噪');
subplot(2,2,4);
image4=uint8(x4);
imshow(image4);
title('均值滤波去噪');
figure;
subplot(3,1,1);
histogram(image);
title('原噪声像元直方图');
subplot(3,1,2);
image2=uint8(x2);
histogram(image2);
title('中值滤波去噪后像元直方图');
subplot(3,1,3);
image4=uint8(x4);
histogram(image4);
title('均值滤波去噪后像元直方图');

运行结果:

在这里插入图片描述

上图即为两种方法对噪声图的平滑处理,均值滤波的效果比中值滤波更好一点,但是在椒盐噪声上面,中值滤波的效果更好。其去除了图像上的异常线条和高亮点,使图像变的柔和和清晰。
下图是三张图像的像元直方图,由图可知,原噪声图的像元主要聚集在0和250上,而通过平滑处理之后,两边的像元值得到处理,使整个图像的直方图趋于150左右。
在这里插入图片描述

MATLAB锐化代码案例:

代码函数清单:
[变量1,变量2,…]=deal(变量):此函数用于将变量赋值给多个变量
%
abs(变量):此函数用于求取变量的绝对值

sharpen_image=imread("带处理锐化图像.jpg");
figure;
imshow(sharpen_image);
title('待锐化原图');
[rows,cols]=size(sharpen_image);
%四种卷积算子的运算模板
prewitt_y=[-1,-1,-1;0,0,0;1,1,1];
prewitt_x=[-1,0,1;-1,0,1;-1,0,1];
roberts_x=[-1,0;0,1];
roberts_y=[0,-1;1,0];
sobel_y=[-1,-2,-1;0,0,0;1,2,1];
sobel_x=[-1,0,1;-2,0,2;-1,0,1];
lapacian=[-1,-1,-1;-1,8,-1;-1,-1,-1];
sharpen_image=padarray(sharpen_image,[1,1]);
y1=double(sharpen_image);
[y2,y3,y4,y5]=deal(y1);
for i=1:rows-2
    for j=1:cols-2
         NB=y1(i:i+2,j:j+2);
         %
         EB_x=NB.*prewitt_x;
         EB_y=NB.*prewitt_y;
         B_x=sum(EB_x,'all');
         B_y=sum(EB_y,'all');
         %
         EB1_x=NB.*sobel_x;
         EB1_y=NB.*sobel_y;
         B1_x=sum(EB1_x,"all");
         B1_y=sum(EB1_y,"all");
         %
         EB2=NB.*lapacian;
         B2=sum(EB2,"all");
         y2(i+1,j+1)=abs(B_x+B_y);
         y3(i+1,j+1)=abs(B1_x+B1_y);
         y4(i+1,j+1)=B2;
    end
end
for i=1:rows-1
    for j=1:cols-1
         NB3=y1(i:i+1,j:j+1);
         EB3_x=NB3.*roberts_x;
         EB3_y=NB3.*roberts_y;
         B3_x=sum(EB3_x,'all');
         B3_y=sum(EB3_y,'all');
         y5(i+1,j+1)=abs(B3_x+B3_y);
    end
end
sharpen_image1=uint8(y2);
sharpen_image2=uint8(y3);
sharpen_image3=uint8(y4);
sharpen_image4=uint8(y5);
figure;
subplot(2,2,1);
imshow(sharpen_image1);
title('prewitt算法图');
subplot(2,2,2);
imshow(sharpen_image2);
title('sobel算法图');
subplot(2,2,3);
imshow(sharpen_image3);
title('lapacian算法图');
subplot(2,2,4);
imshow(sharpen_image4);
title('roberts算法图');
figure;
subplot(2,2,1);
imshow(imadd(sharpen_image1.*0.8,sharpen_image));
title('prewitt融合图');
subplot(2,2,2);
imshow(imadd(sharpen_image2.*0.8,sharpen_image));
title('sobel融合图');
subplot(2,2,3);
imshow(imadd(sharpen_image3.*0.8,sharpen_image));
title('lapacian融合图');
subplot(2,2,4);
imshow(imadd(sharpen_image4.*0.8,sharpen_image));
title('roberts融合图');
figure;
subplot(2,2,1);
histogram(sharpen_image4);
title('prewitt直方图')
subplot(2,2,2);
histogram(sharpen_image1);
title('sobel直方图')
subplot(2,2,3);
histogram(sharpen_image2);
title('lapacian直方图')
subplot(2,2,4);
histogram(sharpen_image3);
title('roberts直方图')

运行结果:

在这里插入图片描述

下图为四个算子得到的边缘检测效果图,各个算子之间有很强的相似性,只是其程度不同。其检测到的相邻像元之间的差异,从而将其提取出来,故此也被称为边缘增强。其不仅仅应用于遥感图像处理中,而且还与我们的生活息息相关,例如手机相册编辑图片等一些基本操作。

在这里插入图片描述

我们将上面的边缘与原图像重合,便可以得到锐化后的图。相比之下lapacian看起来效果明显,而prewitt和sobel算子却是有点锐化过度,不同的方法,我们可以将其上面的边缘图×倍率,使其达到最优的效果,但是这样做会导致图像畸变或者丢失信息,为了保险起见,读者们可以去网上查找其他处理办法,在此我就不细说了。

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

  • 7
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楠楠星球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值