当前位置:文档之家› 数字图像处理第一次作业

数字图像处理第一次作业

数字图像处理实验报告班级:自动化01姓名:李丹学号:10054003提交日期:2013.3.13摘要:本次作业通过对图像的灰度级数以及其像素的点运算,算术运算、几何变换等,学习了MATLAB在数字图像处理中的运用,更深的理解了数字图像处理的原理和方法。

第一题:Bmp图像格式简介答:Bmp是bitmap的缩写,即为位图图片。

位图图片是用一种称作“像素”的单位存贮图像信息的。

这些“像素”其实就是一些整齐排列的彩色(或黑白)点,如果这些点被慢慢放大,就会看到一个个的“像素”中添充着自己的颜色,这些“像素”整齐地排列起来,就成为了一幅BMP图片,并以.bmp等为扩展名。

由于BMP文件格式是Windows 环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。

BMP可以分成两类:设备相关位图(DDB)和设备无关位图(DIB)。

典型的BMP图像文件由四部分组成:位图头文件数据结构(包含BMP图像文件的类型、显示内容等信息),位图信息数据结构(包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息),调色板(可选的)以及位图数据(根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值)。

它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。

BMP文件的图像深度可选lbit、4bit、8bit及24bit。

BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。

第二题:把lena.bmp 512*512图像灰度级逐级递减8-1显示答:1)问题分析:本题中对图像进行的操作是直接灰度变换。

2)具体 MATLAB 实现程序见附录 3)实验结果:4)结果分析:对一幅 512*512,256个灰度级的具有较多细节的图像,保持空间分辨率不变,仅将灰度级数依次递减为128、64、32、16、8、4、2,比较得到的结果就可以发现灰度级数对图像的影响。

前四张图灰度级数较高,图像基本看不出什么变化。

当灰度级数继续降低,则在灰度缓变区常会出现一些几乎看不出来的非常细的山脊状结构。

灰度级数越低,越不能将图像的细节刻画出来。

对比实验中处理过的图像,可以发现,虽然都是灰度图,但是灰度范围越大则图像显示出的色彩越丰富。

第三题:计算lena图像的均值方差1)问题分析:(1)使用 imhist 函数创建图像直方图。

imhist(I, n)计算和显示图像I的直方图,n为指定的灰度级数目,默认为256。

如果I是二值图像,那么n仅有两个值。

(2)使用 mean2 和 std2 函数计算图像矩阵中元素的均值和标准差2)具体 MATLAB 实现程序见附录3)运行结果:B =99.0512C =52.8776D =2.7960e+034)结果分析:进过 MATLAB 运算,得到图像 lena.bmp 的均值约为 99,标准差约为 52.9,方差是标准差的平方,约为 2796。

再通过对直方图的观察,我们可以看到,图像的灰度平均值确实分布在 100 左右,与MATLAB 计算的结果一致。

另外,方差越大,图像的对比度越大,可以显示的细节就越多,因此,lena.bmp 图像具有高对比度这个结论,也可以从图像具有的细节得到验证。

第四题:把lena图像用近邻、双线性和双三次插值法zoom到2048*20481)问题分析:插值算法是估计在图象像素间的某个位置的像素的取值方法。

(1)最近邻点插值法:在待插像素的周围四邻像素中,距离待求插像素最近的像素灰度赋给待插像素。

该方法最简单,但校正后存在灰度不连续性,图像有明显锯齿状。

(2)双线性插值算法:双线性插值算法输出的图像的每个像素都是原图中四个像素(2×2)运算的结果,这种算法极大地消除了锯齿现象。

(3)双三次插值算法:双三次插值算法是上一种算法的改进算法,它输出图像的每个像素都是原图16个像素(16×16)运算的结果。

这种算法是一种很常见的算法,普遍用在图像编辑软件、打印机驱动和数码相机上。

