图像平滑处理.docx
《图像平滑处理.docx》由会员分享,可在线阅读,更多相关《图像平滑处理.docx(17页珍藏版)》请在冰豆网上搜索。
图像平滑处理
1用butterworth和理想低通滤波器对受椒盐噪声和高斯噪声污染的图像进行平滑处理,计算平滑前后的PSNR(峰值信噪比).
解答:
首先利用imnoise函数产生被噪声污染的图像,首先实现理想低通滤波器的平滑处理,对于理想低通的截止频率,下面分别尝试了取0.05,0.1,0.2个宽的长度
以下是理想低通实现对椒盐噪声的平滑处理,程序如下
f=imread(‘face.jpg’);
以下分别获得两个噪声图像
fsalt=imnoise(f,'salt&pepper',0.1);
fgauss=imnoise(f,'gaussian',0,0.02);
首先进行fft变换
f1=fft2(fsalt);
改变中心坐标
>>f2=fftshift(f1);
设定截止频率
>>d0=0.05*495;
开始填充新的幅频图
fori=1:
1:
642
forj=1:
1:
495
if(i-321)*(i-321)+(j-248)*(j-248)f3(i,j)=f2(i,j);
else
f3(i,j)=0;
end
end
end
>>f4=ifftshift(f3);
反变换以及输出
>>ff=abs(ifft2(f4));
>>subplot(2,2,1);
>>imshow(f);
>>subplot(2,2,2);
>>imshow(fsalt);
>>subplot(2,2,3);
>>imshow(abs(log(1+f3)),[]);
>>subplot(2,2,4);
>>imshow(mat2gray(ff))
下面分别是原图,噪声图像,以及分别取0.05,0.1,0.2个直径作为截止频率得到的新的幅频图像和最后反变换得到的平滑图像
可见当截止频率比较低时候平滑效果是比较好的,噪声得到较好地抑制,但是代价是原图的细节也被磨掉了,所以后面增大截止频率后虽然噪声有所增加,但是图像原来的细节也越来越明显,图像变得细腻了
原图及椒盐噪声图像
0.05
0.1
0.2
峰值信噪比定义为:
其中,MAXI是表示图像点颜色的最大数值,如果每个采样点用8位表示,那么为255
下面首先计算原图与椒盐噪声图像的峰值信噪比,程序和结果如下
f=double(f);
fsalt=double(fsalt);
s=0;
fori=1:
1:
642
forj=1:
1:
495
m=(f(i,j)-fsalt(i,j))^2;
s=s+m;
end
end
>>mse=s/(642*495);
>>PSNR=10*log10(255^2/mse)
PSNR=14.1058
下面计算处理过的图像,取0.2的那一幅平滑图像
f=double(f);
ff=double(ff);
s=0;
fori=1:
1:
642
forj=1:
1:
495
m=(f(i,j)-ff(i,j))^2;
s=s+m;
end
end
mse=s/(642*495);
>>PSNR=10*log10(255^2/mse)
PSNR=
22.9686
比较可得峰值信噪比提高了,不过好像还不是很大
下面用二阶巴特沃斯滤波器处理高斯噪声污染的图像,过程跟上面差不多,只不过是滤波器换了
下面是程序和结果,这里也就不多写了
f1=fft2(fgauss);
f2=fftshift(f1);
d0=(0.05*495)^2;
fori=1:
1:
642
forj=1:
1:
495
d=(i-321)^2+(j-248)^2;
主要就是二阶滤波器这里应该这样子写,当然阶数越多就越接近理想低通
f3(i,j)=f2(i,j)/(1+(d/d0)^2);
end
end
f4=ifftshift(f3);
ff=abs(ifft2(f4));
subplot(2,2,1);
imshow(f);
subplot(2,2,2);
>>imshow(fgauss);
>>subplot(2,2,3);
imshow(abs(log(1+f3)),[]);
subplot(2,2,4);
imshow(mat2gray(ff))
下面分别是截止频率为0.050.10.2时候复原的图像,可见振铃现象有所减少
好吧还得计算其峰值信噪比啊,首先计算原图与高斯噪声污染的图的信噪比,程序和结果如下,也就不多说了,直接上
f=double(f);
fgauss=double(fgauss);
s=0;
fori=1:
1:
642
forj=1:
1:
495
m=(f(i,j)-fgauss(i,j))^2;
s=s+m;
end
end
>>mse=s/(642*495);
>>PSNR=10*log10(255^2/mse)
PSNR=
18.5093
下面计算平滑后的信噪比
f=double(f);
ff=double(ff);
s=0;
fori=1:
1:
642
forj=1:
1:
495
m=(f(i,j)-ff(i,j))^2;
s=s+m;
end
end
mse=s/(642*495);
PSNR=10*log10(255^2/mse)
PSNR=
28.9013
简单比较就是信噪比的确提高了很多
2.用3x3邻域平均平滑和3x3中值滤波对受椒盐噪声和高斯噪声污染的图像进行平滑处理,计算平滑前后的PSNR(峰值信噪比).
解答:
怎么还是这样的题目,好吧
领域平均平滑就很简单了,就是求平均了,以这个均值作为自己的灰度值
程序如下
fori=2:
1:
641
forj=2:
1:
494
f1(i,j)=(1/9)*(fsalt(i-1,j-1)+fsalt(i-1,j)+fsalt(i-1,j+1)+fsalt(i,j-1)+fsalt(i,j)+fsalt(i,j+1)+fsalt(i+1,j-1)+fsalt(i+1,j)+fsalt(i+1,j+1));
end
end
>>imshow(f1)
Warning:
Imageistoobigtofitonscreen;displayingat67%
>Inimuitools\private\initSizeat73
Inimshowat262
>>subplot(1,2,1);
>>imshow(fsalt);
>>subplot(1,2,2);
>>imshow(f1);
首先这里偷懒了,边缘没有补充,可以取临近值近似啥的,不过影响不大,这里就忽略了
得到的原图和输出的平滑图像,可见是真很大啊,只有个大概的轮廓了,黑白都融合了
均值滤波效果图椒盐噪声
求其信噪比,由于加噪后的前面已经做过了,这里只做平滑后的
上程序,跟之前差不多
f=double(f);
f1=double(f1);
s=0;
fori=2:
1:
641
forj=2:
1:
494
m=(f(i,j)-f1(i,j))^2;
s=s+m;
end
end
mse=s/(641*494);
PSNR=10*log10(255^2/mse)
PSNR=12.3306
前面噪声的是PSNR=14.1058
信噪比竟然减小了,所以这样子不妥啊,我决定给加个阈值,再来做一次平均值降噪
程序如下
f=imread('face.jpg');
fsalt=imnoise(f,'salt&pepper',0.1);
fori=2:
1:
641
forj=2:
1:
494
f1(i,j)=(1/9)*(fsalt(i-1,j-1)+fsalt(i-1,j)+fsalt(i-1,j+1)+fsalt(i,j-1)+fsalt(i,j)+fsalt(i,j+1)+fsalt(i+1,j-1)+fsalt(i+1,j)+fsalt(i+1,j+1));
ifabs(fsalt(i,j)-f1(i,j))>150
f2(i,j)=f1(i,j);
else
f2(i,j)=fsalt(i,j);
end
end
end
subplot(1,2,1);
imshow(fsalt);
subplot(1,2,2);
imshow(f2);
对于这幅图尝试了几次,最后阈值顶到这么大,左边脸还是有块疤啊
有阈值的均值滤波效果图椒盐噪声
可见均值对椒盐噪声没啥办法,下面来试试高斯噪声
f=imread(‘face.jpg’);
fsalt=imnoise(f,’gaussian’,0,0.02);
fori=2:
1:
641
forj=2:
1:
494
f1(i,j)=(1/9)*(fsalt(i-1,j-1)+fsalt(i-1,j)+fsalt(i-1,j+1)+fsalt(i,j-1)+fsalt(i,j)+fsalt(i,j+1)+fsalt(i+1,j-1)+fsalt(i+1,j)+fsalt(i+1,j+1));
end
end
>>imshow(f1)
Warning:
Imageistoobigtofitonscreen;displayingat67%
>Inimuitools\private\initSizeat73
Inimshowat262
>>subplot(1,2,1);
>>imshow(fsalt);
>>subplot(1,2,2);
>>imshow(f1);
我偷了个懒,这次虽然写的是fsalt,其实是gaussian噪声,不过效果也不明显啊,都做烦了,这个的信噪比就不求了,看样子也不高
均值滤波效果图高斯噪声
下面来做中值滤波,我估计对于高斯噪声这种图像中值滤波会很好用的,滤波原理就是求出中间值了,把这个中间值作为新的填充灰度,上程序
f=imread('face.jpg');
fsalt=imnoise(f,'salt&pepper',0.1);
>>fori=2:
1:
641
forj=2:
1:
494
a=[fsalt(i-1,j-1)fsalt(i-1,j)fsalt(i-1,j+1)fsalt(i,j-1)fsalt(i,j)fsalt(i,j+1)fsalt(i+1,j-1)fsalt(i+1,j)fsalt(i+1,j+1)];
fork=8:
-1:
1;
forl=1:
1:
k;
冒泡排序法
ifa(l)>a(l+1)
temp=0;
temp=a(l);
a(l)=a(l+1);
a(l+1)=temp;
end
end
end
f1(i,j)=a(5);
end
end
>>subplot(1,2,1);
imshow(fsalt);
subplot(1,2,2);
imshow(f1)
得到如下输出,效果真的是很好啊
中值滤波效果图椒盐噪声
计算一下此时的信噪比
f=double(f);
f1=double(f1);
s=0;
fori=1:
1:
641
forj=1:
1:
494
m=(f(i,j)-f1(i,j))^2;
s=s+m;
end
end
mse=s/(641*494);
PSNR=10*log10(255^2/mse)
PSNR=
39.6073
这是原图与滤波后图像的信噪比,真的比之前加噪声的图像PSNR=14.1058db要好很多很多,比之前的平均值滤波效果要好很多很多,几乎和原图近似了,可见中值滤波对付椒盐噪声是很有效的
下面来看均值滤波对付高斯噪声是啥效果
程序就不贴了,跟前面一样,只是把椒盐噪声图像换成高斯噪声图像,直接贴结果
中值滤波高斯噪声
失真很大啊,大概只能看个轮廓,下面试验一下加个阈值再来一次中值滤波看看效果
阈值为100时的效果图
把代码也附上吧
f=imread('face.jpg');
fsalt=imnoise(f,'gaussian',0,0.02);
fori=2:
1:
641
forj=2:
1:
494
a=[fsalt(i-1,j-1)fsalt(i-1,j)fsalt(i-1,j+1)fsalt(i,j-1)fsalt(i,j)fsalt(i,j+1)fsalt(i+1,j-1)fsalt(i+1,j)fsalt(i+1,j+1)];
fork=8:
-1:
1;
forl=1:
1:
k;
ifa(l)>a(l+1)
temp=0;
temp=a(l);
a(l)=a(l+1);
a(l+1)=temp;
end
end
end
ifabs(a(5)-fsalt(i,j))<100
f1(i,j)=a(5);
else
f1(i,j)=fsalt(i,j);
end
end
end
subplot(1,2,1);
imshow(fsalt);
subplot(1,2,2);
imshow(f1)
1.用roberts算子和Laplace算子对一图像进行锐化处理,得到其边缘二值图像.
首先使用罗伯茨算子,程序和结果如下
f=imread('face.jpg');
fori=2:
1:
641
forj=2:
1:
494
g1(i,j)=1*max(abs(f(i+1,j+1)-f(i,j)),abs(f(i+1,j)-f(i,j+1)));
g2(i,j)=2*max(abs(f(i+1,j+1)-f(i,j)),abs(f(i+1,j)-f(i,j+1)));
g3(i,j)=5*max(abs(f(i+1,j+1)-f(i,j)),abs(f(i+1,j)-f(i,j+1)));
end
end
subplot(1,4,2);
imshow(g1);
subplot(1,4,3);
imshow(g2);
subplot(1,4,4);
imshow(g3);
>>subplot(1,4,1);
>>imshow(f);
罗伯茨算子得到的边缘锐化图像三个不同比例下的效果图
下面使用拉普拉斯算子
程序跟上面差不多,也是用不同强度的锐化得到几个以作比较
f=imread('face.jpg');
fori=2:
1:
641
forj=2:
1:
494
g1(i,j)=1*(f(i+1,j)+f(i-1,j)+f(i,j+1)+f(i,j-1)-4*f(i,j));
g2(i,j)=2*(f(i+1,j)+f(i-1,j)+f(i,j+1)+f(i,j-1)-4*f(i,j));
g3(i,j)=5*(f(i+1,j)+f(i-1,j)+f(i,j+1)+f(i,j-1)-4*f(i,j));
end
end
subplot(1,4,2);
imshow(g1);
subplot(1,4,3);
imshow(g2);
subplot(1,4,4);
imshow(g3);
subplot(1,4,1);
imshow(f);
最后的输出效果如下图