图像空间域平滑的简单算法.docx
- 文档编号:10870464
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:18
- 大小:669.36KB
图像空间域平滑的简单算法.docx
《图像空间域平滑的简单算法.docx》由会员分享,可在线阅读,更多相关《图像空间域平滑的简单算法.docx(18页珍藏版)》请在冰豆网上搜索。
图像空间域平滑的简单算法
图像空间域平滑的几种简单算法
摘要:
图像平滑或去噪就是为了抑制噪声,以达到改善图像质量的目的,既可以在空间域又可以频率域中实现,在数字图像处理中起着重要的作用。
本文将主要介绍空间域的几种平滑法的算法:
邻点平均法、K个邻点平均法、最大均匀性平滑,其中操作平台是matlab7.1。
关键字:
数字图像处理,图像平滑,K个邻点平均法,最大均匀性平滑
一、局部平滑法(邻域平均法)
1、算法介绍
局部平滑法是一种直接在空间域上进行平滑处理的技术。
假设图像是由许多灰度恒定的小块组成,相邻像素间存在很高的空间相关性,而噪声则是统计独立的。
因此,可以用邻域内各像素的灰度平均值代替该像素原来的灰度值,以去除噪声,实现图像的平滑。
设有一幅N×N的图像f(x,y),若平滑图像为g(x,y),则有
可知邻域平均法就是将当前像素邻域内各像素的灰度平均值作为其输出值的一种简单的去噪方法。
(m-1,n-1)
(m-1,n)
(m-1,n+1)
(m,n-1)
(m,n)
(m,n+1)
(m+1,n-1)
(m+1,n)
(m+1,n+1)
如图所示:
在3*3的窗口中将中心像素所包括的邻域和中心像素的均值作为中心像素的灰度值
在实际中由于第一行、最后一行、第一列、最后一列,不能满足有八个邻域的条件,因此将它们的数据保存不变,最后把这些数据和变化后的数据一起组成图像的灰度矩阵并显示出来。
2、软件流程图
3、算法处理效果图与分析
3.1算法效果图
图
(1)
图
(2)
3.2算法效果图分析
如图
(1):
对于picture(2,2)=106,其邻域有picture(1,1),picture(1,2),picture(1,3),picture(2,1),picture(2,3),picture(3,1),picture(3,2),picture(3,3)
其邻域平均后的值zuihou(2,1)=(picture(1,1)+picture(1,2)+picture(1,3)+picture(2,1)+picture(2,2)+picture(2,3)+picture(3,1)+picture(3,2)+picture(3,3))/9=968/9=107.555556=108
而在图示中zuihou(2,1)=108和我们计算的结果吻合,说明算法正确
4、算法程序
运行环境:
matlab7.1
picture=imread('pout.tif');
n=291;
m=240;
I=im2double(picture);%由于matlab中读入的图像是uint8的,在求平均值时很容易溢出,因此将其转换成double型进行运算
forh=1:
m
X(1,h)=I(1,h);
X(291,h)=I(291,h);
end
forj=1:
n%由于第一行第一列以及最后一行最后一列的值不改变,因此将他们的值单独取出来
X(j,1)=I(j,1);
X(j,240)=I(j,240);
end
fori=2:
n-1
forj=2:
m-1
X(i,j)=(I(i-1,j-1)+I(i-1,j)+I(i-1,j+1)+I(i,j-1)+I(i,j)+I(i,j+1)+I(i+1,j-1)+I(i+1,j)+I(i+1,j+1))/9;%将中心像素的邻域和中心像素相加求平均值
end
end
zuihou=im2uint8(X);%将double型数据转换成uint8
imshow(picture),title('原图');
figure;
imshow(zuihou),title('3*3窗口邻点平均后的图像');
二、灰度最相近的K个邻点平均法
1、算法介绍
该算法的出发点是:
在n×n的窗口内,属于同一集合体的像素,它们的灰度值的高度相关。
因此,可用窗口内与中心像素的灰度最接近的K个邻像素的平均灰度来代替窗口中心像素的灰度值。
这就是灰度最相近的K个邻点平均法。
较小的K值使噪声方差下降较小,但保持细节效果较好;而较大的K值平滑噪声较好,但会使图像边缘模糊。
实验证明,对于3×3的窗口,取K=6为宜,因此采用3*3的六点邻域平均法。
此算法首先将中心像素和其邻域的差值求出来,然后对其求绝对值,将求绝对值后的数据排序,选出前六个作为要的邻域,但此时的六个数据已经是绝对值后的数据,不包含符号,因此要求一个排序程序中,创建一个二维数组,其中第一行存每个数据的标号,在排序移位的同时也将标号移位,用标号来追踪需要的数据,再根据标号找到与中心像素最接近的六个像素灰度值,将其和中心像素相加取平均值,作为中心像素的灰度值,解决了符号的问题。
2、软件流程图
3、算法处理效果图与分析
3.1算法效果图
图(3)
图(4)
3.2算法效果图分析
如图(3)所示:
picture(2,2)=106和它最接近的六个像素是picture(1,1)=107picture(1,2)=108picture(1,3)=107picture(2,3)=108picture(3,1)=107picture(3,2)=106,将他们和picture(2,2)相加取平均值,picture(2,2)=(106+106+108+107+108+107+107)/7=107。
而在last数组中可以清晰的看到picture(2,2)=107,与计算结果相符合,说明算法正确性。
4、算法程序
运行环境:
matlab7.1
picture=imread('pout.tif');
n=291;
m=240;
I=im2double(picture);%由于matlab中读入的图像是uint8的,在求平均值时很容易溢出,因此将其转换成double型进行运算
forh=1:
m
X(1,h)=I(1,h);
X(291,h)=I(291,h);
end
forj=1:
n
X(j,1)=I(j,1);
X(j,240)=I(j,240);
end
fori=2:
n-1
forj=2:
m-1
I1=I(i-1,j-1)-I(i,j);%求邻域和中心像素的差值
I2=I(i-1,j)-I(i,j);
I3=I(i-1,j+1)-I(i,j);
I4=I(i,j-1)-I(i,j);
%I5=I(i,j)-I(i,j);
I6=I(i,j+1)-I(i,j);
I7=I(i+1,j-1)-I(i,j);
I8=I(i+1,j)-I(i,j);
I9=I(i+1,j+1)-I(i,j);
shuzu=[I1,I2,I3,I4,I6,I7,I8,I9];%将差值放在数组中保存
jueduizhi=abs(shuzu);%对差值求绝对值
paixu=[1,2,3,4,5,6,7,8;jueduizhi];%对每个差值添加一个标号
fors=1:
8%对差值排序,为了更好的提取原来的值,在排序的时候也将标号一起移动
forg=s+1:
8
ifpaixu(2,s)>paixu(2,g)%对数组按从小到大排序
midd=paixu(2,s);
paixu(2,s)=paixu(2,g);
paixu(2,g)=midd;
midd1=paixu(1,s);%在排序的时候也将差值的标号一起移动
paixu(1,s)=paixu(1,g);
paixu(1,g)=midd1;
end
end
end
K
(1)=shuzu(paixu(1,1));%根据对应的标号找到原来的对应的差值
K
(2)=shuzu(paixu(1,2));
K(3)=shuzu(paixu(1,3));
K(4)=shuzu(paixu(1,4));
K(5)=shuzu(paixu(1,5));
K(6)=shuzu(paixu(1,6));
average=(K
(1)+K
(2)+K(3)+K(4)+K(5)+K(6)+7*I(i,j))/7;%将和中心像素最接近的六个像素和中心像素相加求平均值
X(i,j)=average;
end
end
zuihou=im2uint8(X);%将double型数据转换成uint8
imshow(picture),title('原图');
figure;
imshow(zuihou),title('K点邻域后的图像');
三、最大均匀性平滑
1、算法
该算法先找出环绕图像的每个像素的最均匀区域,然后用该区域的灰度均值代替原来像素的灰度值。
此算法用环绕图像中每像素的方差的大小来判断哪一个邻域是最均匀的邻域,根据最小方差找到最均匀的邻域,然后将这些邻域像素的均值替代原来像素的灰度值.
对于3*3的窗口,每一个像素有可能在九个邻域中,因此可以找出这九个邻域,分别求出它们的方差,然后对方差排序,找出最小的那个方差,用switch语句判断排序后的最小的那个方差,如果是那一个邻域的方差,则将那个邻域的平均值做该像素的灰度值。
由于第一、二行,最后一行,倒数第二行,第一、二列,最后一列,倒数二列,不能满足九个邻域,因此将它们的数据保存不变。
最后这些数据和变化后的数据一起组成图像的灰度矩阵并显示出来。
2、软件流程图
3、算法处理效果图
图(5)
图(6)
4、算法程序
运行环境:
matlab7.1
picture=imread('pout.tif');
n=291;
m=240;
I=im2double(picture);%由于matlab中读入的图像是uint8的,因此将其转换成double型进行运算
forh=1:
m
X(1,h)=I(1,h);%由于第一、二行行,最后一行,倒数第二行,第一、二列,最后一列,倒数二列,不能满足九个邻域,因此我们将它的数据保存起来不变。
最后和变化后的数据一起组成图像的灰度矩阵,并显示。
X(2,h)=I(2,h);
X(3,h)=I(3,h);
X(289,h)=I(289,h);
X(290,h)=I(290,h);
X(291,h)=I(291,h);
end
forj=1:
n
X(j,1)=I(j,1);
X(j,2)=I(j,2);
X(j,3)=I(j,3);
X(j,238)=I(j,238);
X(j,239)=I(j,239);
X(j,240)=I(j,240);
end
fori=3:
n-2
forj=3:
m-2
F1=[I(i-2,j-2),I(i-2,j-1),I(i-2,j),I(i-1,j-2),I(i-1,j-1),I(i-
1,j),I(i,j-2),I(i,j-1),I(i,j)];%取出每个邻域的像素值
F2=[I(i-2,j+1),I(i-2,j-1),I(i-2,j),I(i-1,j+1),I(i-1,j-1),I(i-
1,j),I(i,j+1),I(i,j-1),I(i,j)];
F3=[I(i-2,j+1),I(i-2,j+2),I(i-2,j),I(i-1,j+1),I(i-1,j+2),I(i-
1,j),I(i,j+1),I(i,j+2),I(i,j)];
F4=[I(i+1,j-2),I(i+1,j-1),I(i+1,j),I(i-1,j-2),I(i-1,j-1),I(i-
1,j),I(i,j-2),I(i,j-1),I(i,j)];
F5=[I(i+1,j+1),I(i+1,j-1),I(i+1,j),I(i-1,j+1),I(i-1,j-1),I(i-
1,j),I(i,j+1),I(i,j-1),I(i,j)];
F6=[I(i+1,j+1),I(i+1,j+2),I(i+1,j),I(i-1,j+1),I(i-1,j+2),I(i-
1,j),I(i,j+1),I(i,j+2),I(i,j)];
F7=[I(i+1,j-2),I(i+1,j-1),I(i+1,j),I(i+2,j-2),I(i+2,j-1),I
(i+2,j),I(i,j-2),I(i,j-1),I(i,j)];
F8=[I(i+1,j+1),I(i+1,j-1),I(i+1,j),I(i+2,j+1),I(i+2,j-1),I
(i+2,j),I(i,j+1),I(i,j-1),I(i,j)];
F9=[I(i+1,j+1),I(i+1,j+2),I(i+1,j),I(i+2,j+1),I(i+2,j+2),I
(i+2,j),I(i,j+1),I(i,j+2),I(i,j)];
I1=var(F1);%求方差
I2=var(F2);
I3=var(F3);
I4=var(F4);
I5=var(F5);
I6=var(F6);
I7=var(F7);
I8=var(F8);
I9=var(F9);
shuzu=[I1,I2,I3,I4,I5,I6,I7,I8,I9];%将方差放在一个数组中
sort(shuzu);%对方差排序
switchshuzu
(1)%判断最小方差属于哪一个邻域
caseI1
junzhi=(I(i-2,j-2)+I(i-2,j-1)+I(i-2,j)+I(i-1,j-2)+I(i-1,j-1)
+I(i-1,j)+I(i,j-2)+I(i,j-1)+I(i,j))/9;
caseI2
junzhi=(I(i-2,j+1)+I(i-2,j-1)+I(i-2,j)+I(i-1,j+1)+I(i-1,j-1)+I
(i-1,j)+I(i,j+1)+I(i,j-1)+I(i,j))/9
caseI3
junzhi=(I(i-2,j+1)+I(i-2,j+2)+I(i-2,j)+I(i-1,j+1)+I(i-1,j+2)
+I(i-1,j)+I(i,j+1)+I(i,j+2)+I(i,j))/9;
caseI4
junzhi=(I(i+1,j-2)+I(i+1,j-1)+I(i+1,j)+I(i-1,j-2)+I(i-1,j-1)
+I(i-1,j)+I(i,j-2)+I(i,j-1)+I(i,j))/9;
caseI5
junzhi=(I(i+1,j+1)+I(i+1,j-1)+I(i+1,j)+I(i-1,j+1)+I(i-1,j-1)
+I(i-1,j)+I(i,j+1)+I(i,j-1)+I(i,j))/9;
caseI6
junzhi=(I(i+1,j+1)+I(i+1,j+2)+I(i+1,j)+I(i-1,j+1)+I(i-1,j+2)
+I(i-1,j)+I(i,j+1)+I(i,j+2)+I(i,j))/9;
caseI7
junzhi=(I(i+1,j-2)+I(i+1,j-1)+I(i+1,j)+I(i+2,j-2)+I(i+2,j-1)
+I(i+2,j)+I(i,j-2)+I(i,j-1)+I(i,j))/9;
caseI8
junzhi=(I(i+1,j+1)+I(i+1,j-1)+I(i+1,j)+I(i+2,j+1)+I(i+2,j-1)
+I(i+2,j)+I(i,j+1)+I(i,j-1)+I(i,j))/9;
caseI9
junzhi=(I(i+1,j+1)+I(i+1,j+2)+I(i+1,j)+I(i+2,j+1)+I(i+2,j+2)
+I(i+2,j)+I(i,j+1)+I(i,j+2)+I(i,j))/9;
end
X(i,j)=junzhi;%将九个邻域中像素最均匀的邻域的均值赋给该像素
end
end
zuihou=im2uint8(X);%将double型数据转换成uint8
imshow(picture),title('原图');
figure;
imshow(zuihou),title('最大均匀性平滑后的图像');
结束语:
这几种算法结合课件上的资料以及查找的相关的资料,历时三天完成了,由于还有考试,现在还有一种算法没能实现,回想这几天的设计主要有以下一些感想:
1、刚开始时,每次对中心像素和邻域像素相加后取平均值后的数据都是255,我们百思不得其解,后来在网上查了好久才知道,matlab中读取的图像都是八位的,其最大值只有255因此当我们把九个数相加后就超过了255,因此它会自动的取255.于是在im2double中将uint8数据类型转换为double型,再在整个数据运算完了以后调用im2uint8将double数据转换为uint8并显示出来。
问题得到圆满地解决。
2、邻域平均法的算法实现很顺利,没有费太多的时间,而在灰度最相近的K个邻点平均法中我们遇到了很多问题,首先是如何找出和中心像素最接近的六个邻域像素,将相邻的八个邻域(因为3*3的窗口)和中心像素相减后的绝对值最小的六个作为中心像素最接近的邻域像素,但是当我们将最邻域像素和中心像素相减后的绝对值排序后,取出最接近的六个绝对值后,却无法追踪原来的数据,从而无法找出我们需要的和中心像素最接近的六个邻域像素的灰度值。
这个问题困扰了我们好久,后来,我们想到了构建一个二维数组,其中第一行存每个差值的标号,在对差值排序移位的同时也将我们的标号移位,这样就可以用标号来追踪我们需要的数据,最后根据标号找到与中心像素最接近的六个像素灰度值,将其和中心像素相加取平均值,作为中心像素的灰度值。
如此循环得到每个中心像素的灰度值。
3、第三种算法的缺点是运行时间长,大约计算机要计算3--5秒,不适合工程运用,有待进一步改进。
4、MatLab理想低通滤波及高通滤波
5、2010-05-1015:
16
functionIdealHighFilter(Img,p,q,d)
if~isgray(Img)
Img=rgb2gray(Img);
end;
subplot(2,2,1),imshow(Img),title('原图像');
f=fftshift(fft2(Img));
subplot(2,2,2),imshow(abs(f),[]),title('原图像的傅里叶频谱');
subplot(2,2,3),imshow(log(abs(f)),[]),title('原图像的傅里叶变换取对数频谱');
[ab]=size(f);
a0=round(a/2);
b0=round(b/2);
fori=1:
a
forii=1:
b
dis=sqrt((i-a0)^2+(ii-b0)^2);
ifdis>=d
h=1;
elseh=0;
end;
s(i,ii)=(p+q*h)*f(i,ii);
end;
end;
s=uint8(real(ifft2(ifftshift(s))));
subplot(2,2,4),imshow(s),title('高通滤波后所得图像');
end
functionIdealLowFilter(Img,d)
if~isgray(Img)
Img=rgb2gray(Img);
end;
subplot(2,2,1),imshow(Img),title('原图像');
f=fftshift(fft2(Img));
subplot(2,2,2),imshow(abs(f),[]),title('原图像的傅里叶频谱');
subplot(2,2,3),imshow(log(abs(f)),[]),title('原图像的傅里叶变换取对数频谱');
[ab]=size(f);
a0=round(a/2);
b0=round(b/2);
fori=1:
a
forii=1:
b
dis=sqrt((i-a0)^2+(ii-b0)^2);
ifdis<=d
h=1;
elseh=0;
end;
s(i,ii)=h*f(i,ii);
end;
end;
s=uint8(real(ifft2(ifftshift(s))));
subplot(2,2,4),imshow(s),title('低通滤波后所得图像');
end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图像 空间 平滑 简单 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)