我们用MATLAB提供的imresize函数来进行插值,其调用格式为: B = imresize(A, [numrows numcols]) numrows和numcols分别指定目标图像的高度和宽度。

显而易见,由于这种格式允许图像缩放后长宽比例和源图像长宽比例不相同,因此所产生的图像有可能发生畸变。

[...] = imresize(..., method)method参数用于指定在改变图像尺寸时所使用的算法,可以为一下几种:'nearest':这个参数也是默认的,即改变图像尺寸时采用最近邻插值算法;'bilinear':采用双线性插值算法;'bicubic':采用双三次插值算法;2)具体 MATLAB 实现程序见附录3)运行结果:4)结果分析:最近邻插值、双线性插值与双三次差值这三种方法之间的区别主要在于点周围像素序列的取法不同。

对于最近邻插值,输出像素的值指定为点所属像素的值,不考虑其他像素;对于双线性插值,输出图像的值是最近的 2*2 邻域内像素值得加权平均值;对于双三次差值,输出图像的值是最近的 4*4 邻域内像素值得加权平均值。

所以,双线性插值法花费的时间比最近邻法的要长一些,而双三次法花费的时间比双线性法的又要长一些。

但是,参与计算的时间越多,计算结果越精确,通常双线性插值和双三次差值这两种方法比最近邻法得到的效果更好。

从得到的图像我们可以看到,最近邻内插产生了最大的锯齿边缘,尤其是在对应图像中的肩膀的边缘部位,产生了很明显的锯齿,而双线性内插得到了明显改进的结果使用双三次内插产生了稍微清晰一些的结果。

第五题:把lena和elain图像分别进行水平shear(参数可设置为1.5)和旋转30度,并采用用近邻、双线性和双三次插值法zoom到2048*20481)问题分析:(1)采用仿射变换来进行水平裁剪。

仿射变换是空间直角坐标变换的一种,它是一种二维坐标到二维坐标的线性变换,即用图像的矩阵去乘仿射变换的矩阵T,把图像上的像素重新定位到一个新位置,并为这些新位置赋灰度值,而这个任务可以用灰度内插的方法完成,选择最近邻内插法、双线性插值法和双三次插值法其中之一即可。

对于水平偏移变换,运算后,坐标变为x=v,y=shv+w。

在本题中,参数sv根据题中要求设为1.5。

对于旋转变换,运算后,坐标变为x=vcosθ−wsinθ,y=vsinθ+wcosθ。

在本题中,运用旋转函数,就不在程序中重新设置矩阵值了,而是函数根据参数自行设置矩阵T(2)使用 imrotate 函数旋转图像。

该函数接受两个主要的变量,即要旋转的图像和旋转的角度,旋转角度的单位为度。

如果指定一个正值,imrotate 函数按逆时针方向旋转函数;如果指定一个负值,imrotate 函数按顺时针方向旋转图像。

作为可选变量,还可以给 imrotate 函数指定产值方法和图像的大小。

函数默认使用最近邻插值法确定输出图像中的像素值,但也可以指定其他方法,例如:y2=imrotate(Y,angle,'crop');其中,angle为旋转角度(默认为逆时针),crop代表旋转后裁剪,即将旋转后的图像超出原图像大小范围的部分裁剪掉。

如果缺省则默认为不裁剪。

(3)使用 imtransform 函数完成一般的二维空间转换。

其语法格式如下:B=imtransform(A,TFORM,paraml,vall,param2,val2)。

该函数接受两个主要变量,既要变换的图像和 TFORM 空间变换结构。

创建一个TFORM 结构有两种方法,即使用makeform 函数和cp2tform 函数。

(4)使用 makeform 函数,可指定变换类型。

在本次实验中,指定的是仿射变换”affine”类型,即进行平移,旋转,比例,拉伸和错切等功能。

仿射变换要求变换矩阵的最后一列除最后一个元素为 1 之外,其它的均为 0。

