实验一 图像打开、保存与显示
一、实验目的:
掌握数字图像的基本类型及其表示。熟悉Matlab软件环境,了解Matlab中对图像数据的读入、显示和输出等操作,实现图像文件的打开、显示与保存功能。
二、实验环境:
计算机、WindowsXP操作系统,Matlab7.0
三、实验内容:
实验前准备工作:
所使用的图像文件都保存在Matlab安装目录下的\toolbox\images\imdemos子目录下。将实验中需要使用的图像文件,事先拷贝到Matlab安装目录下的\work子目录下。(Matlab默认处理当前工作目录下的图像文件)
1、运用Matlab图像处理工具箱中的imread函数分别读入灰度图像pout.tif、二值图像blobs.png、索引图像trees.tif和RGB图像peppers.png,观察相应的图像矩阵,并运用imshow函数显示相应图像。
代码实现:
>> I_huidu=imread('pout.tif');
>> figure(1),imshow(I_huidu);
>> I_erzhi=imread('blobs.png');
>> figure(2),imshow(I_erzhi);
>> I_erzhi2=imread('circles.png');
>> figure(3),imshow(I_erzhi2);
>>[I_suoyin,colormap]=imread('trees.tif');
>> figure(4),imshow(I_suoyin);
>> imshow(I_suoyin,colormap);
2、对一个RGB彩色图像peppers.png,分别抽取其R、G、B三个分量层,并显示各层图像。
代码实现:
>>I_reb=imread('peppers.png');
>>R=I_reb(:,:,1);
>>figure(5),imshow(R);
>>subplot(2,2,1),imshow(I_reb);
>>subplot(2,2,2),imshow(R);
>> G=I_reb(:,:,2);
>> B=I_reb(:,:,3);
>> subplot(2,2,3),imshow(G);
>> subplot(2,2,4),imshow(B);
3、向灰度图像pout.tif中分别加入高斯噪声和椒盐噪声,显示并保存带有噪声的图像。
代码实现:
>>I=imread('pout.tif');
>>G=imnoise(I,'gaussian');
>>figure(6),subplot(1,3,1),imshow(I);
>>subplot(1,3,2),imshow(G);
>>J=imnoise(I,'salt & pepper');
>> J=imnoise(I,'salt &pepper',0.05);
>>subplot(1,3,3),imshow(J);
>> imwrite(G,'gpout.tif');
>> imwrite(J,'jpout.tif');
实验二 图像灰度直方图统计
一、实验目的:
理解并掌握灰度直方图的概念、计算灰度直方图的方法以及如何应用直方图均衡化来增强图像对比度。
二、实验环境:
计算机、WindowsXP操作系统,Matlab7.0
三、实验内容:
以灰度图像pout.tif为例,运用Matlab编程实现灰度直方图的统计以及直方图均衡化处理过程:
(1)计算并绘制原始图像的灰度直方图;
(2)根据离散累计分布函数,对原始灰度直方图进行均衡化处理,绘制均衡化后的灰度直方图;
(3)生成均衡化处理后的新图像,显示并保存。
(4)比较原始图像和新图像的对比度。
代码实现:(.m文件)
grayimage=imread('pout.tif');
[m,n]=size(grayimage);
gp=zeros(1,256);
for i=1:256
gp(i)=length(find(grayimage==(i-1)))/(m*n);
end
subplot(2,2,1),imshow(grayimage);
subplot(2,2,2),bar(0:255,gp);
S1=zeros(1,256);
S2=zeros(1,256);
temp=0;
fori=1:256
temp=temp+gp(i);
S1(i)=temp;
end
S2=round(S1*255);
newgp=zeros(1,256);
fori=1:256
newgp(i)=sum(gp(find(S2==(i-1))));
end
subplot(2,2,4),bar(0:255,newgp);
newgrayimage=grayimage;
fori=1:256
newgrayimage(find(grayimage==(i-1)))=S2(i);
end
subplot(2,2,3),imshow(newgrayimage);
imwrite(newgrayimage,'newpout.tif');
实验三 图像轮廓提取与边缘检测
一、实验目的:
理解并掌握对二值图像进行轮廓提取的相关算法(比如,掏空内部点法),以及用于图像边缘检测和提取的典型微分算子(梯度算子和拉普拉斯算子)。
二、实验环境:
计算机、WindowsXP操作系统,Matlab7.0
二、实验内容:
1、以二值图像circles.png(黑色背景白色前景)为例,根据掏空内部点算法,运用Matlab编程实现二值图像的轮廓提取。
代码实现:(.m文件)
BW=imread('circles.png');
[m,n]=size(BW);
BW_buffer=BW;
for i=2:m-1
for j=2:n-1
if(BW(i,j)==255 &&BW(i-1,j-1) && BW(i-1,j)==255 && BW(i+1,j)==255 &&BW(i,j+1)==255 && BW(i,j-1)==255 && BW(i+1,j+1)==255 &&BW(i-1,j+1)==255 && BW(i+1,j-1)==255)
BW_buffer(i,j)=0;
end
end
end
figure(1),subplot(1,2,1),imshow(BW);
subplot(1,2,2),imshow(BW_buffer);
注意:
(1)使用掏空内部点的方法来提取二值图像的轮廓时,不能直接在原始二值图像矩阵上判断一个点掏空一个点,否则对前面像素的掏空操作会影响到对后面像素的判断结果。
(2)解决方法:创建原始二值图像矩阵的副本,在原始二值图像矩阵上执行判断操作,即依次判断每个像素点是否为前景中的内部点,如果是,则在副本图像矩阵上执行掏空内部点操作。
2、以灰度图像rice.png为例,利用Matlab图像处理工具箱中的edge函数,分别使用Roberts 算子、Sobel算子、Prewitt 算子对其进行边缘检测。
代码实现:(.m文件)
I=imread('rice.png');
[BW1,thresh1]=edge(I,'roberts');
[BW2,thresh2]=edge(I,'sobel');
[BW3,thresh3]=edge(I,'prewitt');
figure(2),subplot(2,2,1),imshow(I);
subplot(2,2,2),imshow(BW1);
subplot(2,2,3),imshow(BW2);
subplot(2,2,4),imshow(BW3);
关于edge函数的使用说明:
(1)函数格式:BW = edge(I, 'method', thresh)
(2)格式说明:edge函数输入灰度图像矩阵I,输出二值图像矩阵BW;参数'method'用于指定所使用的边缘检测算子,可以是'roberts'、'sobel'、'prewitt'、'log'、'canny'等;参数thresh用于指定梯度门限值(也称梯度阈值),图像中梯度值大于等于门限值thresh的像素用白色(1)表示,说明这些地方对应边缘,梯度值小于门限值thresh的像素用黑色(0)表示(edge function will ignoreall edges that are not stronger than thresh)。若不指定参数thresh,则edge函数会自动选择阈值。所以edge函数最终将原始灰度图像中的边缘和背景用二值图像的形式展现出来,以突出边缘的位置,达到边缘检测的目的。
3、若向原始图像rice.png中加入高斯噪声,之后再对噪声图像分别运用Roberts 算子、Sobel算子、Prewitt 算子、Log算子(高斯-拉普拉斯算子)进行边缘检测,观察检测结果,试比较4种边缘检测算子的抗噪声干扰能力。
代码实现:(.m文件)
I=imread('rice.png');
G=imnoise(I,'gaussian');
[BW1,thresh1]=edge(G,'roberts');
[BW2,thresh2]=edge(G,'sobel');
[BW3,thresh3]=edge(G,'prewitt');
[BW4,thresh4]=edge(G,'log');
figure(3),subplot(2,3,1),imshow(I);
subplot(2,3,2),imshow(G);
subplot(2,3,3),imshow(BW1);
subplot(2,3,4),imshow(BW2);
subplot(2,3,5),imshow(BW3);
subplot(2,3,6),imshow(BW4);
4.对图像做均值滤波,处理高斯噪声。
代码实现:(.m文件)
function d=avefilt(x,n)
a=ones(n);
[M,N]=size(x);
x1=double(x);
x2=x1;
for i=1:M-n+1 %循环次数
for j=1:N-n+1%抽取子矩阵
c=x1(i:i+(n-1),j:j+(n-1)).*a;
s=sum(sum(c));
x2(i+fix((n-1)/2),j+fix((n-1)/2))=s/(n*n);
end
end
d=uint8(x2);
I=imread('rice.png');
G=imnoise(I,'gaussian');
A=avefilt(G,3);
figure(4),subplot(1,3,1),imshow(I);
subplot(1,3,2),imshow(G);
subplot(1,3,3),imshow(A);
实验四 二维图像几何变换
一、实验目的:
理解并掌握平移、镜像、旋转和比例缩放等二维图像基本几何变换的变换原理以及灰度插值处理过程。
二、实验环境:
计算机、WindowsXP操作系统,Matlab7.0
三、实验内容:
1、以灰度图像cameraman.tif为例,通过Matlab编程实现水平镜像和垂直镜像变换。
代码实现:(.m文件)
%对灰度图像进行处理
I=imread('cameraman.tif');
[M,N]=size(I);
S=I;
for i=1:M
for j=1:N
S(i,j)=I(i,N-j+1);
%S(i,N-j+1)=I(i,j);都行
end
end
C=I;
for j=1:N
for i=1:M
C(i,j)=I(M-i+1,j);
%C(M-i+1,j)=I(i,j);都行
end
end
figure(1)
subplot(2,2,1),imshow(I);
subplot(2,2,2),imshow(S);
subplot(2,2,3),imshow(C);
%对RGB图像进行处理
I=imread('football.jpg');
[M,N,L]=size(I);
S=I;
for k=1:L %i=1:3
for i=1:M
for j=1:N
S(i,j,k)=I(i,N-j+1,k);
%S(i,N-j+1)=I(i,j);都行
end
end
end
C=I;
for k=1:L
for j=1:N
for i=1:M
C(i,j,k)=I(M-i+1,j,k);
%C(M-i+1,j)=I(i,j);都行
end
end
end
figure(2)
subplot(2,2,1),imshow(I);
subplot(2,2,2),imshow(S);
subplot(2,2,3),imshow(C);
2、以灰度图像circuit.tif为例,利用Matlab图像处理工具箱中的imresize函数对图像进行比例缩放变换。要求:创建4个figure窗口,分别用于显示原始图像、等比例放大1.5倍后的图像、等比例缩小0.5倍后的图像、缩放为高190宽400的图像(实现不等比例缩放)。并保存缩放后的所有图像文件到当前目录中。
注意:要使各自的figure窗口保持初始大小,不要最大化figure窗口,因为figure窗口的初始大小才表明了缩放前后图像大小的变化。也可以使用其它图像处理工具软件,分别打开原始图像以及新生成的3幅比例缩放变换后的图像,以观察它们之间的变化。
代码实现:(.m文件)
I=imread('circuit.tif');
[M,N]=size(I);
F=imresize(I,1.5,'nearest');
imwrite(F,'circuit1_5.tif');
[M1_5,N1_5]=size(F);
S=imresize(I,0.5,'nearest');
imwrite(S,'circuit0_5.tif');
[M0_5,N0_5]=size(S);
J=imresize(I,[190400],'nearest');
imwrite(J,'circuit190_400.tif');
[M190_400,N190_400]=size(J);
figure(3),imshow(I);
figure(4),imshow(F);
figure(5),imshow(S);
figure(6),imshow(J);
关于imresize函数的使用说明:
(1)函数格式:
B=imresize(A,m, method)
B=imresize(A,[mrows ncols], method)
(2)格式说明:A为原始图像矩阵,B为比例缩放变换后的图像矩阵;method指定缩放过程中使用的插值方法,“nearest”为最邻近插值法(默认值),“bilinear”为双线性插值法;m为缩放倍数,m大于1,图像被放大,小于1,图像被缩小;mrows和ncols用于分别指定变换后图像的高度和宽度,这能克服缩放倍数m只能对高度和宽度等比例缩放的缺陷。
3、以灰度图像cameraman.tif为例,利用Matlab图像处理工具箱中的imrotate函数对图像进行旋转变换。要求:创建3个figure窗口,分别用于显示原始图像、逆时针旋转45°后的图像、顺时针旋转45°后的图像。并保存旋转后的所有图像文件到当前目录中。
注意:要使各自的figure窗口保持初始大小,不要最大化figure窗口,因为figure窗口的初始大小才表明了旋转前后图像的变化。也可以使用其它图像处理工具软件,分别打开原始图像以及新生成的两幅旋转变换后的图像,以观察它们之间的变化。
代码实现:(.m文件)
I=imread('cameraman.tif');
I_45=imrotate(I,45);
imwrite(I_45,'cameraman45.tif');
I_45N=imrotate(I,-45);
imwrite(I_45N,'cameraman45N.tif');
figure(1),imshow(I);
figure(2),imshow(I_45);
figure(3),imshow(I_45N);
关于imrotate函数的使用说明:
(1)函数格式:
B=imrotate(A,angle)
B=imrotate(A,angle, method)
(2)格式说明:A为原始图像矩阵,B为旋转变换后的图像矩阵;angle指定逆时针旋转角度,当angle为负值时,表示顺时针旋转;method指定旋转过程中使用的插值方法,“nearest”为最邻近插值法(默认值),“bilinear”为双线性插值法。
4.对图像做中值滤波,去椒盐噪声。
代码实现:(.m文件)
%中值滤波
functiond=medfilt(x,m,n)
[M,N]=size(x);
x1=double(x);
x2=x1;%保持边界处像素值不变
fori=1:M-m+1
for j=1:N-n+1
c=x1(i:i+m-1,j:j+n-1);
e=c(1,:); %矩阵变行向量
for k=2:m
e=[e,c(k,:)];
end
x2(i+(m-1)/2,j+(n-1)/2)=median(e);%取中心像素位置,并赋给其中值
end
end
d=uint8(x2);
I=imread('eight.tif');
J=imnoise(I,'salt& pepper');
after=medfilt(J,3,3);
figure(4);
subplot(1,3,1),imshow(I);
subplot(1,3,2),imshow(J);
subplot(1,3,3),imshow(after);