unsigned char rgbGreen;unsigned char rgbRed;unsigned char rgbReserved;RGBQUAD;unsigned int width,depth;unsigned int d,ij,nn,unsigned char *color,main(int argc,char *argv[)tFILE*fp;FILE*FL2;unsigned int G[255];BITMAPFILEHEADERFileHeader,BITMAPINFOHEADER InfoHeader,RGBQUAD rgbquad;/*读取/写入表头信息*if(argcl=3)tprintf("Usage:bmpinputfile.bmpoutputfile.bmpln");printf("Error inputformat"),exit(0),if(fp=fopen(argv[1],"rb")--NULL)1printf("Cannot open the file1.bmpln"),getchO,exit(1);-if(fread(char*)&FileHeader,1,sizeof(BITMAPFILEHEADER),fp)I=sizeof(BITMAPFILEHEADER)1printf("%s read error256color.bmpln");getch(),9
9 unsigned char rgbGreen; unsigned char rgbRed; unsigned char rgbReserved; }RGBQUAD; unsigned int width,depth; unsigned int d,i,j,nn; unsigned char *color; main(int argc,char *argv[]) { FILE *fp; FILE *FL2; unsigned int G[255]; BITMAPFILEHEADER FileHeader; BITMAPINFOHEADER InfoHeader; RGBQUAD rgbquad; /*读取/写入表头信息*/ if(argc!=3) { printf("Usage:bmp inputfile.bmp outputfile.bmp\n"); printf("Error inputformat"); exit(0); } if((fp=fopen(argv[1],"rb"))==NULL) { printf("Cannot open the file1.bmp\n"); getch(); exit(1); } if(fread((char*)&FileHeader,1,sizeof(BITMAPFILEHEADER),fp) !=sizeof(BITMAPFILEHEADER)) { printf("%s read error 256color.bmp\n"); getch();
exit(1),if(fread((char*)&InfoHeader,1,sizeof(BITMAPINFOHEADER),fp)I=sizeof(BITMAPINFOHEADER))(printf("%s read error 256color.bmpln");getcho);exit(1);if(FileHeader.bfTypel="BM")printf("Please input BMP fileln");getchO;exit(1);if(InfoHeader.biCompress!=0)printf("Only supports non_compressed BMP fileln");getch,exit(1);if(InfoHeader.biBitCount!=8)1printf("%s id not a 256 BMP file 256color.bmpln");getchO;exit(1),FL2-fopen(argv[2],"wb");fwrite((char*)&FileHeader,1,sizeof(BITMAPFILEHEADER),FL2);fwrite((char*)&InfoHeader,1.sizeof(BITMAPINFOHEADER),FL2)width-InfoHeader.biWidth,depth-InfoHeader.biHighth;nn=(width+3)/4*4:10
10 exit(1); } if(fread((char*)&InfoHeader,1,sizeof(BITMAPINFOHEADER),fp) !=sizeof(BITMAPINFOHEADER)) { printf("%s read error 256color.bmp\n"); getch(); exit(1); } if(FileHeader.bfType!="BM") { printf("Please input BMP file\n"); getch(); exit(1); } if(InfoHeader.biCompress!=0) { printf("Only supports non_compressed BMP file\n"); getch(); exit(1); } if(InfoHeader.biBitCount!=8) { printf("%s id not a 256 BMP file 256color.bmp\n"); getch(); exit(1); } FL2=fopen(argv[2],"wb"); fwrite((char*)&FileHeader,1,sizeof(BITMAPFILEHEADER),FL2); fwrite((char*)&InfoHeader,1,sizeof(BITMAPINFOHEADER),FL2); width=InfoHeader.biWidth; depth=InfoHeader.biHighth; nn=(width+3)/4*4;
d=depth;/*读取/写入调色盘资料*/for(i=0;i<256;i++)tfread((char*)&rgbquad,1,sizeof(RGBQUAD),fp),fwrite(char*)&rgbquad,1,sizeof(RGBQUAD),FL2);-/*读取/写入影像资料,并进行直方图统计*fseek(fp,FileHeader.bfoffBits,SEEK_SET),fseek(FL2,FileHeader.bfoffBits,SEEK_SET),for(i=0;i<256;i++)G[i]=0;for(i=0;i<d;i++)for(j=0j<nn;j++)fread(&color,1,1,fp);d=(int)color,G[d]++;fwrite(&color,1,1,FL2),wfclose(FL2);feclose(fp);,/*屏幕输出直方图统计结果*/for(i=0;i<256;i++)printf("g%5d=%3d",i,G[i]);111
11 d=depth; /*读取/写入调色盘资料*/ for(i=0;i<256;i++) { fread((char*)&rgbquad,1,sizeof(RGBQUAD),fp); fwrite((char*)&rgbquad,1,sizeof(RGBQUAD),FL2); } /*读取/写入影像资料,并进行直方图统计*/ fseek(fp,FileHeader.bfoffBits,SEEK_SET); fseek(FL2,FileHeader.bfoffBits,SEEK_SET); for(i=0;i<256;i++)G[i]=0; for(i=0;i<d;i++) for(j=0;j<nn;j++) { fread(&color,1,1,fp); d=(int)color; G[d]++; fwrite(&color,1,1,FL2); } fclose(FL2); fclose(fp); /*屏幕输出直方图统计结果*/ for(i=0;i<256;i++) printf("g%5d=%3d",i,G[i]); }
实验二灰度图像的线性变换一、实验目的1.了解直方图灰度变换的基本原理;2.掌握直方图线性变换处理的方法;3.利用C编写图像的线性变换处理的程序;4.在微机上调试程序。二、实验原理灰度级修正是对图像在空间域进行增强的简单而效果明显的方法,根据图像降质不同的原因以及对图像特征的不同要求而采用不同的修正方法。主要有灰度变换法和直方图修正法。它们是把原图像的灰度函数f(x,y)经过一个变换函数T(.)变换成一个新的图像函数g(x,y),即g(x, y)=T[f(x, y)]通过变换,达到对比度增强的效果,要注意在变换的过程中,对每一个象素(x,y)都经过了同样的处理,因此该方法又叫做点处理。本实验完成灰度图像直方图的线性变换处理。1.灰度变换法般成像系统只具有一定的亮度范围,亮度的最大值与最小值之比称为对比度。由于形成图像的系统亮度有限,常出现对比度不足的整病,使人眼观看图像时视觉效果很差,通过灰度变换法可以大大改善人的视觉效果。灰度变换法又可分为三种:线性、分段线性及非线性变换。4(1)线性变换d假定原图像f(x,y)的灰度范围为[a,b],g(x,希望变换后图像g(x,y)的灰度范围扩展至3[c,d],线性变换表示式为:cg(x, y)=[(d-c) / (b-a) f(x, y)+c此关系式可用图3-1表示。若图像中大部oba分象素的灰度级分布在区间[a,b],很小部分的f(x, y)灰度级超出了此区间,为改善增强的效果,图3-1灰度范围线性变换可令:0< f(x, y)<aas f(x, y) ≤bg(x, y)=[(d-c) / (b-a)] f(x, y)+c12
12 实验二 灰度图像的线性变换 一、实验目的 1.了解直方图灰度变换的基本原理; 2.掌握直方图线性变换处理的方法; 3.利用 C 编写图像的线性变换处理的程序; 4.在微机上调试程序。 二、实验原理 灰度级修正是对图像在空间域进行增强的简单而效果明显的方法,根据图像降质不同 的原因以及对图像特征的不同要求而采用不同的修正方法。主要有灰度变换法和直方图修 正法。它们是把原图像的灰度函数 f(x,y)经过一个变换函数 T(.)变换成一个新的图像函 数 g(x,y),即 g(x,y)=T[f(x,y)] 通过变换,达到对比度增强的效果,要注意在变换的过程中,对每一个象素(x,y)都经 过了同样的处理,因此该方法又叫做点处理。 本实验完成灰度图像直方图的线性变换处理。 1.灰度变换法 一般成像系统只具有一定的亮度范围,亮度的最大值与最小值之比称为对比度。由于 形成图像的系统亮度有限,常出现对比度不足的弊病,使人眼观看图像时视觉效果很差, 通过灰度变换法可以大大改善人的视觉效果。灰度变换法又可分为三种:线性、分段线性 及非线性变换。 (1)线性变换 假定原图像 f(x,y)的灰度范围为[a,b], 希望变换后图像 g(x,y) 的灰度范围扩展至 [c,d],线性变换表示式为: g(x,y)=[(d-c)/(b-a)] f(x,y)+c 此关系式可用图 3-1 表示。若图像中大部 分象素的灰度级分布在区间[a,b],很小部分的 灰度级超出了此区间,为改善增强的效果, 可令: c 0< f(x,y)<a g(x,y)= [(d-c)/(b-a)] f(x,y)+c a f(x,y) b g(x,y) a b d c 0 f(x,y) 图 3-1 灰度范围线性变换
db< f(x,y)<Fmax其中Fmax为输入图像的最大灰度值。(2)分段线性变换为了突出感兴趣的目标或灰度区间,相对抑制那些不感兴趣的目标或灰度区间,常采用分段线性变换法。常用的是三段线性变换法,如图3-2所示,其数学表达式为: (c/a)f(x, y)0<f(x,y)<a[(d-c) / (b-a)]f(x, y)+ca<f (x, y)≤bg(x, y)=-[(Gr-d) / (Fx-b)] [f (x, y)-b+d]b<f (x, y)≤Fmax4图中对灰度区间[a,b]进行了线性变换,而灰度区间[o,a][b,F]受到了压Gmax缩。通过细心调整折线拐点的位置及控制分段直线的斜率,可对任一灰度区间进行dg(x,扩展或压缩。这种变换适用于在黑色或白L色附近有噪声于扰的情况。例如照片中的划痕,由于变换后0~a以及b~Fx之间的o1abFmax灰度受到压缩,因而使噪声于扰得到减弱。f(x, y)图3-2分段线性变换(3)非线性灰度变换当用某些非线性函数,例如用对数函数作为映射函数时,可实现图像灰度的非线性变换,对数变换的一般式为:g(x, y)=a+ln[f (x, y)+1]/ (b*ln[c])这里a、b、c是便于调整曲线的位置和形状而引入的参数,它使低灰度范围的图像得以扩展而高灰度图像得到压缩,从而使图像的分布均匀与人的视觉特性相匹配。指数变换的一般式为:g (x, y)=betE()-l-1其中a、b、c三个参数用来调整曲线的位置和形状,它的效果与对数相反,它将对图像的高灰度区给予较大的扩展。2.灰度图像直方图的线性变换算法流程将灰度图像f(x,y)在区间[a,b]上的象素值,变换到区间[c,d](c<d)上。a,b并不一定要求是f(x,y)的最小和最大灰度值,可以随意设定。因此算法的功能是把输入图像的灰度区间[a,b]变换到输出图像的灰度区间[c,d],也可把特定灰度值区间扩展到整个区间,即进行对比度伸展处理。输入数组ii[Row][Col]=输入图像(灰度图像)13
13 d b< f(x,y)< Fmax 其中 Fmax为输入图像的最大灰度值。 (2)分段线性变换 为了突出感兴趣的目标或灰度区间,相对抑制那些不感兴趣的目标或灰度区间,常采 用分段线性变换法。常用的是三段线性变换法,如图 3-2 所示,其数学表达式为: (c/a)f(x,y) 0<f(x,y)<a g(x,y)= [(d-c)/(b-a)]f(x,y)+c af(x,y)b [(Gmax-d)/(Fmax-b)][f(x,y)-b+d] b<f(x,y)Fmax 图中对灰度区间[a,b]进行了线性变 换,而灰度区间[0,a] [b,Fmax]受到了压 缩。通过细心调整折线拐点的位置及控制 分段直线的斜率,可对任一灰度区间进行 扩展或压缩。这种变换适用于在黑色或白 色附近有噪声干扰的情况。例如照片中的 划痕,由于变换后 0~a 以及 b~Fmax之间的 灰度受到压缩,因而使噪声干扰得到减弱。 (3)非线性灰度变换 当用某些非线性函数,例如用对数函数作为映射函数时,可实现图像灰度的非线性变 换,对数变换的一般式为: g(x,y)=a+ln[f(x,y)+1]/(b*ln[c]) 这里 a、b、c 是便于调整曲线的位置和形状而引入的参数,它使低灰度范围的图像得 以扩展而高灰度图像得到压缩,从而使图像的分布均匀与人的视觉特性相匹配。 指数变换的一般式为: g(x,y)=b c[f(x,y)-a] -1 其中 a、b、c 三个参数用来调整曲线的位置和形状,它的效果与对数相反,它将对图 像的高灰度区给予较大的扩展。 2.灰度图像直方图的线性变换算法流程 将灰度图像 f(x,y)在区间[a,b]上的象素值,变换到区间[c,d](c<d)上。a,b 并不 一定要求是 f(x,y)的最小和最大灰度值,可以随意设定。因此算法的功能是把输入图像的 灰度区间[a,b] 变换到输出图像的灰度区间[c,d],也可把特定灰度值区间扩展到整个区 间,即进行对比度伸展处理。 输入数组 ii[Row][Col]=输入图像(灰度图像) Gmax Fmax f(x,y) b 0 a g(x,y) c d 图 3-2 分段线性变换