2)具体 MATLAB 实现程序见附录3)运行结果:附录:1.参考文献[1] 杨杰:《数字图像处理及MATLAB实现——学习与实验指导》,北京,电子工业出版社,2010年版。

[2]冈萨雷斯:《数字图像处理(第三版)》,北京,电子工业出版社,2011年版。

[3] /s/blog_4af655c30100d7ed.html2.源代码:题目二:I=imread('lena.bmp');figure(1)A=imread('lena.bmp');imshow(A)[wide,height]=size(I);img128=zeros(wide,height);img64=zeros(wide,height);img32=zeros(wide,height);img16=zeros(wide,height);img8=zeros(wide,height);img4=zeros(wide,height);title('256 灰度级');for i=1:widefor j=1:heightimg128(i,j)=floor(I(i,j)/2);endendfigure(2)imshow(uint8(img128),[0,127])title('128 灰度级');for i=1:widefor j=1:heightimg64(i,j)=floor(I(i,j)/4);endendfigure(3)imshow(uint8(img64),[0,63])title('64 灰度级');for i=1:widefor j=1:heightimg32(i,j)=floor(I(i,j)/8);endendfigure(4)imshow(uint8(img32),[0,31])title('32 灰度级');for i=1:widefor j=1:heightimg16(i,j)=floor(I(i,j)/16);endendfigure(5)imshow(uint8(img16),[0,15])title('16 灰度级');for i=1:widefor j=1:heightimg8(i,j)=floor(I(i,j)/32);endendfigure(6)imshow(uint8(img8),[0,7])title('8 灰度级');for i=1:widefor j=1:heightimg4(i,j)=floor(I(i,j)/64);endendfigure(7)imshow(uint8(img4),[0,3])title('4 灰度级');for i=1:widefor j=1:heightimg2 (i,j)=floor(I(i,j)/128);endendfigure(8)imshow(uint8(img2),[0,1])title('2 灰度级');for i=1:widefor j=1:heightimg1 (i,j)=floor(I(i,j)/256);endEnd题目三:A=imread('lena.bmp');figure(1)imhist(A)title('lena.bmp 直方图');B=mean2(A)C=std2(A)D=C^2题目四:A=imread('lena.bmp');B1=imresize(A,[2048 2048],'nearest');figure(1)imshow(A);title('原始图像');figure(2)imshow(B1);title('最近邻插值法');B2=imresize(A,4,'bilinear');figure(3)imshow(B2);title('双线性插值法');B3=imresize(A,[2048 2048],'bicubic');figure(4);imshow(B3);title('双三次插值法');题目五:Lena图像:transformtype='affine';transformmatrix=[1 1.5 0;0 1 0;0 0 1];T=maketform(transformtype,transformmatrix); I=imread('lena.bmp');nI=imtransform(I,T);figure(1)imshow(I);title('原始图像');B1=imresize(nI,[2048 2048],'nearest');figure(2)imshow(B1);title('水平偏移最近邻内插');B2=imresize(nI,[2048 2048],'bilinear');figure(3);imshow(B2);title('水平变换双线性内插');B3=imresize(nI,[2048 2048],'bicubic');figure(4);imshow(B3);title('水平变换双三次内插');Elain图像:transformtype='affine';transformmatrix=[1 1.5 0;0 1 0;0 0 1];T=maketform(transformtype,transformmatrix); I=imread('elain.bmp');nI=imtransform(I,T);figure(1)imshow(I);title('原始图像');B1=imresize(nI,[2048 2048],'nearest');figure(2)imshow(B1);title('水平偏移最近邻内插');B2=imresize(nI,[2048 2048],'bilinear'); figure(3);imshow(B2);title('水平变换双线性内插');B3=imresize(nI,[2048 2048],'bicubic'); figure(4);imshow(B3);title('水平变换双三次内插');实验心得:通过本次大作业,我熟练掌握了对数字图像进行简单处理的基本方法,对于MATLAB的一些相关基本函数调运也有了基本的掌握。

相关主题