数图各实验代码.docx
《数图各实验代码.docx》由会员分享,可在线阅读,更多相关《数图各实验代码.docx(11页珍藏版)》请在冰豆网上搜索。
数图各实验代码
实验一数字图像的基本操作与代数运算
1.对各RGB图像、索引图像、灰度图像,用imread读出图像文件,并用imshow将图像显示出来,并用iminfo给出图像信息。
观察一下图像数据的特点,理解数字图像在MATLAB中的处理就是处理一个矩阵,根据图像文件信息和图像数据矩阵的特点,确定图像的类型,体会各自数据的特点。
x=imread('RGBimageD.tiff')
imshow(x)
imfinfo('RGBimageD.tiff')
2.选择一幅RGB彩色图像(图像RGBimageA),分别显示出原图像和R、G、B三个分量图像(用subplot函数显示在同一窗口中),观察对比它们的特点,体会不同颜色所对应的R、G、B分量的不同之处。
subplot(2,2,1),imshow(y),title('原图像');
subplot(2,2,2),imshow(y(:
:
1)),title('R分量');
subplot(2,2,3),imshow(y(:
:
2)),title('G分量');
subplot(2,2,4),imshow(y(:
:
3)),title('B分量');
3.将图像A中心部分选取出来,显示中心部分,并保存为与图像A相同格式的图像文件。
y=imread('RGBimageA.tiff')
A1=imcrop(y,[100,100,300,300]);
subplot(1,2,1),imshow(y),title('原图像');
subplot(1,2,2),imshow(A1),title('图像A的中心部分');
imwrite(A1,'A1.tiff','tiff')
4.选择一幅RGB图像(图像RGBimageB),使用imread和imwrite进行图像文件格式的相互转换(TIFF与JPG相互转换)。
z=imread('RGBimageB.tiff','tiff')
imwrite(z,'RGBimageB.jpg','jpg')
5.给灰度图像加入高斯噪声,并显示。
运用for循环,分别将5幅、50幅和500幅加有随机高斯噪声的图像进行相加并求其平均值。
将几种求平均后的图像显示在同一图像对话框中,比较其结果。
[I,M]=imread('eight.tif');
J=imnoise(I,'gaussian',0,0.02);
subplot(1,2,1),imshow(I,M),title('原图像');
subplot(1,2,2),imshow(J,M),title('加噪声后图像');
[m,n]=size(I);
K=zeros(m,n);
fori=1:
100
J=imnoise(I,'gaussian',0,0.02);
J1=im2double(J);
K=K+J1;
end
K=K/100;%求图像的平均
figure;imshow(K),title('相加求平均后的图像');
6.自行下载两幅的图像,进行相加、相减、相乘的代数运算(注意运算时候图像的尺寸、类型等,如果不同,应将尺寸较大的图像裁剪或缩放),显示运算之前和运算之后的图像。
四种图像处理代数运算的数学表达式如下:
其中A(x,y)和B(x,y)为输入图像,而C(x,y)为输出图像。
7.选择一幅索引图像,将图像文件读出,并将这个图像显示出来。
尝试修改MAP颜色矩阵的值,再将图像显示出来,观察图像颜色的变化。
(选做)
[X,MAP]=imread('flowers.tif','tif');
MAP1=MAP+MAP;
subimage(X,MAP1);
实验二图像的灰度变换与空域滤波
1.显示图像A及其灰度直方图。
用imadjust函数将它的灰度值调整到[0,1]之间,并观察调整后的图像与原图像的差别,调整后的灰度直方图与原灰度直方图的区别;改变灰度值调整范围,观察调整后的图像的变化及其与原图像的差别,调整后的灰度直方图的变化及其与原灰度直方图的区别;进一步利用改变灰度值调整范围,实现图像的反转。
X=imread('A.tif');
Y=imadjust(X,[0.20.8],[]);
Z=imadjust(X,[],[1,0]);
subplot(3,2,1),imshow(X),title('图像A');
subplot(3,2,2),imhist(X),title('原图像的灰度直方图');
subplot(3,2,3),imshow(Y),title('调整后的图像A');
subplot(3,2,4),imhist(Y),title('调整后的灰度直方图');
subplot(3,2,5),imshow(Z),title('反转后的图像A');
subplot(3,2,6),imhist(Z),title('反转后的灰度直方图');
2.读取灰度图像B,用histeq函数将原始图像的灰度直方图均衡化,同时观察均衡化后的图像与前面图像的差别,均衡化后的灰度直方图与前面的灰度直方图的区别。
I=imread('B.tif');
J=histeq(I);
subplot(2,2,1),imshow(I),title('图像B');
subplot(2,2,2),imhist(I,64),title('图像B的直方图');
subplot(2,2,3),imshow(J),title('均衡化的图像B');
subplot(2,2,4),imhist(J,64),title('均衡化图像B的直方图');
3.给图像C加入高斯噪声,分别采用不同大小的模板对加有噪声的图像进行均值滤波,用一个图像处理对话框(subplot)显示原图像、加有噪声的图像及均值滤波的图像。
比较结果。
X=imread('C.tif');
Y=imnoise(X,'gaussian',0,0.005);
Z1=filter2(fspecial('average',3),Y)/255;
Z2=filter2(fspecial('average',5),Y)/255;
Z3=filter2(fspecial('average',7),Y)/255;
Z4=filter2(fspecial('average',9),Y)/255;
subplot(2,3,1),imshow(X),title('图像C');
subplot(2,3,2),imshow(Y),title('加入高斯噪声的图像C');
subplot(2,3,3),imshow(Z1),title('均值滤波模版尺寸为3');
subplot(2,3,4),imshow(Z2),title('均值滤波模版尺寸为5');
subplot(2,3,5),imshow(Z3),title('均值滤波模版尺寸为7');
subplot(2,3,6),imshow(Z4),title('均值滤波模版尺寸为9');
4.分别采用不同大小的模板对上述加有噪声的图像进行中值滤波,用一个图像处理对话框(subplot)显示原图像、加有噪声的图像及中值滤波的图像。
比较结果。
X=imread('C.tif');
Y=imnoise(X,'gaussian',0,0.005);
I1=medfilt2(Y,[3,3]);
I2=medfilt2(Y,[7,7]);
subplot(2,2,1),imshow(X),title('图像C');
subplot(2,2,2),imshow(Y),title('加入高斯噪声的图像C');
subplot(2,2,3),imshow(I1),title('3×3模版');
subplot(2,2,4),imshow(I2),title('7×7模版');
实验三图像的频域处理
1.读取图像A(lena.tiff)和B(rice.tif),显示这两幅图像,对图像作傅立叶变换,显示图像的傅里叶幅度谱和相位谱。
做傅立叶逆变换,显示重建图像,看是否与原图像相同。
A=imread('lena.tiff');
B=imread('rice.tif');
I=fftshift(fft2(A));
J=fftshift(fft2(B));
subplot(2,3,1),imshow(A);
subplot(2,3,2),imshow(log(1+abs(I)),[]);
subplot(2,3,3),imshow(angle(I));
subplot(2,3,4),imshow(B);
subplot(2,3,5),imshow(log(1+abs(J)),[]);
subplot(2,3,6),imshow(angle(J));
X=ifft2(I);
Y=ifft2(J);
subplot(2,3,1),imshow(A),title('图像A');
subplot(2,3,2),imshow(log(1+abs(I)),[]),title('二维傅里叶变换');
subplot(2,3,3),imshow(log(abs(X)),[]),title('逆变换后图像');
subplot(2,3,4),imshow(B),title('图像B');
subplot(2,3,5),imshow(log(1+abs(J)),[]),title('二维傅里叶变换');
subplot(2,3,6),imshow(log(abs(Y)),[]),title('逆变换后图像');
2.设计一个简单的巴特沃斯低通滤波器(截止频率自选),对图像A作频域低通滤波,再作反变换,观察两种不同的截止频率下反变换后的图像与原图像的区别。
A=imread('lena.tiff');
PQ=paddedsize(size(A));
D0=0.01*PQ
(1);
H=lpfilter('btw',PQ
(1),PQ
(2),D0);
g=dftfilt(A,H);
subplot(1,2,1),imshow(A),title('原图像');
subplot(1,2,2),imshow(g,[]),title('D0较小的滤波');
A=imread('lena.tiff');
PQ=paddedsize(size(A));
D0=0.08*PQ
(1);
H=lpfilter('btw',PQ
(1),PQ
(2),D0);
g=dftfilt(A,H);
subplot(1,2,1),imshow(A),title('原图像');
subplot(1,2,2),imshow(g,[]),title('D0较大的滤波');
3.(选做内容)设计一个高斯高通滤波器(截止频率自选),对图像B作高频增强滤波,再作反变换,观察两种不同的截止频率下反变换后的图像与原图像的区别。
B=imread('rice.tif');
PQ=paddedsize(size(B));
D0=0.01*PQ
(1);
HBW=hpfilter('gaussian',PQ
(1),PQ
(2),D0,2);
H=0.5+2*HBW;
g=dftfilt(B,H);
subplot(1,2,1),imshow(B),title('原图像');
subplot(1,2,2),imshow(g,[]),title('D0较小的滤波');
B=imread('rice.tif');
PQ=paddedsize(size(B));
D0=0.1*PQ
(1);
HBW=hpfilter('gaussian',PQ
(1),PQ
(2),D0,2);
H=0.5+2*HBW;
g=dftfilt(B,H);
subplot(1,2,1),imshow(B),title('原图像');
subplot(1,2,2),imshow(g,[]),title('D0较大的滤波');
实验四图像复原
利用imnoise3对图像I进行加入参数为C=[032;064;1616;320;640;-1616]的周期噪声,得到图像J。
对含噪图像J进行陷波滤波图像复原。
要求列出各个步骤的运行代码。
显示I,J,差分图像I-I'。
显示I、J、以及噪声的频谱。
img=im2double(imread('peppers.tiff'));
C=[032;064;1616;320;640;-1616];
A=[100020003000400050006000];
[r,R,S]=imnoise3(512,512,C,A);
img_noise=img+r;
F0=fft2(img);
F0=fftshift(F0);
F=fft2(img_noise);
F=fftshift(F);
sizec=size(img);
H=ones(sizec
(1),sizec
(2));
x0=sizec
(1)/2+1;
y0=sizec
(2)/2+1;
x=x0;
w=0.4*2*pi;
N=2*pi/w;
y=y0-round(sizec
(2)/N);
H(x,y-3:
y+3)=0;
H(x,(y0-y)+y0-3:
(y0-y)+y0+3)=0;
I=ifftshift(F.*H);
img1=ifft2(I);
subplot(4,2,1),imshow('peppers.tiff'),title('原图像');
subplot(4,2,2),imshow(img),title('原图转double类型');
subplot(4,2,3),imshow(S),title('规定脉冲的谱');
subplot(4,2,4),imshow(r,[]),title('空间域中相应的正弦噪声模式');
subplot(4,2,5),imshow(img_noise),title('加噪图像');
subplot(4,2,6),imshow(log(1+abs(F0)),[]),title('原图像频谱');
subplot(4,2,7),imshow(log(1+abs(F)),[]),title('加噪图像频谱');
subplot(4,2,8),imshow(img1,[]),title('陷波滤波结果');
实验五图像变化与编码
1.已知符号{x1,…x8}对应概率为0.4,0.18,0.1,0.1,0.07,0.06,0.05,0.04。
按教材图8.2的方式将其转换为霍夫曼码(编码过程写在实验报告中),并利用huffman.m转换为霍夫曼码,对照结果是否相同。
p=[0.40.180.10.10.070.060.050.04];
c=huffman(p)
结果如下:
c=
'1'
'010'
'0111'
'000'
'0011'
'0010'
'01101'
'01100'
2.对给定图像I利用mat2huff.m,huff2mat.m进行霍夫曼编码、解码。
计算压缩率CR。
>>I=imread('Tracy.tif');
>>J=mat2huff(I);
>>cr1=imratio(I,J)
cr1=
1.2191
>>save('tracy.mat','J');
>>cr2=imratio('Tracy.tif','tracy.mat')
cr2=
1.2386
>>loadtracy.mat
>>K=huff2mat(J);
>>L=imread('Tracy.tif');
>>rmse=compare(K,L)
rmse=
0
3.对给定图像I先进行预测编码、霍夫曼编码,然后进行霍夫曼解码、预测解码。
计算压缩率CR。
显示预测误差图像x-xˆ。
预测器采用xˆ=(A+B+C)/3,如下图所示:
A
C
B
x
比较该预测器与mat2lpc所指定的预测器性能差异(CR与执行速度)。
(提示:
可参考mat2lpc.m,lpc2mat.m,或采用循环方式设计预测器,执行速度可用tic,toc)。
>>x=imread('Tracy.tif');
>>tic
>>e1=mat2lpc(x);
>>toc
Elapsedtimeis20.392000seconds.
>>tic
>>e2=mymat2lpc(x);
>>toc
Elapsedtimeis17.553000seconds.
>>figure;imshow(e1,[]);
>>figure;imshow(e2,[]);
>>EN=[entropy(x),entropy(e1),entropy(e2)]
EN=
6.51473.97413.8448
>>y1=mat2huff(e1);
>>y2=mat2huff(e2);
>>z1=huff2mat(y1);
>>z2=huff2mat(y2);
>>x1=lpc2mat(z1);
>>x2=mylpc2mat(z2);
>>ComRatio=[imratio(x,y1),imratio(x,y2)]
ComRatio=
1.99522.0646
>>compare(x,x1)
ans=
0
>>compare(x,x2)
ans=
0
实验六综合实验
1、对给定的一幅彩色图像F进行图像增强,结果保存为BMP图像G。
win=[5,5];
img=imread('F.tiff');
x=img(:
:
1);
y=img(:
:
2);
z=img(:
:
3);
X=medfilt2(x,win);
Y=medfilt2(y,win);
Z=medfilt2(z,win);
G=cat(3,X,Y,Z);
imwrite(G,'G.bmp','bmp');
subplot(1,2,1),imshow(img),title('原图像');
subplot(1,2,2),imshow(G),title('原图像用中值滤波去除椒盐噪声');
2、将图像G以JPEG格式进行压缩,质量因子设为70,结果保存为JPG图像J。
A=imread('G.bmp');
imwrite(A,'J.jpg','jpg','quality',70);
imshow('J.jpg'),title('图像G以JPEG格式压缩');
3、
(1)计算J相对于G的均方根误差RMSE。
B=imread('J.jpg');
rmse=compare(A,B)
rmse=
5.5879
(2)计算J相对于G的压缩率CR。
cr=imratio(A,B)
cr=
1
4.提取图像G的边缘(幅值),结果保存为K。
K=imread('G.bmp');
K1=im2double(K);
K2=rgb2gray(K1);
[thr,sorh,keepapp]=ddencmp('den','wv',K2);
K3=wdencmp('gbl',K2,'sym4',2,thr,sorh,keepapp);%小波滤除
K4=medfilt2(K3,[99]);%中值滤波
K5=imresize(K4,0.2,'bicubic');%图像大小
BW1=edge(K5,'sobel');
BW2=edge(K5,'roberts');
BW3=edge(K5,'prewitt');
BW4=edge(K5,'log');
BW5=edge(K5,'canny');
h=fspecial('gaussian',5);%高斯滤波
BW6=edge(K5,'zerocross',[],h);
subplot(2,3,1),imshow(BW1),title('Sobel算子');
subplot(2,3,2),imshow(BW2),title('Roberts算子');
subplot(2,3,3),imshow(BW3),title('Prewitt算子');
subplot(2,3,4),imshow(BW4),title('Log算子');
subplot(2,3,5),imshow(BW5),title('Canny算子');
subplot(2,3,6),imshow(BW6),title('零交叉算子');
[VG,A,PPG]=colorgrad(G);
figure,imshow(VG);
imwrite(VG,'K.tiff','tiff');