1、 实验三 图像处理 MATLAB 实验(一) 实验目的和要求1. 熟悉 MATLAB 中数字图像处理工具箱( Image Processing Toolbox)的基本使用方法和常用函数;2. 熟练图像的矩阵表示方法;3. 掌握图像处理的基本算法及函数调用,如直方图、二值化、图像分割、图像增强、图像变换等等。4. 通过 MATLAB 在图像处理中的应用,体会 MATLAB 矩阵运算的技巧。(二) 实验设备及材料计算机,MATLAB2010(三) 实验内容1 对任意灰度图像(最好是 MATLAB 自带图像)进行以下操作:a.输入一幅灰度图像;b. 调用 im2bw,输出其二值化图像;c.调用 im
2、hist 函数,输出其直方图;d. 其上输入输出放在一个 figure 中,并加 title。以脚本文件的形式保存。2. 自己编写二值化函数、直方图函数,以函数文件的形式保存。通过调用自己编写的函数验证其有效性。3. 对任意灰度图像加高斯噪声,利用中值滤波和平均滤波对其进行平滑,观察平滑效果,将原图像、噪声图像、滤波后图像显示在一个figure 中。4. 通过调用 edge 函数对任意图像进行边缘提取,使用 3 种以上的算子(如 sobelprewitt 等) ,比较每种算子分割效果,在一个 figure 中显示。5、用 MATLAB 实现对图像的 JPEG 压缩编码。 (此题不做要求,感兴趣
3、的同学可以尝试编写)解:1、如下所示:I=imread(cell.tif);subplot(2,2,1);imshow(I)title( 源图像);bw=im2bw(I,0.5);subplot(2,2,2);imshow(bw)title(二值化图像);subplot(2,2,3)imhist(I)title( 直方图);在命令窗键入 m 文件名:shiyan3cell结果如下所示:2、直方图函数文件如下:%文件名为 zft.mfunction y=zft(I)x=double(I); /此句不要也可,因为I=imread(autumn.tif)读出的是整形的,有的需要用双字节型的则需要转换
4、M,N=size(x);h=zeros(1,256); /产生1个1*256 的一维向量,用于存放每个灰度值的个数for i=1:M,for j=1:N,f=I(i,j);h(f+1)=h(f+1)+1; /注意用h(f+1)是因为matlab中的数组不能从零开始endendy=h; /y要有返回值,否则该函数无作用注:如果用h(f)=h(f)+1的话,调用运行时会出现如下报错:Attempted to access h(0); index must be a positive integer or logical.Error in zft1 (line 8)h(f)=h(f)+1;调用显示程
5、序如下:(1)当读入的图像为 RGB 彩色图像时要转成灰度图像再求其直方图I=imread(autumn.tif);x=rgb2gray(I);s=zft1(x);subplot(2,2,1);imshow(I)title( 源图像);subplot(2,2,2);imshow(x)title( 灰度图像);subplot(2,2,3);bar(s)title( 直方图)y=imhist(x);subplot(2,2,4);bar(y)title( matlab 自带的直方图函数 imhist 的图);结果如下:(2)当读入的图像自身就为灰度图像时直接求其直方图I=imread(trees.t
6、if);s=zft1(I);subplot(2,2,1);imshow(I)title( 源图像);subplot(2,2,2);bar(s)title( 直方图)y=imhist(I);subplot(2,2,3);bar(y)title( matlab 自带的直方图函数 imhist 的图);运行结果如下:二值化函数文件如下:%function 函数名为 erzhi.mfunction k=erzhi(I)I=double(I); /该句没有也正确M,N=size(I);IK=I;for p=1:M;for q=1:N;if I(p,q)=90IK(p,q)= 255; /若此处将其赋值为
7、逻辑1,则不正确。因为I=imread(autumn.tif)读出的是一幅图像的灰度值,其为整形(uint8),若直接将其赋值为1,则相当于该处灰度值为1,则显示全黑。若要将其赋为1,则需对读出的灰度值进行类型转换,转成逻辑符号(logical);但最后显示图像时要还原成整形。或则可以将图像归一化,则不需要还原成整形,因为归一化后的值就在0,1范围内,1就表示白色。相当于整型中的255.elseIK(p,q)=0;endendendk=uint8(IK);当为赋值逻辑 1 时,函数文件如下:function k=erzhi(I)M,N=size(I);IK=I;for p=1:M;for q=
8、1:N;if I(p,q)=90logical(IK(p,q)= 1; elseIK(p,q)=0;endendendk=uint8(IK);调用显示程序如下:(1)当读入的为 RGB 彩色图像时,要用 rgb2gray 函数将其转成灰度图像I=imread(autumn.tif);X=rgb2gray(I);t=erzhi (X);subplot(1,3,1);imshow(I)title( 源图像);subplot(1,3,2);imshow(X)title(灰度图像);subplot(1,3,3);imshow(t)title( 二值化图像);显示图像如下所示:(2)当读入的图像本身就是
9、灰度图像时直接二值化即可,如:I=imread(trees.tif) ;t=erzhi(I);subplot(1,2,1);imshow(I)title( 源图像);subplot(1,2,2);imshow(t)title( 二值化图像);运行结果如下所示:3、程序如下所示:M=imread(trees.tif) ; subplot(2,2,1);imshow(M) title(原始图像);P1=imnoise(M,gaussian,0,0.02); subplot(2,2,2); imshow(P1) title(加高斯噪声图像);K=fspecial(average,5,5); /预定义
10、滤波函数p2=filter2(K,P1)/255;subplot(2,2,3);imshow(p2)title(平均滤波后图像);P3=medfilt2(P1); subplot(2,2,4);imshow(P3) title(中值滤波图像);图像如下:如图可见,对于高斯噪声,均值滤波效果比中值滤波效果好。原因:(1)高斯噪声是幅值近似正态分布,但分布在每点像素上。(2)因为图像中的每点都是污染点,所以中值滤波选不到合适的干净点。(3)因为正态分布的均值为 0,所以均值滤波可以消除噪声。(实际上只能减弱,不能消除。)4、用 Sobel、roberts、log、 prewitt 四种边缘提取函数
11、I=imread(kids.tif);BW1=edge(I, roberts);BW2=edge(I,sobel);BW3=edge(I,log);BW4=edge(I, prewitt);subplot(2,3,1);imshow(I)title(源图像)subplot(2,3,2);imshow(BW1)title(用 Roberts 算子)subplot(2,3,3);imshow(BW2)title(用 Sobel 算子 )subplot(2,3,4);imshow(BW3)title(用拉普拉斯高斯算子)subplot(2,3,5);imshow(BW4)title( 用 prewitt 算子)实验结果如下所示: