实验一Matlab图像处理工具箱的初步练习
一. 实验目的
1. 掌握有关数字图像处理的基本概念;
2. 熟悉Matlab图像处理工具箱;
3. 熟悉使用Matlab进行数字图像的读出和显示;
4. 熟悉运用Matlab指令进行图像旋转和缩放变换。
二. 练习
1. 文件的读入与显示
(1) 运行Matlab。
(2) MATLAB窗口构成:在缺省的情况下,由三个窗口组成。命令窗口(command window)、命令历史(command history)、工作空间(workspace)。
注意:缺省窗口的设置步骤为:MATLAB菜单/view选项/Desktop layout/default。
(3) 调入一个文件:i=imread('pout.tif');%注意:前面的“%”是用于注释的,不会被执行,只是说明这个语句的作用。
此时的i出现在什么窗口?是什么类型的变量?大小是多少?
(4) 显示这幅图:imshow(i);
(5) 将变量i转置成j,即j=i';显示j即imshow(j);%在胸前左侧花纹怎么会跑到右边的呢?
举一个例子加以验证:设a=[1 2 3 4 5;6 7 8 9 10;11 12 13 14 15];b=a’;此时的b与a有什么区别?
(6) 写入到一个新的图像文件'abc.tif'中,即imwrite(j,'abc.tif')。
(7) 清除变量命令:clear
执行这个命令后,workspace窗口中的变量有没有?怎么验证?
(8) 清除用户开设的窗口命令:close all
(9) 调入图像文件'abc.tif'并显示。
问题:
(1) 操作符“’”是图像的转置的意思,转置两次后,是否回到原图像?
(2) 命令后的符号“;”所起的作用是什么?
(3) 命令是否可以大写母?
2. 灰度图像
分别选择不同的灰度级(如2、4、16、64、128个)来显示同一幅图像(如testpat1.tif)。
i=imread('testpat1.tif');
figure,imshow(i,2) %显示2个灰度级
figure,imshow(i,4) %显示4个灰度级
figure,imshow(i,16) %显示16个灰度级
figure,imshow(i,64) %显示64个灰度级
figure,imshow(i,128) %显示128个灰度级
3. RGB图像
RGB = imread('ngc6543a.jpg');%RGB为650*600*3
imshow(RGB);
将这一图写入到abc.jpg文件中去,并用“画图”进行编辑。使用菜单“图像”/“属性”,将此图的尺寸改为300*300,其效果如何?
问题:
(1) 将一幅图像改变它的尺寸时,其分辨率是不改变?(使用windows的“图画”工具)
(2) 如何使用“画图”中的拉伸功能,实现图像的缩小?
(3) 2006年,市场上100万像素是什么意思?
4. 在Matlab中,函数imresize(X,M,method)可用来改变图像的大小,其中X表示图像,实数M>0是放大倍数,method用来选择计算数据的方法,其可取值及意义分别为:
‘nearest’--最近邻插值法,’bilinear’--双线性插值法,’bicubic’--双三次插值法。
我们看下面这段程序:
I=imread('circuit.tif');
J=imresize(I,1.25);
imshow(I)
figure,imshow(J)
程序运行后得到如下的结果:
也可以指定目标图像的大小,此时imresize()的调用格式为:
Y=imresize(X,[320,480])
其中[320,480]表示将图像的大小调整为320×480。
5. 函数imrotate对图像进行旋转操作,我们看如下的程序段:
I=imread('cameraman.tif');
J=imrotate(I,-15,'bilinear');
K=imrotate(I,-15,'bilinear','crop');
imshow(I)
figure,imshow(J)
figure,imshow(K)
程序运行后得到如下的结果:
左边是原图,中间和右边是旋转后的结果,注意右边的图像和中间图像的区别,右边的图像是由参数’crop’ 实现的,该参数表示将旋转后的图像取与原图像相同的中心部分输出。
三. 实验内容
1.从磁盘上读入图像“cameraman.tif”,将其分别放大到1.5倍(用“bilinear”方法)和2.6倍(用“bicubic”方法),显示在不同的图像窗口中。
2.从磁盘上读入图像“lena.tif”,将其放大2倍,并将结果用BMP格式以“lena.bmp”为文件名,写入磁盘。(用imwrite命令,该命令的用法请用help imwrite查看)
3.给定一幅图像,如lena.bmp,分别将其顺时针旋转450,逆时针旋转300。
4. 给定一幅图像,如lena.bmp,以不同灰度级显示,比较显示的不同效果。
四. 实验报告要求
1.实验目的;
2.实验基本原理;
3.实验步骤
4.源程序;
5.处理前后的图像;
6.实验结论;
7.实验收获、体会。
实验二图像的增强
一. 实验目的
1. 熟悉直方图的计算和显示;
2. 熟悉通过算术运算进行图像增强的方法;
3. 熟悉运用直方图变换进行图像增强的原理。
二. 实验原理
1. 直方图
在数字图像处理中,一种最简单和最有用的工具是直方图,它概括了一幅图像的灰度级内容。
(1)函数:imhist(I,n)
功能:显示指定图像的直方图。
语法格式:
Imhist(I,n)
Imhist(X,map)
[counsts,x]=imhist(…)
说明:I为输入图像,n为指定的灰度级数目,默认值为256。Imhist(X,map)计算和显示索引色图像为X的直方图,map为调色板。[counsts,x]=imhist(…)返回直方图数据向量counts或相应的色彩值向量x。
(2)函数:imadjust
功能:将图像的灰度值映像为一个新的数值范围。
语法格式:J=imsdjust(I,[low_in high_in],[low_out high_out],gamma)
newmap=imadjust(map,[low high],[bottom top],gamma)
说明:
I是输入图像矩阵,J是经过直方图变换后的输出图像矩阵。Low_in参数和high_in参数分别用来指定输入图像需要映像的灰度范围,参数Low_out和high_out指定输出图像所在的灰度范围。
newmap=imadjust(map,[low high],[bottom top],gamma)命令是调整索引色图像的调色板map。此时若[low high]和[bottom top]都是2×3矩阵,就根据它们的值分别调整R、G、B三个分量。
不管I属于哪一类,此处指定的强度值的范围均为[1,0]。如果I是unint8,则会将用户指定的值乘以255,然后将得到的结果作为实际的强度使用。如果I是unint16,则会乘以65536。
Gamma是一个可选参数。一般来说灰度间的映像是直线,但是通过调整gamma参数可以使其变为非线性的映像。
(3)直接的灰度变换曲线可以取得增强对比度的效果,对于低值灰度的图像,有时使用对数变换效果更好。对数变换可以扩展低值灰度,压缩高值灰度,这样可以使低值灰度的图像细节更容易看清楚。
对数变换的灰度映像采用如下表达式:
(+
=y
x
f
x
y
g
)
,
)1
,
)
log(
(
2. 直方图均衡化
函数:histeq
功能:实现对输入图像的直方图均衡化。
语法格式:
J=histeq(I,hgram)
J= histeq(I,n)
[J,T]= histeq(I,…)
newmap= histeq(X,map,hgram)
newmap= histeq(X,map)
[newmap,T]=histeq(X,…)
说明:
其中,n表示输出图像的灰度级数目,是一个可选参数,缺省值为64。
J=histeq(I,hgram)是将原图像I的直方图变成用户指定的向量hgram,hgram中的各元素值域为[0,1]。
[J,T]=histeq(I,…)返回能从图像I的灰度直方图变换成图像J的直方图的变换T。
newmap= histeq(X,map)用来对索引图像进行处理,索引图像的返回值newmap将是输出图像的调色板。
J= histeq(I,n)将原图像I转换成具有指定灰度级数目的输出图像J。
newmap= histeq(X,map,hgram)将索引图像X的直方图变成用户指定的向量hgram,hgram中的各元素值域为[0,1]。
[newmap,T]=histeq(X,…)返回能从索引图像I的直方图变成索引图像J的直方图的变换T。
3. 直方图规定化
在Matlab中可以调用函数J=histeq(I,hgram)来实现直方图规定化。其中hgram是由用户指定的矢量,规定将原始图像I的直方图近似变换成hgram,hgram中的每一个元素都在[0,1]中。
4. 代数运算
Matlab工具箱中提供了一个函数imnoise来给图像增添噪声。
函数:imnoise
功能:给图像增添不同种类的噪声。
语法格式:
J=imnoise(I,type)
J=imnoise(I,type,parameters)
说明:其中,参数type指定噪声的种类,parameters是与噪声种类有关的集体参数。I是输入图像,J 是对I增添噪声后的输出图像。如表2-1所示。
表2-1 噪声种类及参数说明
三. 实验内容
1. 直方图
(1)同时显示一幅图像(如pout.tif)及其直方图。
参考程序:
I=imread('pout.tif');
subplot(1,2,1);
imshow(I);
title('原图像');
axis square;
subplot(1,2,2);
imhist(I);
title('图像的直方图');
axis square;
(2)通过对比度扩展增强图像rice.tif的对比度。
要求:将该图像从灰度范围[0.15,0.9] 映像到[0,1],同时显示原图像及其直方图,变换后的图象及其直方图,并说明实验效果有何变化。
参考程序:
I=imread('rice.tif');
subplot(2,2,1);
imshow(I);
title('原图像');
subplot(2,2,2);
imhist(I);
title('原图像直方图');
J=imadjust(I,[0.15 0.9],[0 1]);
subplot(2,2,3);
imshow(J);
title('变换后图像');
subplot(2,2,4);
imhist(J);
title('变换后图像直方图');
结论:通过将图像从灰度范围[0.15,0.9]映像到[0,1],图像的对比度明显增加。
(3)采用对数变换法来改善图像质量。
给定一幅图像pout.tif,将图像转换为double类型,然后进行灰度的对数变换,同时显示原图像以及对数变换后的增强图像。
参考程序:
I=imread('pout.tif');
subplot(1,2,1);
imshow(I); %对数运算不支持unit8类型,将图像转换为double类型
title('原始图像');
I=double(I);
J=log(I+1); %进行灰度的对数变换
subplot(1,2,2);
imshow(mat2gray(J));
title('对数变换后的增强图像');
结论:经过对数变换后图像窗格等细节更加清楚。
2. 直方图均衡化
(1)对一个给定图像(如tire.tif)进行直方图均衡化,同时显示原图像及直方图,以及均衡化后的图像及直方图,并绘制出直方图均衡化的转移函数变换曲线,通过实验,得出什么结论。
参考程序:
I=imread('tire.tif');
J=histeq(I); %进行直方图均衡化
subplot(2,2,1);
imshow(I);
title('原始图像'); %显示原始图像
subplot(2,2,2);
imshow(J);
title('直方图均衡图像'); %显示直方图均衡化后的图像
subplot(2,2,3);
imhist(I);
title('原始图像直方图'); %显示原始图像的直方图
subplot(2,2,4);
imhist(J);
title('均衡化图像直方图'); %显示均衡化后的直方图
I=imread('tire.tif');
[J,T]=histeq(I); %进行直方图均衡化
figure,plot(T); %绘制转移函数的变换曲线
结论:从直方图看,处理后的图像直方图分布更均匀了,图像在每个灰度级上都有象素点。
从处理前后的图象看出:许多在原始图像中看不清楚的细节在直方图均衡化处理后所得到的图像中都变得十分清晰。
3. 直方图规定化
对图像tire.tif进行规定直方图的变换,通过实验,得出什么结论。
参考程序:
I=imread('tire.tif');
hgram=0:255; %直方图变换的规定化函数
J=histeq(I,hgram); %将图像向指定的直方图变换
subplot(2,2,1);
imshow(I); title('原始图像');
subplot(2,2,2);
imshow(J);title('直方图规定化后图像');
subplot(2,2,3);
imhist(I);title('原始图像直方图');
subplot(2,2,4);
imhist(J);title('规定化后图像直方图');
结论:和直方图均衡化的图像进行比较可以知道,直方图在高灰度值一侧更为密集,指定变化后的图像比直方图均衡化后的图像更亮,在较暗的区域细节更加清楚。
4. 代数运算
通过求平均值降噪。
要求:选择一幅图像(如rice.tif),通过Matlab的imnoise函数对图像人为加入噪声,然后将对多幅加入噪声的图像求平均值,得到去噪的目的。
参考程序:
clear; %清除工作台的变量
I=imread('rice.tif');
subplot(2,2,1);
imshow(I); title('原始图像');
[m,n]=size(I);
J(m,n)=0;
J=double(J);
X=imnoise(I,'gaussian');Y=double(X); %加入噪声
subplot(2,2,2);
imshow(X);title(' 加噪图像一');
J=J+Y/10;
X=imnoise(I,'gaussian');Y=double(X);
subplot(2,2,3);
imshow(X);title('加噪图像二');
J=J+Y/10;
for i=1:8 %循环运算,对噪声的图像取平均值
X=imnoise(I,'gaussian');
Y=double(X);
J=J+Y/10;
end
subplot(2,2,4);
imshow(mat2gray(J));title(' 10幅噪声图像平均结果');
四. 实验报告要求
1.实验目的;
2.实验基本原理;
3.实验步骤
4.源程序;
5.处理前后的图像;
6.实验结论;
7.实验收获、体会。
实验三图像的滤波
一. 实验目的
1. 熟悉空域滤波的原理;
2. 熟悉频域滤波的原理;
3. 学会用Matlab函数对输入图像进行均值滤波,感受不同的图像处理方法对最终图像效果的影响;
4. 比较Butterworth滤波器为噪声图像处理的实验结果。
二. 实验原理
1. Matlab提供了fspecial函数生成滤波时所用的模板,并提供filter2函数用指定的滤波器模板对图像进行运算。
函数:fspecial
功能:创建一个指定的滤波器模板。
语法格式:
h=fspecial(type)
h=fspecial(type,parameters)
说明:其中,参数type指定滤波器的种类,parameters是与滤波器种类有关的具体参数。
如:K1=filter2(fspecial('average',3),J)/255; %对图像J进行3×3模板的均值滤波
2. Matlab工具箱中提供了medfilt2函数来实现中值滤波。
函数:medfilt2
功能:实现对指定图像的中值滤波。
语法格式:
B=medfilt2(A,[m,n])
B=medfilt2(A)
说明:其中,A是输入图像,B是中值滤波后输出的图像。[m,n]指定滤波模板的大小,默认模板是3 3。
如:L=medfilt2(J,[3 5]); %对图像J进行3×5中值滤波
h1=fspecial('sobel');
I1=filter2(h1,I); 用sobel算子对图像I进行非线性锐化滤波
三. 实验内容
1. 对一个图像进行不同大小的模板的均值滤波,并比较结果。
选一幅图像(如eight.tif),对图像加入椒盐噪声,然后分别选择3×3、5×5、7×7等模板进行均值滤波,同时观察噪声图像、不同尺寸模板的均值滤波图像,并就不同尺寸的滤波器模板进行滤波操作的图像进行比较。
参考程序:
I=imread('eight.tif');
J=imnoise(I,'salt & pepper',0.02); %对指定的图像加入椒盐噪声
subplot(2,2,1);
imshow(J); title('噪声图像');
K1=filter2(fspecial('average',3),J)/255; %进行3×3模板的均值滤波
K2=filter2(fspecial('average',5),J)/255; %进行5×5模板的均值滤波
K3=filter2(fspecial('average',7),J)/255; %进行7×7模板的均值滤波
subplot(2,2,2);
imshow(K1);title('3×3模板均值滤波');
subplot(2,2,3);
imshow(K2);title('5×5模板均值滤波');
subplot(2,2,4);
imshow(K3);title('7×7模板均值滤波');
结论:随着所用的滤波器尺寸的增大,消除噪声的效果得到了增强;但是,图像的细节锐化程度相应降低,图像变得模糊起来。
2. 利用一个低通模板对一幅有噪图象(GAUSS白噪声)进行滤波(原图像可选lena.bmp、saturn.tif、pout.tif等),检验两种滤波模板(分别使用一个5×5的线性邻域平均模板和一个非线性模板:3×5中值滤波器)对噪声的滤波效果。
参考程序:
I=imread('lena.bmp');
J=imnoise(I,'gaussian',0,0.01);
subplot(2,2,1);
imshow(I);
title('原图');
subplot(2,2,2);
imshow(J);
title('noise');
K=fspecial('average',5);
K1=filter2(K,J)/255;
subplot(2,2,3);
imshow(K1);
title('average');
L=medfilt2(J,[3 5]);
subplot(2,2,4);
imshow(L);
title('medium');
3. 用sobel算子、prewitt算子、log算子对图像进行非线性锐化滤波,观察滤波效果。
参考程序:
I=imread('rice.tif');
subplot(2,2,1);
imshow(I);title('原始图像');
h1=fspecial('sobel');
I1=filter2(h1,I);
subplot(2,2,2);
imshow(I1);title('sobel算子滤波');
h1=fspecial('prewitt');
I1=filter2(h1,I);
subplot(2,2,3);
imshow(I1);title(' prewitt算子滤波');
h1=fspecial('log');
I1=filter2(h1,I);
subplot(2,2,4);
imshow(I1);title('log算子滤波');
4. 对图像eight.tif加入椒盐噪声后,实现Butterworth低通滤波。
选择一幅图像,将其加入椒盐噪声,对其进行傅立叶变换,转换数据矩阵,然后分别对其Butterworth 低通滤波和理想低通滤波,同时显示原始图像、噪声图像、Butterworth滤波图像和理想低通滤波图像。
参考程序:
clear;
I1=imread('eight.tif');
subplot(2,2,1);
imshow(I1); title('噪声图像');
I2=imnoise(I1,'salt & pepper'); %加入椒盐噪声
subplot(2,2,2);
imshow(I2); title('噪声图像');
f=double(I2);
g=fft2(f); %傅立叶变换
g=fftshift(g); %转换数据矩阵
[N1,N2]=size(g);
n=2;
d0=50;
n1=fix(N1/2);
n2=fix(N2/2);
for i=1:N1; %对频域中循环滤波
for j=2:N2;
d=sqrt((i-n1)^2+(j-n2)^2); %计算Butterworth低通滤波转换函数
h=1/(1+0.414*(d/d0)^(2*n));
result1(i,j)=h*g(i,j);
if(g(i,j)>50) %进行理想低通滤波
result2(i,j)=0;
else
result2(i,j)=g(i,j);
end
end
end
result1=ifftshift(result1); %进行反变换result2=ifftshift(result2); %进行反变换
X2=ifft2(result1);
X3=uint8(real(X2));
subplot(2,2,3);
imshow(X3);title('Butterworth滤波图像');
X4=ifft2(result2);
X5=uint8(real(X4));
subplot(2,2,4);
imshow(X5);title('理想低通滤波图像');
5. 对图eight.tif实现Butterworth高通滤波。参考程序:
clear;
I1=imread('eight.tif');
subplot(2,2,1);
imshow(I1); title('噪声图像');
I2=imnoise(I1,'salt & pepper'); %加入椒盐噪声subplot(2,2,2);
imshow(I2); title('噪声图像');
f=double(I2);
g=fft2(f); %傅立叶变换
g=fftshift(g); %转换数据矩阵
[N1,N2]=size(g);
n=2;
d0=50;
n1=fix(N1/2);
n2=fix(N2/2);
for i=1:N1; %对频域中循环滤波
for j=2:N2;
d=sqrt((i-n1)^2+(j-n2)^2); %进行Butterworth高通滤波
if d==0;
h=0;
else
h=1/(1+(d0/d)^(2*n));
end
result1(i,j)=h*g(i,j);
if(g(i,j)<50) %进行理想高通滤波
result2(i,j)=0;
else
result2(i,j)=g(i,j);
end
end
end
result1=ifftshift(result1); %进行反变换
result2=ifftshift(result2); %进行反变换
X2=ifft2(result1);
X3=uint8(real(X2));
subplot(2,2,3);
imshow(X3);title('Butterworth滤波图像');
X4=ifft2(result2);
X5=uint8(real(X4));
subplot(2,2,4);
imshow(X5);title('理想高通滤波图像');
结论:高通滤波器的滤波效果可以用原始图像减去低通滤波图像后得到。也可以将原始图像乘以一个放大系数,然后再减去低通滤波图像后得到一幅高频增强图像。
三. 实验报告要求
1.实验目的;
2.实验基本原理;
3.实验步骤
4.源程序;
5.处理前后的图像;
6.实验结论;
7.实验收获、体会。
实验四图像的压缩编码
一. 实验目的
1. 熟悉DCT离散余弦变换的原理
2. 熟悉运用DCT进行图像压缩的过程
二. 实验原理
1. 用DCT压缩的过程
(1)首先将输入图像分解为8×8或16×16的块,然后对每个子块进行二维DCT变换。
(2)将变换后得到的量化的DCT系数进行编码和传送,形成压缩后的图像格式。
2. 用DCT解压的过程
(1)对每个8×8或16×16的块进行二维DCT反变换。
(2)将反变换的矩阵的块合成一个单一的图像。
DCT变换后矩阵的能量集中在矩阵的左上角,右下大多数DCT系数值非常接近于0。对于通常的图像来说,舍弃这些接近于0的DCT的系数,并不会对重构图像的画面质量带来显著的下降。所以利用DCT变换进行图像压缩可以节约大量的存储空间。压缩应该在最合理的近似原图像的情况下使用最少的系数。使用系数的多少也决定了压缩比的大小。
在压缩过程的第2步中,可以合理的舍弃一下系数,从而达到压缩的目的。在压缩过程的第2步,还可以采用RLE、Huffman编码来进一步压缩。
三. 实验内容
1. 对棋盘图像(checkerboard(10,2))进行压缩,显示原图像大小、压缩图像大小以及压缩比。
I = checkerboard(10,2); %棋盘图像
[m n]=size(I);
J=[];
for i=1:m
value=I(i,1);
num=1;
for j=2:n
if I(i,j)==value
num=num+1;
else
J=[J num value];
num=1;
value=I(i,j);
end
end
J=[J num value 0 0]; %添加的行判断位0 0
end
disp('原图像大小:')
whos('I');
disp('压缩图像大小:')
whos('J');
disp('图像的压缩比:')
disp(m*n/length(J))
实验结果:
原图像大小:
Name Size Bytes Class
I 40x40 12800 double array
Grand total is 1600 elements using 12800 bytes
压缩图像大小:
Name Size Bytes Class
J 1x400 3200 double array
Grand total is 400 elements using 3200 bytes
图像的压缩比:4
2. 对DCT变换矩阵舍弃系数后重构的图像和原图像进行比较。qtdemo是Matlab自带的一个演示程序。输入qtdemo后,就会运行程序。
qtdemo
dctdemo
3. 对图像进行DCT变换
首先对图像autumn.tif进行DCT变换,然后对DCT变换后的矩阵中小于10的系数设为0,然后重构图像。要求显示原始图像、DCT变换结果和重构后的图像。
参考程序:
RGB=imread('autumn.tif'); %将彩色图像转换为灰度图像
I=rgb2gray(RGB);
subplot(1,2,1);
imshow(I); title('原始图像'); %进行余弦变换
J=DCT2(I);
subplot(1,2,2);
imshow(log(abs(J)),[]); title('DCT变换结果');
J(abs(J)<10)=0;
K=idct2(J);
figure
Imshow(K,[0 255]);title('重构后的图像')
可以看出图像的能量很大部分在变换矩阵的左上角。
4. 使用Matlab对图像作DCT压缩
把输入图像cameraman.tif划分成8×8的图像块,计算它们的DCT系数,并且只保留64个DCT系数中的10个。然后对每个图像块利用这10个系数进行逆DCT变换来重构图像。
参考程序:
I = imread('cameraman.tif');
I = im2double(I); %图像存储类型转换
T = dctmtx(8); %产生二维DCT变换矩阵
%计算二维DCT,矩阵T及其转置是DCT函数P1×x×P2的参数
B = blkproc(I,[8 8],'P1*x*P2',T,T'); %二值掩模,用来压缩DCT系数,只留下DCT系数中左上角的10个mask = [1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0];
B2 = blkproc(B,[8 8],'P1.*x',mask); %只保留DCT变换的10个系数
I2 = blkproc(B2,[8 8],'P1*x*P2',T',T); %重构图像
subplot(1,2,1);
imshow(I);title('原始图像');
subplot(1,2,2);
imshow(I2);title('压缩后的图像')
结论:对比原始图像和压缩后的图像,虽然舍弃了85%的DCT系数,但图像仍然清晰(当然有一些质量损失)。
四. 实验报告要求
1.实验目的;
2.实验基本原理;
3.实验步骤
4.源程序;
5.处理前后的图像;
6.实验结论;
7.实验收获、体会。