数字图像滤波处理.docx
《数字图像滤波处理.docx》由会员分享,可在线阅读,更多相关《数字图像滤波处理.docx(21页珍藏版)》请在冰豆网上搜索。
数字图像滤波处理
数字图像处理报告
学生姓名:
饶燎
学号:
20101004121
指导老师:
李杏梅
中国地质大学(武汉)机械与电子信息学院
2013年4月
报告代码及误代码解决方案
1题
f=imread('map.jpg');%读取rgb彩色图片
n=rgb2gray(f);%将彩图转换成灰度图
figure,imshow(n)%显示灰度图
结果
无错误
2题
f=imread('map.jpg');
figure,imshow(f),whitebg('white'),title('原图');%显示原图像
n=rgb2gray(f);%彩图到灰度图像变换
r=f;g=f;b=f;
figure
subplot(2,2,1),imshow(n),title('灰度图');
r(:
:
2)=0;r(:
:
3)=0;%将非r分量行填零
g(:
:
1)=0,g(:
:
3)=0;%将非g分量行填零
b(:
:
1)=0,b(:
:
2)=0;%将非b分量行填零
subplot(2,2,2),imshow(r,8),whitebg('white'),title('提取r分量');
subplot(2,2,3),imshow(g,8),title('提取g分量');
subplot(2,2,4),imshow(b,8),title('提取b分量');
[hsi]=rgb2hsi(f);%根据rgb与hsi的映射关系提取hsi分量
H=hsi(:
:
1);
S=hsi(:
:
2);
I=hsi(:
:
3);
figure
subplot311,imshow(H);
subplot312,imshow(S);
subplot313,imshow(I)
HSI函数
unction[hsi]=rgb2hsi(f)
%hsi=rgb2hsi(rgb)把一幅RGB图像转换为HSI图像,
%输入图像是一个彩色像素的M×N×3的数组,
%其中每一个彩色像素都在特定空间位置的彩色图像中对应红、绿、蓝三个分量。
%假如所有的RGB分量是均衡的,那么HSI转换就是未定义的。
%输入图像可能是double(取值范围是[0,1]),uint8或uint16。
%
%输出HSI图像是double,
%其中hsi(:
:
1)是色度分量,它的范围是除以2*pi后的[0,1];
%hsi(:
:
2)是饱和度分量,范围是[0,1];
%hsi(:
:
3)是亮度分量,范围是[0,1]。
%抽取图像分量
f=im2double(f);
r=f(:
:
1);
g=f(:
:
2);
b=f(:
:
3);
%执行转换方程
num=0.5*((r-g)+(r-b));
den=sqrt((r-g).^2+(r-b).*(g-b));
theta=acos(num./(den+eps));%防止除数为0
H=theta;
H(b>g)=2*pi-H(b>g);
H=H/(2*pi);
num=min(min(r,g),b);
den=r+g+b;
den(den==0)=eps;%防止除数为0
S=1-3.*num./den;
H(S==0)=0;
I=(r+g+b)/3;
%将3个分量联合成为一个HSI图像
hsi=cat(3,H,S,I);
部分正确代码
r=f;g=f;b=f;
figure
subplot(2,2,1),imshow(n),title('灰度图');
r(:
:
2)=0;r(:
:
3)=0;%将非r分量行填零
g(:
:
1)=0,g(:
:
3)=0;%将非g分量行填零
b(:
:
1)=0,b(:
:
2)=0;%将非b分量行填零
部分错误代码
r=f(:
:
1);
G=f(:
:
2);
B=f(:
:
3);
错误结果
显示的rgb分量图全是灰度图像,不是彩图分量图
错误分析
Rgb为三维图像,当直接提取地三维的每一个分量后就变成二维图片,成了灰度图
解决方法
将没有提取的另两个分量填零,图片仍然是三维的,显示结果与预想一致
3题
f=imread('map.jpg');
F=fft2(f);%傅里叶变换
figure
subplot121,imshow(f);
title('原图');
subplot122;
imshow(F);
title('傅里叶变换图像')
无错误
4题
f=imread('map.jpg');
m=rgb2gray(f);%彩图转换成灰度图
figure
subplot221,imshow(m),title('原图');
n=256-m;%灰度求反
k=imadjust(m,[0.40.7],[01]);%亮度调整
u=im2uint8(mat2gray(log(1+double(m))));%8位对数压缩
[p]=imadjust_sec(m,60,220);%灰度切分
subplot222,imshow(n);
title('求反图');
subplot223,imshow(k);
title('对比图');
subplot224,imshow(u);
title('对数压缩图');
figure,imshow(p),title('灰度切分图');
灰度切分函数
function[z]=imadjust_sec(x,a,b)
%UNTITLEDSummaryofthisfunctiongoeshere
%灰度切分
[hight,width]=size(x);
x1=im2double(x);
fori=1:
hight
forj=1:
width
ifx(i,j)>a&x(i,j)
x(i,j)=b;
end
z(i,j)=x(i,j);
end
End
错误代码
f=imread('map.jpg');
m=rgb2gray(f);%彩图转换成灰度图
n=256-m;%灰度求反
k=imadjust(m,[0.40.7],[01]);%亮度调整
u=im2uint8(mat2gray(log(1+double(m))));%8位对数压缩
[p]=imadjust_sec(m,60,220);%灰度切分
figure
subplot221,imshow(m),title('原图');
subplot222,imshow(n);
title('求反图');
错误结果
显示的原图与灰度切分图一模一样
错误分析
在执行imadjust_sec函数时有ifx(i,j)>a&x(i,j)显然此时的原图像灰度值已被改变为与灰度切分后的灰度值一样,所以原图与灰度切分图一样
解决方法
将原图显示在灰度切分函数执行前,则显示的灰度图未被改变
5题
f=imread('map.jpg');
k=rgb2gray(f);%彩图转换成灰度图
figure,imhist(k);%绘制直方图
title('直方图');
g=histeq(k,256);%直方图均衡化
figure,imshow(g);
title('均衡化后的图像');
figure,imhist(g)
无错误
6题
f=imread('map.jpg');
k=rgb2gray(f);%彩图变灰度图
j=imnoise(k,'salt&pepper',0.2);%加入椒盐噪声
figure
subplot(2,2,1);imshow(j);
title('加入椒盐噪声的图像');
subplot222;imshow(k);
title('原图像');
%空域滤波
m=fspecial('average',4);%维度为4的均值滤波器算子
g=imfilter(k,m);%对图像进行均值滤波
subplot223;
imshow(g);
title('空域均值滤波后的图像');
%频域滤波
u=fspecial('disk',5);%维度为5的圆形算子
[M,N]=size(k);%原图像的尺度
F=fft2(k);%原图像的频谱
sig=10;
H=fft2(u,M,N);%滤波器的频谱
G=H.*F;%频域滤波
q=real(ifft2(G));%求出时域滤波图像
subplot224;
imshow(q,[]);
title('频率处理后的图像');
错误代码提示
H=fft2(u);
?
?
?
Errorusing==>times
Matrixdimensionsmustagree.
Errorin==>ltat21
G=H.*F;%频域滤波
错误原因
U的傅里叶变换H的维度与G不匹配
解决方法
H=fft2(u,M,N);
经过该变化后的H维度与G匹配且都为M*N形
7题
f=imread('map.jpg');
I=rgb2gray(f);%彩图转换成灰度图
I=im2double(I);%强制转换成双精度
[heightwidthR]=size(I);%原图像尺寸
%Dx=[-1-2-1
%000
%121];
%Dy=[-101
%-202
%-101];
%空域处理
fori=2:
height-1
forj=2:
width-1
Dx=[I(i+1,j-1)-I(i-1,j-1)]+2*[I(i+1,j)-I(i-1,j)]+[I(i+1,j+1)-I(i-1,j+1)];
Dy=[I(i-1,j+1)-I(i-1,j-1)]+2*[I(i,j+1)-I(i,j-1)]+[I(i+1,j+1)-I(i+1,j-1)];%sobel算子
S(i,j)=sqrt(Dx^2+Dy^2);%sobel算子锐化
end
end
figure,
subplot221,imshow(S),title('第一次锐化图');%sobel算子锐化处理图——效果不明显
T=S;
fori=1:
height-1
forj=1:
width-1
if(S(i,j)<0.4)
S(i,j)=1;
elseS(i,j)=0;
end
end
end
subplot222;
imshow(S,[]);
title('sobel算子锐化处理后图像');%sobel算子量化锐化——第二次锐化不明显
[m,n]=size(T);
AS(1:
m,1:
n)=I(1:
m,1:
n)+T(1:
m,1:
n);%与原图叠加保留部分低频
subplot223;
imshow(AS);title('叠加图');%
%频域锐化
h=fspecial('laplacian');%得到robert算子
H=fft2(h,height,width);%robert算子的傅里叶变化
G=fft2(I,height,width);
P=H.*G;%sobel频率滤波
g=real(ifft2(P));
[p,q]=size(g);
A(1:
p,1:
q)=I(1:
p,1:
q)+g(1:
p,1:
q)
subplot224,imshow(A),title('频域锐化叠加图');
错误分析
在代码里已经显示过,第一次空域滤波效果不明显,只保留了轮廓边缘(高频成分),对于细节部分(低频成分)则完全滤除,锐化过于剧烈
解决方法
将苏泊尔算子量化处理,保留少部分低频,但效果依然不明显,所以将原图与算子锐化后的图像叠加,基本保留原图像的低频成分,但高频部分则完全对比凸显了出来,效果较明显
8题
I=imread('map.jpg');
%按图像比例压缩
X1=imresize(I,1)
X2=imresize(I,0.5)
X3=imresize(I,0.25)
X4=imresize(I,0.1)
figure
subplot221,imshow(X1),title('原始图像')
subplot222,imshow(X2),title('缩小0.5倍')
subplot223,imshow(X3),title('缩小0.25倍')
subplot224,imshow(X4),title('缩小0.1倍')
%jpeg压缩
loadwoman;
figure
subplot(2,2,1);
image(X);
colormap(map);
title('原始图像');
axissquare;
[c,s]=wavedec2(X,2,'bior3.7');%小波二层分解
ca1=appcoef2(c,s,'bior3.7',1);%小波二维分解
ca2=detcoef2('h',c,s,1);%提取分解后的高频小波系数
ca3=detcoef2('v',c,s,1);
ca4=detcoef2('d',c,s,1);
a1=wrcoef2('a',c,s,'bior3.7',1);%重构低频小波分量
h1=wrcoef2('h',c,s,'bior3.7',1);
v1=wrcoef2('v',c,s,'bior3.7',1);
d1=wrcoef2('d',c,s,'bior3.7',1);
c1=[a1,h1;v1,d1];
subplot(2,2,2);
image(c1);
axissquare;
title('分解后低频和高频信息');
ca1=appcoef2(c,s,'bior3.7',1);
ca1=wcodemat(ca1,440,'mat',0);%对图像矩阵进行伪彩色编码
ca1=0.5*ca1;
subplot(2,2,3);
image(ca1);
colormap(map);%索引彩图
axissquare;
title('一次压缩');
disp('第一次压缩后的大小为');
whos('ca1')
ca2=appcoef2(c,s,'bior3.7',2);
ca2=wcodemat(ca2,440,'mat',0);
ca2=ca2*0.25;
subplot(2,2,4);
image(ca2);
colormap(map);
axissquare
title('二次压缩');
disp('第二次压缩后的大小为');
whos('ca2')
难点分析
小波压缩的部分代码较难理解,在进行二次压缩时的重构低频分量和分解原图像系数时进行了伪彩色编码,这使得高频小波系数绝大部分丢失,图像变得很平滑,甚至有失真现象
解决方法
选取的为彩色编码系数不能太大或太小,经综合分析及不断调试,选取系数在400~500之间效果较明显。
九题
f=imread('map.jpg');
a=rgb2gray(f);
b=imnoise(a,'salt&pepper',0.005);%加入椒盐噪声
c=edge(a,'sobel',0.12);%用诺伯特算子进行边缘检测
subplot311,imshow(a);title('原图');
subplot312,imshow(b);title('加噪声后的图');
subplot313,imshow(c);title('边缘检测图')
难点分析
用诺伯特算子进行边缘检测时,选取的边缘系数不能过大,否则会使抽样点数过少,导致图像失真。
但若系数选取过小,则会造成人物边缘部分与周围环境重合,提取不出特征点出来
解决方法
经反复调试,选取的边缘系数在0.01~0.04之间效果较明显
实验目的和意义
通过用matlab编写数字图像处理的一些基本算法程序,巩固课堂上学习的理论知识,掌握数字图像处理的基本技能,同时提高我们的编程能力,并通过实际编程来了解图像处理软件的实现的基本原理,为我们能够解决实际问题奠定基础。
前段时间,在数字图像处理的理论知识学习过程中,我对理论概念理解不透彻记忆不深刻,比如我甚至分不清高通滤波、低通滤波、中值滤波各是用来干什么的,通过自己编程实习,我知道了他们的作用和原理。
还有,这次我学习到了图片的不同存储格式。
总之,这次实验将我以前学习的零碎的编程知识融会贯通起来,使我的编程水平有了一定的提高。
虽然我大部分时间是在照着书敲代码,但后来,我能够在理解书上的代码意义的基础上对书上的错误进行改正并对书上的的代码进行改进创新。
参考文献
[1]孙兆林.MATLAB6.X图像处理[M].北京,清华大学出版社,2002:
175~230
[2]姚敏.数字图像处理[M].北京,机械工业出版社,2006:
1~87
[3]刘慧颖.MATLAB2006a基础教程[M].北京,清华大学出版社,2007
[4]王宏民,宋莹莹,付源.空域法进行图像增强处理在MATLAB中的仿真与分析[J],煤矿机械,2005,5:
56~58
[5]金钟,汪炳权.B超图像模糊增强处理[J].合肥工业大学学报(自然科学版社)2005,28(7):
768~771
[8]RafaelC.Gonzalez,RichardE.Woods,阮秋琦,阮宇智等译,数字图像处理(第二版),北京,电子工业出版社,2005