数字图像处理matlab代码.docx
- 文档编号:9938458
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:29
- 大小:415.36KB
数字图像处理matlab代码.docx
《数字图像处理matlab代码.docx》由会员分享,可在线阅读,更多相关《数字图像处理matlab代码.docx(29页珍藏版)》请在冰点文库上搜索。
数字图像处理matlab代码
一、编写程序完成不同滤波器的图像频域降噪和边缘增强的算法并进行比较,得出结论。
1、不同滤波器的频域降噪
1.1理想低通滤波器(ILPF)
I1=imread('eight.tif');%读取图像
I2=im2double(I1);
I3=imnoise(I2,'gaussian',0.01);
I4=imnoise(I3,'salt&pepper',0.01);
figure,subplot(1,3,1);
imshow(I2)%显示灰度图像
title('原始图像');%为图像添加标题
subplot(1,3,2);
imshow(I4)%加入混合躁声后显示图像
title('加噪后的图像');
s=fftshift(fft2(I4));%将灰度图像的二维不连续Fourier变换的零频率成分移到频谱的中心
[M,N]=size(s);%分别返回s的行数到M中,列数到N中
n1=floor(M/2);%对M/2进行取整
n2=floor(N/2);%对N/2进行取整
d0=40;%初始化d0
fori=1:
M
forj=1:
N
d=sqrt((i-n1)^2+(j-n2)^2);%点(i,j)到傅立叶变换中心的距离
ifd<=d0%点(i,j)在通带内的情况
h=1;%通带变换函数
else%点(i,j)在阻带内的情况
h=0;%阻带变换函数
end
s(i,j)=h*s(i,j);%ILPF滤波后的频域表示
end
end
s=ifftshift(s);%对s进行反FFT移动
s=im2uint8(real(ifft2(s)));%对s进行二维反离散的Fourier变换后,取复
数的实部转化为无符号8位整数
subplot(1,3,3);%创建图形图像对象
imshow(s);%显示ILPF滤波后的图像
title('ILPF滤波后的图像(d=40)');
运行结果:
1.2二阶巴特沃斯低通滤波器(BLPF)
I1=imread('eight.tif');%读取图像
I2=im2double(I1);
I3=imnoise(I2,'gaussian',0.01);
I4=imnoise(I3,'salt&pepper',0.01);
figure,subplot(1,3,1);
imshow(I2)%显示灰度图像
title('原始图像');%为图像添加标题
subplot(1,3,2);
imshow(I4)%加入混合躁声后显示图像
title('加噪后的图像');
s=fftshift(fft2(I4));%将灰度图像的二维不连续Fourier变换的零频率成分移到频谱的中心
[M,N]=size(s);%分别返回s的行数到M中,列数到N中
n=2;%对n赋初值
n1=floor(M/2);%对M/2进行取整
n2=floor(N/2);%对N/2进行取整
d0=40;%初始化d0
fori=1:
M
forj=1:
N
d=sqrt((i-n1)^2+(j-n2)^2);%点(i,j)到傅立叶变换中心的距离
h=1/(1+(d/d0)^(2*n));%BLPF滤波函数
s(i,j)=h*s(i,j);%ILPF滤波后的频域表示
end
end
s=ifftshift(s);%对s进行反FFT移动
s=im2uint8(real(ifft2(s)));%对s进行二维反离散的Fourier变换后,取复数的实部转化为无符号8位整数
subplot(1,3,3);%创建图形图像对象
imshow(s);%显示ILPF滤波后的图像
title('BLPF滤波后的图像(d=40)');
实验结果:
1.3指数型低通滤波器(ELPF)
I1=imread('eight.tif');%读取图像
I2=im2double(I1);
I3=imnoise(I2,'gaussian',0.01);
I4=imnoise(I3,'salt&pepper',0.01);
figure,subplot(1,3,1);
imshow(I2)%显示灰度图像
title('原始图像');%为图像添加标题
subplot(1,3,2);
imshow(I4)%加入混合躁声后显示图像
title('加噪后的图像');
s=fftshift(fft2(I4));%将灰度图像的二维不连续Fourier变换的零频率成分移到频谱的中心
[M,N]=size(s);%分别返回s的行数到M中,列数到N中
n1=floor(M/2);%对M/2进行取整
n2=floor(N/2);%对N/2进行取整
d0=40;
fori=1:
M
forj=1:
N
d=sqrt((i-n1)^2+(j-n2)^2);%点(i,j)到傅立叶变换中心的距离
h=exp(log(1/sqrt
(2))*(d/d0)^2);
s(i,j)=h*s(i,j);%ILPF滤波后的频域表示
end
end
s=ifftshift(s);%对s进行反FFT移动
s=im2uint8(real(ifft2(s)));%对s进行二维反离散的Fourier变换后,取复数的实部转化为无符号8位整数
subplot(1,3,3);%创建图形图像对象
imshow(s);%显示ILPF滤波后的图像
title('ELPF滤波后的图像(d=40)');
运行结果:
1.4梯形低通滤波器(TLPF)
I1=imread('eight.tif');%读取图像
I2=im2double(I1);
I3=imnoise(I2,'gaussian',0.01);
I4=imnoise(I3,'salt&pepper',0.01);
figure,subplot(1,3,1);
imshow(I2)%显示灰度图像
title('原始图像');%为图像添加标题
subplot(1,3,2);
imshow(I4)%加入混合躁声后显示图像
title('加噪后的图像');
s=fftshift(fft2(I4));%将灰度图像的二维不连续Fourier变换的零频率成分移到频谱的中心
[M,N]=size(s);%分别返回s的行数到M中,列数到N中
n1=floor(M/2);%对M/2进行取整
n2=floor(N/2);%对N/2进行取整
d0=10;d1=160;
fori=1:
M
forj=1:
N
d=sqrt((i-n1)^2+(j-n2)^2);%点(i,j)到傅立叶变换中心的距离
if(d<=d0)
h=1;
elseif(d0<=d1)
h=(d-d1)/(d0-d1);
elseh=0;
end
end
s(i,j)=h*s(i,j);%ILPF滤波后的频域表示
end
end
s=ifftshift(s);%对s进行反FFT移动
s=im2uint8(real(ifft2(s)));%对s进行二维反离散的Fourier变换后,取复数的实部转化为无符号8位整数
subplot(1,3,3);%创建图形图像对象
imshow(s);%显示ILPF滤波后的图像
title('TLPF滤波后的图像');%为图像添加标题
运行结果:
1.5高斯低通滤波器(GLPF)
I1=imread('eight.tif');%读取图像
I2=im2double(I1);
I3=imnoise(I2,'gaussian',0.01);
I4=imnoise(I3,'salt&pepper',0.01);
figure,subplot(1,3,1);
imshow(I2)%显示灰度图像
title('原始图像');%为图像添加标题
subplot(1,3,2);
imshow(I4)%加入混合躁声后显示图像
title('加噪后的图像');
s=fftshift(fft2(I4));%将灰度图像的二维不连续Fourier变换的零频率成分移到频谱的中心
[M,N]=size(s);%分别返回s的行数到M中,列数到N中
n1=floor(M/2);%对M/2进行取整
n2=floor(N/2);%对N/2进行取整
d0=40;
fori=1:
M
forj=1:
N
d=sqrt((i-n1)^2+(j-n2)^2);%点(i,j)到傅立叶变换中心的距离
h=1*exp(-1/2*(d^2/d0^2));%GLPF滤波函数
s(i,j)=h*s(i,j);%ILPF滤波后的频域表示
end
end
s=ifftshift(s);%对s进行反FFT移动
s=im2uint8(real(ifft2(s)));%对s进行二维反离散的Fourier变换后,取复数的实部转化为无符号8位整数
subplot(1,3,3);%创建图形图像对象
imshow(s);%显示ILPF滤波后的图像
title('GLPF滤波后的图像(d=40)');
运行结果:
1.6维纳滤波器
[B,Cmap]=imread('eight.tif');%读取MATLAB中的名为eight的图像
I1=im2double(B);
I2=imnoise(I1,'gaussian',0.01);
I3=imnoise(I2,'salt&pepper',0.01);
figure,subplot(1,3,1);
imshow(I1)%显示灰度图像
title('原始图像');%为图像添加标题
subplot(1,3,2);
imshow(I3)%加入混合躁声后显示图像
title('加噪后的图像');
I4=wiener2(I3);
subplot(1,3,3);
imshow(I4);%显示wiener滤波后的图像
title('wiener滤波后的图像');
运行结果:
结论:
理想低通滤波器,虽然有陡峭的截止频率,却不能产生良好的效果,图像由于高频分量的滤除而变得模糊,同时还产生振铃效应。
巴特沃斯滤波器通频带内的频率响应曲线最大限度平坦,没有起伏,而在阻频带则逐渐下降为零。
在振幅的对数对角频率的波得图上,从某一边界角频率开始,振幅随着角频率的增加而逐步减少,趋向负无穷大。
由于转移特性曲线的尾部保留较多的高频,所以对噪声的平滑效果不如ILPE。
指数型低通滤波器具有较平滑的过滤带,经此平滑后的图像没有“振铃”现象,而与巴沃特斯滤波相比,它具有更快的衰减特性,处理图像稍微模糊一些。
梯形低通滤波器的性能介于巴沃特斯与完全平滑滤波器之间,对图像具有一定的模糊和振铃效应。
高斯低通滤波器其原理就是RC电路具有使低频信号较易通过而抑制较高频率信号的作用,可以有效地去除服从正态分布的噪声。
维纳滤波在处理光学传递函数在零点附近的噪声方法问题比较有效,通过选择适当参数,可以有效地消除或抑制噪声和“振铃效应”。
2、边缘增强
2.1Robert算子边缘检测
I=imread('eight.tif');
figure,subplot(1,3,1);
imshow(I);
title('原始图像');
BW1=edge(I,'robert');%阈值默认
subplot(1,3,2);
imshow(BW1);
title('robert算子检测结果(T默认)');
BW2=edge(I,'robert',0.04);%T取0.04
subplot(1,3,3);
imshow(BW2);
title('robert算子检测结果(T=0.04)');%阈值越小,检测出的边缘越丰富
运行结果:
2.2Sobel算子边缘检测
I=imread('eight.tif');%读取图像
figure,subplot(1,3,1);
imshow(I);
title('原始图像');
BW1=edge(I,'sobel');%阈值默认
subplot(1,3,2);
imshow(BW1);
title('sobel算子(T默认)');
BW2=edge(I,'sobel',0.04);%阈值取0.04
subplot(1,3,3);
imshow(BW2);
title('sobel算子(T=0.04)');
运行结果:
2.3Prewitt算子边缘检测
I=imread('eight.tif');
figure,subplot(1,3,1);
imshow(I);
title('原始图像');
BW1=edge(I,'Prewitt');%阈值默认
subplot(1,3,2);
imshow(BW1);
title('Prewitt算子(T默认)');
BW2=edge(I,'Prewitt',0.04);%T取0.04
subplot(1,3,3);
imshow(BW2);
title('Prewitt算子(T=0.04)');%阈值越小,检测出的边缘越丰富
运行结果:
2.4LoG(laplacianofgaussian)算子边缘检测
I=imread('eight.tif');
figure,subplot(1,3,1);
imshow(I);
title('原始图像');
BW1=edge(I,'log',0.003);%T=0.003,sigma默认2
subplot(1,3,2);
imshow(BW1);
title('LoG算子(sigma=2)');
BW2=edge(I,'log',0.003,2.20);%T=0.003,sigma=2.20
subplot(1,3,3);
imshow(BW2);
title('LoG算子(sigma=2.20)');
运行结果:
2.5Canny算子边缘检测
I=imread('eight.tif');
figure,subplot(1,3,1);
imshow(I);
title('原始图像');
BW1=edge(I,'canny');%sigma默认1
subplot(1,3,2);
imshow(BW1);
title('canny算子(sigma=1)');
BW2=edge(I,'canny',[0.040.10],1.3);%T取0.040.10sigma=1.3
subplot(1,3,3);
imshow(BW2);
title('canny算子(sigma=1.3)');
运行结果:
结论:
Roberts算子定位比较精确,但由于不包括平滑,所以对噪声比较敏感。
该算子对具有陡峭边缘且噪声低的图像效果较好。
Prewitt算子和Sobel算子都是一阶的微分算子,而前者是平均滤波,后者是加权平均滤波且检测的图像边缘可能大于2个像素。
这两者对灰度渐变低噪声的图像有较好的检测效果,但是对于混合多复杂噪声的图像,处理效果就不理想了。
LOG滤波器中的
正比于低通滤波器的宽度,
越大,平滑作用越显著,去除噪声越好,但图像的细节也损失越大,边缘精度也就越低。
所以在边缘定位精度和消除噪声级间存在着矛盾,应该根据具体问题对噪声水平和边缘点定位精度要求适当选取
。
而且LOG方法没有解决如何组织不同尺度滤波器输出的边缘图为单一的、正确的边缘图的具体方法。
Canny方法则以一阶导数为基础来判断边缘点。
它是一阶传统微分中检测阶跃型边缘效果最好的算子之一。
它比Roberts算子、Sobel算子和Prewitt算子极小值算法的去噪能力都要强,但它也容易平滑掉一些边缘信息。
二、编写程序完成不同锐化方法的图像锐化的算法并进行比较,得出结论。
1、微分
1.1基于一阶微分的图像锐化-梯度法
[I,map]=imread('eight.tif');
subplot(2,2,1),imshow(I,map);
title('原始图像');
I=double(I);
[IX,IY]=gradient(I);%返回梯度值
GM=sqrt(IX.*IX+IY.*IY);
OUT1=GM;
subplot(2,2,2),imshow(OUT1,map);%直接梯度值输出
title('梯度值图像')
OUT2=I;
J=find(GM>=15);
OUT2(J)=GM(J);
subplot(2,2,3),imshow(OUT2,map);
title('加阈值的梯度值图像')%加阈梯度值输出
OUT3=I;
J=find(GM>=20);
OUT5(J)=200;
Q=find(GM<20);
OUT5(Q)=20;
subplot(2,2,4),imshow(OUT2,map);
title('二值图像');%二值图像
运行结果:
2、高通滤波法
2.1理想高通滤波(IHPF)
I1=imread('eight.tif');%读取图像
I2=im2double(I1);
figure,subplot(1,2,1);
imshow(I2);title('原始图像');
s=fftshift(fft2(I2));
[M,N]=size(s);%分别返回s的行数到M中,列数到N中
n=2;%对n赋初值
n1=floor(M/2);%对M/2进行取整
n2=floor(N/2);%对N/2进行取整
d0=10;%初始化d0
fori=1:
M
forj=1:
N
d=sqrt((i-n1)^2+(j-n2)^2);%点(i,j)到傅立叶变换中心的距离
ifd<=d0
h=0;
else
h=1;
end
s(i,j)=h*s(i,j);%IHPF滤波后的频域表示
end
end
s=ifftshift(s);%对s进行反FFT移动
s=im2uint8(real(ifft2(s)));%对s进行二维反离散的Fourier变换后,取复数的实部转化为无符号8位整数
subplot(1,2,2);%创建图形图像对象
imshow(s);%显示IHPF滤波后的图像
title('IHPF滤波后的图像(d=10)');%为图像添加标题
运行结果:
2.2巴特沃斯高通滤波(BHPF)
I1=imread('eight.tif');%读取图像
I2=im2double(I1);
figure,subplot(1,2,1);
imshow(I2);
title('原始图像');
s=fftshift(fft2(I2));%将灰度图像的二维不连续Fourier变换的零频率成分移到频谱的中心
[M,N]=size(s);%分别返回s的行数到M中,列数到N中
n=2;%对n赋初值
n1=floor(M/2);%对M/2进行取整
n2=floor(N/2);%对N/2进行取整
d0=10;%初始化d0
fori=1:
M
forj=1:
N
d=sqrt((i-n1)^2+(j-n2)^2);%点(i,j)到傅立叶变换中心的距离
if(d==0)
h=0;
else
h=1/(1+0.5*(d0/d)^(2*n));%BHPF滤波函数
end
s(i,j)=h*s(i,j);%ILPF滤波后的频域表示
end
end
s=ifftshift(s);%对s进行反FFT移动
s=im2uint8(real(ifft2(s)));
subplot(1,2,2);%创建图形图像对象
imshow(s);%显示ILPF滤波后的图像
title('BHPF滤波后的图像(d=10)');%为图像添加标题
运行结果:
2.3指数型高通滤波(EHPF)
I1=imread('eight.tif');%读取图像
I2=im2double(I1);
figure,subplot(1,2,1);
imshow(I2);title('原始图像');
s=fftshift(fft2(I2));%将灰度图像的二维不连续Fourier变换的零频率成分移到频谱的中心
[M,N]=size(s);%分别返回s的行数到M中,列数到N中
n=2;%对n赋初值
n1=floor(M/2);%对M/2进行取整
n2=floor(N/2);%对N/2进行取整
d0=10;%初始化d0
fori=1:
M
forj=1:
N
d=sqrt((i-n1)^2+(j-n2)^2);%点(i,j)到傅立叶变换中心的距离
if(d==0)
h=0;
else
h=exp(log(1/sqrt
(2))*(d0/d)^2);%BLPF滤波函数
end
s(i,j)=h*s(i,j);%ILPF滤波后的频域表示
end
end
s=ifftshift(s);%对s进行反FFT移动
s=im2uint8(real(ifft2(s)));%对s进行二维反离散的Fourier变换后,取复数的实部转化为无符号8位整数
subplot(1,2,2);%创建图形图像对象
imshow(s);%显示ILPF滤波后的图像
title('EHPF滤波后的图像(d=10)');%为图像添加标题
运行结果:
2.4梯形高通滤波(THPF)
I1=imread('eight.tif');%读取图像
I2=im2double(I1);
figure,subplot(1,2,1);
imshow(I2);
title('原始图像');
s=fftshift(fft2(I2));%将灰度图像的二维不连续Fourier变换的零频率成分移到频谱的中心
[M,N]=size(s);%分别返回s的行数到M中,列数到N中
n=2;%对n赋初值
n1=floor(M/2);%对M/2进行取整
n2=floor(N/2);%对N/2进行取整
d0=5;d1=10;%初始化d0
fori=1:
M
forj=1:
N
d=sqrt((i-n1)^2+(j-n2)^2);%点(i,j)到傅立叶变换中心的距离
if(d<=d0)
h=0;
elseif(d0<=d1)
h=(d-d1)/(d0-d1);
elseh=1;
end
end
s(i,j)=h*s(i,j);%THPF滤波后的频域表示
end
end
s=ifftshi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字图像 处理 matlab 代码