实验报告 显示tif图像
- 格式:doc
- 大小:108.00 KB
- 文档页数:16
数字图像处理实验报告实验一数字图像处理编程基础一、实验目的1. 了解MATLAB图像处理工具箱;2. 掌握MATLAB的基本应用方法;3. 掌握MATLAB图像存储/图像数据类型/图像类型;4. 掌握图像文件的读/写/信息查询;5. 掌握图像显示--显示多幅图像、4种图像类型的显示方法;6. 编程实现图像类型间的转换。
二、实验内容1. 实现对图像文件的读/写/信息查询,图像显示--显示多幅图像、4种图像类型的显示方法、图像类型间的转换。
2. 运行图像处理程序,并保存处理结果图像。
三、源代码I=imread('cameraman.tif')imshow(I);subplot(221),title('图像1');imwrite('cameraman.tif')M=imread('pout.tif')imview(M)subplot(222),imshow(M);title('图像2');imread('pout.bmp')N=imread('eight.tif')imview(N)subplot(223),imshow(N);title('图像3');V=imread('circuit.tif')imview(V)subplot(224),imshow(V);title('图像4');N=imread('C:\Users\Administrator\Desktop\1.jpg')imshow(N);I=rgb2gary(GRB)[X.map]=gary2ind(N,2)RGB=ind2 rgb(X,map)[X.map]=gary2ind(I,2)I=ind2 gary(X,map)I=imread('C:\Users\dell\Desktop\111.jpg');subplot(231),imshow(I);title('原图');M=rgb2gray(I);subplot(232),imshow(M);[X,map]=gray2ind(M,100);subplot(233),imshow(X);RGB=ind2rgb(X,map);subplot(234),imshow(X);[X,map]=rbg2ind(I);subplot(235),imshow(X);四、实验效果实验二 图像几何变换实验一、实验目的1.学习几种常见的图像几何变换,并通过实验体会几何变换的效果;2.掌握图像平移、剪切、缩放、旋转、镜像等几何变换的算法原理及编程实现;3.掌握matlab 编程环境中基本的图像处理函数。
图像处理实验报告【篇一:数字图像处理实验报告】数字图像处理实验报告班级:通信103学号:201027201姓名:计富威指导教师:孙洁实验一 matlab数字图像处理初步一、实验目的与要求1.熟悉及掌握在matlab中能够处理哪些格式图像。
2.熟练掌握在matlab中如何读取图像。
3.掌握如何利用matlab来获取图像的大小、颜色、高度、宽度等等相关信息。
4.掌握如何在matlab中按照指定要求存储一幅图像的方法。
5.图像间如何转化。
二、实验内容及步骤1.利用imread( )函数读取一幅图像,假设其名为”第一个.tif”,存入一个数组中;i=imread(第一个.tif);2.利用whos命令提取该读入图像”第一个.tif”的基本信息; whos i3.利用imshow()函数来显示这幅图像;imshow(i);第一个.tif4.利用imfinfo函数来获取图像文件的压缩,颜色等等其他的详细信息;imfinfo(第一个.tif);5.利用imwrite()函数来压缩这幅图象,将其保存为一幅压缩了像素的jpg文件,设为flower.jpg;语法:imwrite(原图像,新图像,‘quality’,q), q取0-100。
imwrite(i,第一个.jpg,quality,50)6.同样利用imwrite()函数将最初读入的tif图象另存为一幅bmp图像,设为flower.bmp。
imwrite(i,第一个.bmp);7.用imread()读入图像:lenna256.jpg 和camemaman.jpg;b=imread(lena256.bmp);c=imread(cameraman.tif);8.用imfinfo()获取图像lenna256.jpg和camemaman.jpg 的大小;imfinfo(lena256.bmp);imfinfo(cameraman.tif);9.用figure,imshow()分别将lenna256.jpg和camemaman.jpg显示出来,观察两幅图像的质量。
数字图像处理实验报告实验⼀、图像的显⽰与格式变换1、实验⽬的1)熟悉常⽤的图像⽂件格式与格式转换;2)熟悉图像矩阵的显⽰⽅法(灰度、索引、⿊⽩、彩⾊);3)熟悉图像矩阵的格式转换2、实验内容练习图像读写命令imread和imwrite并进⾏图像⽂件格式间的转换。
特别是索引图像与1,4,8,16⽐特图像的存储与转换。
3、实验步骤a.⽤图像读命令(imread)从你的硬盘中读取图像(cameramen.tif);b.⽤图像显⽰功能(imshow)将刚读⼊的图像显⽰在⼀图像窗中;c.显⽰颜⾊条功能(colorbar)在图像的左边画⼀条颜⾊亮度显⽰条;d.⽤(imfinfo)功能得到(gray.bmp)图像的相关信息;e.⽤(colormap )获取当前图像的调⾊板,观察调⾊板中的颜⾊设置;f.⽤(getimage)功能从坐标轴取得当前图像数据;g.⽤(imagesc)功能显⽰图像从64-128的灰度值;h. ⽤(immovie)功能将⼀个4-D 图像创建多帧索引图的电影动画;i. ⽤(warp)功能将图像('testpat1.tif)显⽰到纹理映射柱⾯;思考:怎样让(cameraman.tif)图像如下图⼀样显⽰?四.实验结果及代码a.代码:>>X=imread(‘cameraman.tif’)b.代码:>>y=imshow(X)显⽰的图像为:c、代码:>>I = colorbar('cameraman.tif')H=imshow('cameraman.tif')显⽰的图像为d、代码:>>info=imfinfo(‘gray.bmp')显⽰结果为:Filename: [1x71 char]FileModDate: '16-Apr-2010 11:23:52'FileSize: 107786Format: 'bmp'FormatV ersion: 'V ersion 3 (Microsoft Windows 3.x)' Width: 409Height: 259BitDepth: 8ColorType: 'indexed'FormatSignature: 'BM'NumColormapEntries: 256Colormap: [256x3 double]RedMask: []GreenMask: []BlueMask: []ImageDataOffset: 1078BitmapHeaderSize: 40NumPlanes: 1CompressionType: 'none'BitmapSize: 106708HorzResolution: 0V ertResolution: 0NumColorsUsed: 0NumImportantColors: 0e、代码:>>x=imread(‘256.bmp’)color1=colormap %获取当前图象的调⾊板image (x)info=imfinfo(’256.bmp’)color2=info.Colormap %注意观察调⾊板有多少种颜⾊colormap(color2)f、代码:>>I=getimageg、代码:>> imagesc(x,[64 128])h、代码:>> load mri;mov = immovie(D,map); movie(mov,3)显⽰图像为:i.源代码:>>[x,y,z]=cylinder;I= imread('testpat1.tif');warp(x,y,z,I),图像显⽰为:思考:代码:>>X=inread('cameramen.tif'); Y=[X X];[x,-y,z]=cylinder;I=imread(Y);warp(x,y,z,I)显⽰图像为:实验⼆、图像增强⼀、实验⽬的1.理解图像直⽅图的含义;2.了解直⽅图的应⽤;3.掌握直⽅图均衡化的实现⽅法。
图像处理实验报告格式一、封皮的填写:(1)实验课程名称:图像处理(2)实验名称:按顺序填写图像的二维离散傅立叶变换、图象的增强、图像二值化(3)年月:二、纸张要求:统一采用A4大小纸张,左侧装订,装订顺序与实验顺序一致。
三、书写要求:(1)报告除实验图像可以打印外,其余均须手写。
(2)实验图像及结果图像可以打印,图像均位于实验结果与分析部分,图像打印于纸张上部,下部空白处手写实验分析。
(3)报告中图要有图序及名称,表要有表序及名称,每个实验的图序和表序单独标号,具体格式参照毕业设计手册。
不合格者扣除相应分数。
(4)每个实验均需另起一页书写。
四、关于雷同报告:报告上交后,如有雷同,则课程考核以不及格处理。
五、报告撰写格式及实验内容如下:实验一图像的二维离散傅立叶变换一、实验目的掌握图像的二维离散傅立叶变换以及性质二、实验要求1)建立输入图像,在64⨯64的黑色图像矩阵的中心建立16⨯16的白色矩形图像点阵,形成图像文件。
对输入图像进行二维傅立叶变换,将原始图像及变换图像(三维、中心化)都显示于屏幕上。
2)调整输入图像中白色矩形的位置,再进行变换,将原始图像及变换图像(三维、中心化)都显示于屏幕上,比较变换结果。
3)调整输入图像中白色矩形的尺寸(40⨯40,4⨯4),再进行变换,将原始图像及变换图像(三维、中心化)都显示于屏幕上,比较变换结果。
三、实验仪器设备及软件HP D538、MATLAB四、实验原理以自己的语言结合课堂笔记进行总结,要求过程推导清晰明了。
五、实验步骤及程序实验步骤、程序流程、实验源程序齐全(全部手写)六、实验结果与分析实验二图像的增强一、实验目的1)掌握在计算机上进行直方图统计,以及直方图均衡化、线性变换的图像增强的方法2)掌握在计算机上进行图象平滑、图象锐化特别是中值滤波平滑及拉普拉斯算子锐化的方法二、实验要求1)显示图像(cameraman.tif)及灰度直方图。
2)对指定图像(cameraman.tif)进行直方图均衡化和线性变换,将原始图像及增强后的图像都显示于屏幕上,比较增强的效果。
数字图像处理实验报告⼆○⼀⼋~⼆○⼀九学年第⼀学期信息科学与⼯程学院课程设计报告书课程名称:数字图像处理班级:学号:姓名:指导教师:⼆○⼀⼋年⼗⼆⽉⼀、课程设计⽬的:1. 掌握读、写、显⽰图像的基本⽅法。
2. 掌握图像直⽅图的概念、计算⽅法以及直⽅图归⼀化、均衡化⽅法。
3. 掌握图像灰度变换的基本⽅法,理解灰度变换对图像外观的改善效果。
⼆、课程设计内容及要求:1. 读⼊⼀幅图像,判断其是否为灰度图像,如果不是灰度图像,将其转化为灰度图像。
2. 完成灰度图像的直⽅图计算、直⽅图归⼀化、直⽅图均衡化等操作。
3. 完成灰度图像的灰度变换操作,如线性变换、伽马变换、阈值变换(⼆值化)等,分别使⽤不同参数观察灰度变换效果(对灰度直⽅图的影响)。
三、详细设计步骤:1、所使⽤的图像⽂件都保存在Matlab 安装⽬\toolbox\images\imdemos⼦⽬录下。
2、图像的读、写、显⽰操作。
运⽤Matlab 图像处理⼯具箱中的imread函数分别读⼊灰度图像pout.tif、⼆值图像blobs.png 和RGB 图像peppers.png,观察相应的图像矩阵,并运⽤imshow 函数显⽰相应图像。
3、对⼀个RGB 彩⾊图像peppers.png,分别抽取其R、G、B 三个分量层,并显⽰各层图像。
1、以灰度图像pout.tif 为例,运⽤灰度变换法实现图像增强。
2、运⽤Matlab 编程实现灰度直⽅图的统计以及直⽅图均衡化处理过程:(1)计算并绘制原始图像的灰度直⽅图;(2)根据离散累计分布函数,对原始灰度直⽅图进⾏均衡化处理,绘制均衡化后的灰度直⽅图;(3)⽣成均衡化处理后的新图像,显⽰并保存。
(4)⽐较原始图像和新图像的对⽐度。
(1)利⽤Matlab 函数IMNOISE(),在原图上分别叠加⾼斯噪声和椒盐噪声(2)实现均值滤波和中值滤波的功能,去除噪声;(3)调整窗⼝⼤⼩,采⽤对⽐均值滤波中值滤波的性能;1、以灰度图像rice.png 为例,实现Roberts 算⼦、Sobel 算⼦、Prewitt算⼦对其进⾏边缘检测,并实现根据梯度⽣成 5 种不同的增强图像。
数字图像处理实验报告学院名称:信息科学与工程学院专业班级:计科0801姓名:谢旭芳学号:0909080423指导老师:赵欢喜实验二数字图像的空间域滤波和频域滤波一.实验目的1.掌握图像滤波的基本定义及目的;2.理解空间域滤波的基本原理及方法;3.掌握进行图像的空域滤波的方法。
4.掌握傅立叶变换及逆变换的基本原理方法;5.理解频域滤波的基本原理及方法;6.掌握进行图像的频域滤波的方法。
二.实验内容描述1.空间平滑滤波:a)读出eight.tif这幅图像,给这幅图像分别加入椒盐噪声和高斯噪声后并与前一张图显示在同一图像窗口中;(提示:加噪音函数为imnoise)b)对加入噪声图像选用不同的平滑(低通)模板做运算,对比不同模板所形成的效果,要求在同一窗口中显示;(提示:fspecial、imfilter或filter2,或自己编码实现)c)使用函数imfilter时,分别采用不同的填充方法(或边界选项,如零填充、’replicate’、’symmetric’、’circular’)进行低通滤波,显示处理后的图像d)运用for循环,将加有椒盐噪声的图像进行10次,20次均值滤波,查看其特点,显示均值处理后的图像;(提示:利用fspecial函数的’average’类型生成均值滤波器)e)对加入椒盐噪声的图像分别采用均值滤波法,和中值滤波法对有噪声的图像做处理,要求在同一窗口中显示结果。
(提示:medfilt2)f)自己设计平滑空间滤波器,并将其对噪声图像进行处理,显示处理后的图像;2.空间锐化滤波a)读出blurry_moon.tif这幅图像,采用3×3的拉普拉斯算子w = [ 1, 1, 1; 1– 8 1; 1, 1, 1]对其进行滤波;b)编写函数w = genlaplacian(n),自动产生任一奇数尺寸n的拉普拉斯算子,如5×5的拉普拉斯算子w = [ 1 1 1 1 11 1 1 1 11 1 -24 1 11 1 1 1 11 1 1 1 1]c)分别采用5×5,9×9,15×15和25×25大小的拉普拉斯算子对blurry_moon.tif进行锐化滤波,并利用式2=-∇完成图像的锐化增强,观察其有何不同,要g x y f x y f x y(,)(,)(,)求在同一窗口中显示;d)采用不同的梯度算子对blurry_moon.tif进行锐化滤波,并比较其效果e)自己设计锐化空间滤波器,并将其对噪声图像进行处理,显示处理后的图像;3.傅立叶变换a)读出woman.tif这幅图像,对其进行快速傅立叶变换,分别显示其幅度图像和相位图像(提示:fft2, abs, angle)b)仅对相位部分进行傅立叶反变换后查看结果图像(提示:记傅立叶变换的相位a,利用ifft2对exp(a*i)进行反变换)c)仅对幅度部分进行傅立叶反变换后查看结果图像d)将图像的傅立叶变换F置为其共轭后进行反变换,比较新生成图像与原始图像的差异(提示:复数()=的共轭为()|()|j uF u F u eφ()=)F u F u eφ-()|()|j u4.平滑频域滤波a)设计理想低通滤波器、巴特沃斯低通滤波器和高斯低通滤波器,截至频率自选,分别给出各种滤波器的透视图;b)读出test_pattern.tif这幅图像,分别采用理想低通滤波器、巴特沃斯低通滤波器和高斯低通滤波器对其进行滤波(截至频率自选),再做反变换,观察不同的截止频率下采用不同低通滤波器得到的图像与原图像的区别,特别注意振铃效应。
数字图像处理实验报告实验一数字图像基本操作及灰度调整一、实验目的1)掌握读、写图像的基本方法。
2)掌握MATLAB语言中图像数据与信息的读取方法。
3)理解图像灰度变换处理在图像增强的作用。
4)掌握绘制灰度直方图的方法,理解灰度直方图的灰度变换及均衡化的方法。
二、实验内容与要求1.熟悉MATLAB语言中对图像数据读取,显示等基本函数特别需要熟悉下列命令:熟悉imread()函数、imwrite()函数、size()函数、Subplot()函数、Figure()函数。
1)将MATLAB目录下work文件夹中的forest.tif图像文件读出.用到imread,imfinfo等文件,观察一下图像数据,了解一下数字图像在MATLAB中的处理就是处理一个矩阵。
将这个图像显示出来(用imshow)。
尝试修改map颜色矩阵的值,再将图像显示出来,观察图像颜色的变化。
2)将MATLAB目录下work文件夹中的b747.jpg图像文件读出,用rgb2gray()将其转化为灰度图像,记为变量B。
2.图像灰度变换处理在图像增强的作用读入不同情况的图像,请自己编程和调用Matlab函数用常用灰度变换函数对输入图像进行灰度变换,比较相应的处理效果。
3.绘制图像灰度直方图的方法,对图像进行均衡化处理请自己编程和调用Matlab函数完成如下实验。
1)显示B的图像及灰度直方图,可以发现其灰度值集中在一段区域,用imadjust函数将它的灰度值调整到[0,1]之间,并观察调整后的图像与原图像的差别,调整后的灰度直方图与原灰度直方图的区别。
2) 对B 进行直方图均衡化处理,试比较与源图的异同。
3) 对B 进行如图所示的分段线形变换处理,试比较与直方图均衡化处理的异同。
图1.1 分段线性变换函数三、实验原理与算法分析1. 灰度变换灰度变换是图像增强的一种重要手段,它常用于改变图象的灰度范围及分布,是图象数字化及图象显示的重要工具。
1) 图像反转灰度级范围为[0, L-1]的图像反转可由下式获得r L s --=12)对数运算:有时原图的动态范围太大,超出某些显示设备的允许动态范围,如直接使用原图,则一部分细节可能丢失。
实验四-图像增强信息工程学院实验报告课程名称:数字图像处理班级: 姓名: 学号:一、实验目的1.了解图像增强的目的及意义,加深对图像增强的感性认识,巩固所学理论知识。
2. 掌握图像空域增强算法的基本原理。
3. 掌握图像空域增强的实际应用及MATLAB 实现。
4. 掌握频域滤波的概念及方法。
5. 熟练掌握频域空间的各类滤波器。
6.掌握怎样利用傅立叶变换进行频域滤波。
7. 掌握图像频域增强增强的实际应用及MATLAB 实现。
二、实验步骤及结果分析1. 基于幂次变换的图像增强 程序代码:clear all ; close all ;I{1}=double(imread('fig534b.tif')); I{1}=I{1}/255;figure,subplot(2,4,1);imshow(I{1},[]);hold on I{2}=double(imread('room.tif')); I{2}=I{2}/255;subplot(2,4,5);imshow(I{2},[]);hold on for m=1:2 Index=0;for lemta=[0.5 5] Index=Index+1;F{m}{Index}=I{m}.^lemta;subplot(2,4,(m-1)*4+Index+1),imshow(F{m}{Index},[]) end end成 绩:指导老师(签名):执行结果:图1 幂次变换增强结果实验结果分析:由实验结果可知,当r<1时,黑色区域被扩展,变的清晰;当r>1时,黑色区域被压缩,变的几乎不可见。
2.直方图规定化处理程序代码:clear allclcclose all%0.读图像I=double(imread('lena.tiff'));subplot(2,4,1);imshow(I,[]);title('原图')N=32;Hist_image=hist(I(:),N);Hist_image=Hist_image/sum(Hist_image);Hist_image_cumulation=cumsum(Hist_image);%累计直方图subplot(245);stem(0:N-1,Hist_image);title('原直方图');%1.设计目标直方图Index=0:N-1;%正态分布直方图Hist{1}=exp(-(Index-N/2).^2/N);Hist{1}=Hist{1}/sum(Hist{1});Hist_cumulation{1}=cumsum(Hist{1});subplot(242);stem([0:N-1],Hist{1});title('规定化直方图1');%倒三角形状直方图Hist{2}=abs(2*N-1-2*Index);Hist{2}=Hist{2}/sum(Hist{2});Hist_cumulation{2}=cumsum(Hist{2});subplot(246);stem(0:N-1,Hist{2});title('规定化直方图2');%2. 规定化处理Project{1}=zeros(N);Project{2}=zeros(N);Hist_result{1}=zeros(N);Hist_result{2}=zeros(N);for m=1:2Image=I;%SML 处理(SML,Single Mapping Law 单映射规则 for k=1:NTemp=abs(Hist_image_cumulation(k)-Hist_cumulation{m});[Temp1,Project{m}(k)]=min(Temp); end%2.2 变换后直方图 for k=1:NTemp=find(Project{m}==k); if isempty(Temp) Hist_result{m}(k)=0; elseHist_result{m}(k)=sum(Hist_imag e(Temp)); end endsubplot(2,4,(m-1)*4+3); stem(0:N-1,Hist_result{m}); title(['变换后的直方图',num2str(m)]); %2.3结果图 Step=256/N; for K=1:NIndex=find(I>=Step*(k-1)&I<Step *k);Image(Index)=Project{m}(k); endsubplot(2,4,(m-1)*4+4),imshow(I mage,[]);title(['变换后的结果图',num2str(m)]); end执行结果:原图0.020.040.060.080.100.020.040.060.080.100.020.040.060.08规定化直方图220400.050.10.150.2变换后的直方图1变换后的结果图1020400.020.040.060.080.10.12变换后的直方图2变换后的结果图2图2 直方图规定化实验结果分析:由实验结果可知,采用直方图规定化技术后,原图的直方图逼近规定化的直方图,从而有相应的变换后的结果图1和变换后的结果图2。
科学研究报告中如何展示实验结果的图像处理与分析导语:科学研究中,实验结果的图像处理与分析是非常重要的环节。
通过对图像进行处理和分析,可以得出更准确、更有说服力的结论,提升实验的可靠性和科学性。
本文将从图像处理的选择、图像处理工具的使用、结果的呈现方式、图像分析的方法以及图像处理的注意事项等方面进行讨论。
一、图像处理的选择图像处理在科学研究中有着广泛的应用。
选择合适的图像处理方法对于准确地提取实验结果非常重要。
常见的图像处理方法包括滤波、增强、分割、配准等。
根据实验的需求,选择相应的图像处理方法可以提高实验结果的可视化效果和准确性。
二、图像处理工具的使用现今有许多成熟的图像处理工具可供选择,如Adobe Photoshop、ImageJ等。
这些工具具有丰富的功能和友好的界面,可对图像进行裁剪、旋转、亮度对比度调整、去噪等操作。
此外,还可以进行图像分割、特征提取、测量等功能,供科学家深入研究实验结果。
三、结果的呈现方式展示实验结果时,选择合适的呈现方式也是至关重要的。
常见的方式包括线图、柱状图、散点图、热图、地图等。
线图适用于展示随时间变化的趋势,柱状图适用于不同条件下的比较,散点图适用于相关性分析,热图适用于显示数据的密度分布,地图适用于空间分布的展示。
根据实验的目的和结果的特点,选择合适的呈现方式可以更好地传达实验的信息。
四、图像分析的方法图像分析是科学研究中必不可少的一环。
通过图像分析,可以获得实验结果的定量指标。
常见的图像分析方法包括边缘检测、形态学处理、区域提取等。
通过这些方法,可以计算图像中目标物体的大小、形状、数量等参数,为后续的数据分析和统计提供依据。
五、图像处理的注意事项在进行实验结果的图像处理时,需要注意以下几点。
首先,要保持原始数据的完整性和准确性,尽量避免图像处理过程中的误操作。
其次,要选择合适的图像处理方法,避免过度处理或错失重要信息。
此外,要保持图像处理的一致性,确保不同样本或不同条件下的图像处理结果可比性。
(二)TIF格式概览TIF由四个部分组成,分别为图像头文件、图像文件目录、目录入口、图像数据。
1、图像头文件(Image File Header简称IFH):图一 IFH结构描述IFH数据结构包含3个成员共计8个字节,Byte order成员可能是“MM”(0x4d4d)或“II”(0x4949),0x4d4d表示该TIFF图是摩托罗拉整数格式 0x4949表示该图是Intel整数格式;Version成员总是包含十进制42(0x2a),它用于进一步校验该文件是否为TIF格式,42这个数并不是一般人想象中的那样认为是TIF软件的版本,实际上,42这个数大概永远不会变化;第三个成员是IFD(接下来要说的第二个数据结构)相对文件开始处的偏移量。
2、图像文件目录(Image File Directory简称IFD):图二IFD及DE结构描述IFD是TIF图中最重要的数据结构,它包含了一个TIF文件中最重要的信息,一个TIF图可能有多个IFD,这说明文件中有多个图像,每个IFD标识1个图像的基本属性。
IFD结构中包含了三类成员,Directory Entry Count指出该结构里面有多少个目录入口;接下来就是N个线性排列的DE序列,数量不定(这就是为什么称TIF格式文件为可扩充标记的文件,甚至用户可以添加自定义的标记属性),每个DE标识了图像的某一个属性;最后就是一个偏移量,标识下一个文件目录相对于文件开始处的位置,当然,如果该TIF文件只包含了一幅图像,那么就只有一个IFD,显然,这个偏移量就等于0;3、目录入口(Directory Entry简称DE):共12个字节,见图二。
简单说,一个DE就是一幅图像的某一个属性。
例如图像的大小、分辨率、是否压缩、像素的行列数、一个像素由几位表示(1位代表黑白两色,8位代表256色等等)等。
其中:tag成员是该属性的编号,在图像文件目录中,它是按照升序排列的。
我们可以通过读这些编号,然后到TIF格式官方白皮书中查找相应的含义。
属性是用数据来表示的,那么type就是代表着该数据的类型,TIF官方指定的有5种数据类型。
type=1就是BYTE类型(8位无标记整数)、type=2是ASCII类型(7位ASCII码加1位二进制0)、type=3是SHORT类型(16位无标记整数)、type=4是L ONG 类型(32位无标记整数)、type=5是RATIONAL类型(2个LONG,第一个是分子,第二个是分母)。
length成员是数据的数量而不是数据类型的长度。
第4个成员valu eOffset很重要,它是tag标识的属性代表的变量值相对文件开始处的偏移量。
如果变量值占用的空间小于4个字节,那么该值就存放在 valueOffset中即可,没必要再另外指向一个地方了4、图像数据本程序提供的图像是基于256灰度级的,即一个字节代表一个像素点,它是0x00~0xff区间中256个灰度级的任意一个整数。
通过使用UltraEdit工具观察,我们发现该图像文件的组织形式是:IFH--数据--IFD。
以下的示例说明遵循了这一观察结果。
四、程序设计1、VC创建一个MFC AppWizard(exe)工程取名TiffTest,选择单文档程序。
2、添加TiffStruct.h文件,定义IFH和DE结构(参考前面的结构描述),用来接收读TIF文件的信息。
#ifndef _TIFFSTRUCT_#define _TIFFSTRUCT_typedef struct tagIMAGEFILEHEADER{WORD byteOrder;WORD version;DWORD offsetToIFD;}IFH;typedef struct tagDIRECTORYENTRY{WORD tag;WORD type;DWORD length;DWORD valueOffset;}DE;#endif3、在文档类中添加4个公有变量,并将其初始化为0。
在TiffTestDoc.cpp中#include "TiffStruct.h"DWORD m_dwBmSize;//图象的数据部分的大小CPalette m_palDIB; //BMP图象调色板HANDLE m_hDIB;//BMP图象内存块句柄CSize m_sizeDoc; //图象的长和宽4、在文档类的OnOpenDocument函数中定义局部工具变量并读文件DWORD dwFileLength = 0;CString strTemp = _T("");WORD wDECount = 0;BYTE* pDIB = NULL;int i = 0;IFH ifh;ZeroMemory(&ifh, sizeof(IFH));CFile file;CFileException fe;if(0 == file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe)){AfxMessageBox("打开文件失败");return FALSE;}dwFileLength = file.GetLength();5、读IFH文件头if(sizeof(IFH) != file.Read(&ifh, sizeof(IFH))){AfxMessageBox("读TIF文件头失败");return FALSE;}if(0x2a != ifh.version){AfxMessageBox("该文件不是TIF格式,读文件失败");return FALSE;}if(0x4949 != ifh.byteOrder){AfxMessageBox("该TIF文件不是IBMPC字节序,读文件失败");return FALSE;}file.Seek(ifh.offsetToIFD, CFile::begin);//将文件指针定位到IFD6、读文件有多少个目录入口if(2 != file.Read(&wDECount, 2)){AfxMessageBox("无法获得TIF文件目录入口数量");return FALSE;}strTemp.Format("该TIF文件有%d个目录入口", wDECount);AfxMessageBox(strTemp); //显示有多少个目录入口7、创建DE数组,接收信息,数组中有wDECount个元素DE* pde = new DE[wDECount];DE* pTemp = pde;memset(pde, 0, sizeof(DE)*wDECount);if(sizeof(DE)*wDECount != file.ReadHuge(pde, sizeof(DE)*wDECount)) {AfxMessageBox("读图象文件目录失败");delete []pde;return FALSE;}8、显示图像文件目录信息for(i=0; i<wDECount; i++){pTemp = pde + i;strTemp.Format("DE[%d].tag = %d\r\nDE[%d].type = %d\r\nDE[%d].length = %d\r\nDE[%d].valueOffset=%d",i,pTemp->tag,i,pTemp->type,i,pTemp->length,i,pTemp->valu eOffset);AfxMessageBox(strTemp);//显示目录文件信息}9、把图像的大小和图像数据的容量保存到成员变量中for(i=0; i<wDECount; i++){pTemp = pde + i;if(256 == pTemp->tag)//tag为256的目录入口中的变量标识了图象宽度{m_sizeDoc.cx = pTemp->valueOffset;}if(257 == pTemp->tag)// tag为257的目录入口中的变量标识了图象长度{m_sizeDoc.cy = pTemp->valueOffset;}if(273 == pTemp->tag)//计算图象数据占用字节数{m_dwBmSize = m_sizeDoc.cx * m_sizeDoc.cy;}}10、在文档类中创建一个成员工具函数CreateBmpBuffer,申请全局内存块以存放BMP 文件结构数据BOOL CTiffTestDoc::CreateBmpBuffer(){//申请BMP内存块m_hDIB = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,sizeof(BITMAPFILEHEADER) +sizeof(BITMAPINFOHEADER) +256*sizeof(RGBQUAD) +m_dwBmSize);if(NULL == m_hDIB){AfxMessageBox("申请BMP内存块失败");return FALSE;}else{return TRUE;}}11、回到OnOpenDocument成员函数中调用工具函数并获得全局内存块指针//构造BMP图象内存块if(!CreateBmpBuffer()){AfxMessageBox("构造BMP图象内存块失败");delete []pde;return FALSE;}//获得BMP内存块指针pDIB = (BYTE*)GlobalLock(m_hDIB);if(NULL == pDIB){AfxMessageBox("获得BMP内存块指针失败");GlobalUnlock(m_hDIB);delete []pde;return FALSE;}12、将图像信息填充到BMP内存块中,(注:BMP文件中图像数据的第一行代表的是最终显示光栅的最后一行,所以在数据排列中要颠倒过来。
)//构造BITMAPFILEHEADER并复制到BMP内存块BITMAPFILEHEADER bmfHdr;memset(&bmfHdr, 0, sizeof(BITMAPFILEHEADER));bmfHdr.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +256*sizeof(RGBQUAD);bmfHdr.bfReserved1 = 0;bmfHdr.bfReserved2 = 0;bmfHdr.bfSize = bmfHdr.bfOffBits + m_dwBmSize;bmfHdr.bfType = 0x4d42;memmove(pDIB, &bmfHdr, sizeof(BITMAPFILEHEADER));//构造BITMAPINFOHEADER并复制到BMP内存块BITMAPINFOHEADER bmiHdr;memset(&bmiHdr, 0, sizeof(BITMAPINFOHEADER));bmiHdr.biBitCount = 8;bmiHdr.biClrImportant = 0;bmiHdr.biClrUsed = 0;bmiHdr.biCompression = 0;bmiHdr.biHeight = m_sizeDoc.cy;bmiHdr.biPlanes = 1;bmiHdr.biSize = sizeof(BITMAPINFOHEADER);bmiHdr.biSizeImage = 0;bmiHdr.biWidth = m_sizeDoc.cx;bmiHdr.biXPelsPerMeter = 2834;bmiHdr.biYPelsPerMeter = 2834;memmove((BITMAPFILEHEADER*)pDIB + 1, &bmiHdr, sizeof(BITMAPINFOHEADER));//构造256个RGBQUAD并复制到BMP内存块RGBQUAD* pRgbQuad = (RGBQUAD*)(pDIB + sizeof(BITMAPFILEHEADER) +sizeof(BITMAPINFOHEADER));RGBQUAD* pOldQuad = pRgbQuad;RGBQUAD rgbQuad;memset(&rgbQuad, 0, sizeof(RGBQUAD));for(i=0; i<256; i++){rgbQuad.rgbBlue = i;rgbQuad.rgbGreen = i;rgbQuad.rgbRed = i;rgbQuad.rgbReserved = 0;pRgbQuad = pOldQuad + i;memmove(pRgbQuad, &rgbQuad, sizeof(RGBQUAD));}//填充所有像素数据, 颠倒图象数据从最后一行开始读起int j = 0;for(i=m_sizeDoc.cy-1; i>=0; i--){file.Seek(sizeof(IFH) + i*m_sizeDoc.cx, CFile::begin);file.Read((BYTE*)(pRgbQuad + 1) + j*m_sizeDoc.cx, m_sizeDoc.cx);j++;}13、初始化BMP调色板,为显示BMP文件做准备//初始化专用调色板BYTE buf[2+2+4*256];LOGPALETTE* pPal = (LOGPALETTE*)buf;pPal->palVersion = 0x300;pPal->palNumEntries = 256;for(i=0; i<255; i++){pPal->palPalEntry[i].peBlue = i;pPal->palPalEntry[i].peFlags = 0;pPal->palPalEntry[i].peGreen = i;pPal->palPalEntry[i].peRed = i;}m_palDIB.CreatePalette(pPal);14、(附加功能)生成bmp文件CFile fileWrite("C:\Documents and Settings\Administrator\桌面\mytiff.bmp", CFile::modeCreate | CFile::modeWrite);fileWrite.WriteHuge(pDIB, sizeof(BITMAPFILEHEADER) +sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD) + m_dwBmSize);15、OnOpenDocument成员函数返回前的清理工作GlobalUnlock(m_hDIB);delete []pde;return TRUE;至此,TIF文件信息已转换为BMP图像并保存在全局内存块中了,接下来就可以在OnDraw中调用WinAPI函数StretchDIBits来显示它。