直方图均衡实验报告

合集下载

直方图均衡化实验报告

直方图均衡化实验报告

多媒体技术实验报告项目名称: bmp文件直方图均衡
提交文档学生姓名:
提交文档学生学号:
教师评阅成绩:
教师评阅意见:
......................... .........................
1.提交报告时间: 2013年 11月16日
2.实验题目: bmp文件直方图均衡
3.实验要求:
1)读入给定BMP格式图像,
2)求输入图像的直方图, 并以文本文件形式输出
3)完成直方图均衡,
4)将直方图均衡后图像以BMP格式输出
5)计算均衡后图像的直方图, 并以文本文件形式输出
6)观察比较均衡前后图像及直方图的不同
4.实验环境: windows 7 操作系统、vc6.0
5.算法描述:
●程序流程图
●测试程序说明
1.用户需将欲测试文件放在该程序目录下
2.启动程序并输入bmp文件名即可,在该目录下的”resource”文件夹下可以看到运
行后的bmp图像以及在bmp图像均衡前后的直方图输出。

6.源程序清单:
●添加必要的注释
7.运行结果:
测试数据选择
测试结果分析
直方图均衡化前的直方图
直方图均衡化后的脂肪图
8.实验运行情况分析(包括算法、运行结果、运行环境等问题的总体讨论)。

●收获
掌握了bmp文件的一些基本特性以及其存储结构, 此外还掌握了直方图均衡的作用与实现。

●特色
●操作简单, 效果良好
●不足
当测试的bmp图片数据很大时, 可能存在内存溢出的现象。

直方图均衡化和直方图规定化-实验报告

直方图均衡化和直方图规定化-实验报告

一、实验目的掌握直方图均衡化和直方图规定化的图像增强方法掌握图像平滑滤波和锐化滤波的模板计算方法二、实验内容:1. 使用IPT中imhist,histeq函数进行直方图的均衡化和规定化,并显示结果2. 编写myhisteq函数实现直方图均衡化,与1中结果进行对比3. 给读取的图像叠加椒盐噪音(imnoise),分别使用均值滤波和中值滤波进行去噪,并对比图像处理的结果(使用IPT函数)4. 自定义3*3模板矩阵F,编写myfilter函数实现模板和图像的卷积运算,设计模板矩阵,实现图像的平滑和锐化。

三、实验代码及结果(1) 直方图的均衡化和规定化clc;clear;I= imread('H:\image\jpg\flower.jpg');I= rgb2gray(I) ; %将图像转换为灰度图像J= histeq( I) ; %对I 进行直方图均衡化figure,subplot( 2,2,1) ,imshow(I) ,title('原始图像') ;subplot (2,2,2), imshow(J), title('直方图均衡化后的图像');subplot( 2,2,3) ,imhist(I, 64), title( '原始的直方图');subplot( 2,2,4) ,imhist(J,64) ,title(' 均衡化后的直方图');clc;clear;I= imread('H:\image\jpg\flower.jpg');I= rgb2gray(I) ; %将图像转换为灰度图像h=0:255;h=1-h/255;J= histeq( I,h) ;figure,subplot( 2,3,1) ,imshow(I) ,title('原图像') ; subplot( 2,3,2) ,imhist(I, 64), title( '原图像的直方图'); subplot (2,3,3), stem(h), title('目标直方图');subplot( 2,3,4) ,imshow(I, 64), title( '规定化后的图像'); subplot( 2,3,5) ,imhist(J,64) ,title(' 规定化后的直方图');二、myhisteq函数实现直方图均衡化I = imread('j:\image\jpg\flower.jpg');I = rgb2gray(I);[height,width] = size(I);figuresubplot(2,2,1)imshow(I)%显示原始图像title('原图像');subplot(2,2,2)imhist(I)%显示原始图像直方图title('原图像直方图');%进行像素灰度统计;s = zeros(1,256);%统计各灰度数目,共256个灰度级for i = 1:heightfor j = 1: widths(I(i,j) + 1) = s(I(i,j) + 1) + 1;%对应灰度值像素点数量增加一endend%计算灰度分布密度p = zeros(1,256);for i = 1:256p(i) = s(i) / (height * width * 1.0);end%计算累计直方图分布c = zeros(1,256);c(1) = p(1);for i = 2:256c(i) = c(i - 1) + p(i);end%累计分布取整,将其数值归一化为1~256c = uint8(255 .* c + 0.5);%对图像进行均衡化for i = 1:heightfor j = 1: widthI(i,j) = c(I(i,j)+1);endendsubplot(2,2,3)imshow(I)%显示均衡化后的图像title('均衡化后图像');subplot(2,2,4)imhist(I)%显显示均衡化后的图像的直方图title('均衡化后图像的直方图');三、使用均值滤波和中值滤波进行去噪I= imread('j:\image\jpg\flower.jpg');I= rgb2gray(I) ; %将图像转换为灰度图像I1 = imnoise(I,'salt & pepper',0.02);%0.02是噪声强度,其值越大噪声越多h=fspecial('average',5);J1=filter2(h,I1,'valid');J2= imfilter(I1,h,'full');figure,subplot(3,3,1),imshow(I1);title('原始椒盐噪声图像图1');subplot(3,3,2),imshow(uint8(J1));title('filter2均值滤波图2');subplot(3,3,3),imshow(J2);title('imfilter均值滤波图3');J3 = medfilt2(I1,[5,5]);subplot(3,3,4),imshow(J3),title('中值滤波效果图4');G1= histeq(I1);subplot(3,3,5),imhist(G1,64),title('原图均衡化后的直方图');G2= histeq(J1);subplot(3,3,6),imhist(uint8(G2),64),title('图2均衡化后直方图'); G3= histeq(J2);subplot(3,3,7),imhist(G3,64),title('图3均衡化后直方图');G4= histeq(J3);subplot(3,3,8),imhist(G4,64),title('图4均衡化后直方图');问题:对于filter2均值滤波均衡化直方图不显示,不知道原因。

数字图像处理实验报告直方图均衡化

数字图像处理实验报告直方图均衡化

数字图像处理实验报告实验名称:直方图均衡化姓名:班级:学号:专业:电子信息工程(2+2)指导教师:陈华华实验日期:2012年5月24日直方图均衡化图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法。

直方图均衡化是最常见的间接对比度增强方法。

直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。

直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。

直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。

直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。

缺点:1)变换后图像的灰度级减少,某些细节消失;2)某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。

直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。

这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。

通过这种方法,亮度可以更好地在直方图上分布。

这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。

直方图均衡化的基本思想是把原始图的直方图变换为均匀分布的形式,这样就增加了象素灰度值的动态范围从而可达到增强图像整体对比度的效果。

设原始图像在(x,y)处的灰度为f,而改变后的图像为g,则对图像增强的方法可表述为将在(x,y)处的灰度f映射为g。

在灰度直方图均衡化处理中对图像的映射函数可定义为:g = EQ (f),这个映射函数EQ(f)必须满足两个条件(其中L为图像的灰度级数):(1)EQ(f)在0≤f≤L-1范围内是一个单值单增函数。

这是为了保证增强处理没有打乱原始图像的灰度排列次序,原图各灰度级在变换后仍保持从黑到白(或从白到黑)的排列。

(2)对于0≤f≤L-1有0≤g≤L-1,这个条件保证了变换前后灰度值动态范围的一致性。

直方图均衡化实验报告

直方图均衡化实验报告

医学图像处理实验报告实验名称:直方图均衡化实验姓名:gao jun qiang 学号:20105405班级:生医1001指导教师:……2013年6月5日一、 实验目的1、编程实现下列功能:读出存储的黑白灰度图象并显示,显示灰度直方图,对图象进行直方图均衡化处理,显示处理后图象及直方图,画出灰度变换曲线,并存储处理后图象。

二、 实验原理直方图均衡化处理的中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。

直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。

直方图均衡化是一种自动调节图象对比度质量的算法,使用的方法是灰度级变换:s = T(r) 。

它的基本思想是通过灰度级r 的概率密度函数p(rk ),求出灰度级变换T(r).灰度直方图的计算十分简单,依据定义在离散形式下有下面的公式成立:()1,1,0,-==L k n n k p k Λ (1) 公式中:k n 为图像中出现k s 级灰度的像素数,n 是图像像素总数,而n nk 即为频数。

计算累积直方图各项:()1,1,0,00-===∑∑==L k i p n n t k i ki i k Λ (2) 取整扩展:]5.0)1int[(+-=k k t L t (3)映射对应关系 :k t k ⇒三、实验代码及结果直方图均衡化实验代码:clc;close all;clear all;Imag = imread('lena.tiff');figure()imshow(Imag),title('原图像');ImagGray = rgb2gray(Imag);figure()imshow(ImagGray),title('灰度图像');[r,c] = size(ImagGray);%统计灰度直方图GrayPixNum = zeros(1,255);for i = 1:rfor j = 1:cGrayPixNum(1,ImagGray(i,j)) = GrayPixNum(1,ImagGray(i,j))+1;endend%对灰度直方图进行归一化GrayPixPro = GrayPixNum./(r*c);figure()plot(GrayPixPro),title('图像直方图');%-----------------------------------------------------------% -----------------------直方图均衡化------------------------%-----------------------------------------------------------%直方图累加GrayAdd = zeros(1,255);GrayAdd(1,1) = GrayPixPro(1,1);for i = 2:255GrayAdd(1,i) = GrayAdd(1,i-1)+GrayPixPro(1,i);endNewGray = round(GrayAdd.*254.+0.5);NewGrayPro = zeros(1,255);for i = 1:255GrayTemp = NewGray(1,i);NewGrayPro(1,GrayTemp) = NewGrayPro(1,GrayTemp)+GrayPixPro(1,i); endfigure()plot(NewGrayPro.*(r*c)),title('均衡化直方图');%有均衡化直方图和映射关系得到均衡化的图像NewImag = zeros(r,c);for i =1:rfor j = 1:cNewImag(i,j) = NewGray(1,ImagGray(i,j));endendNewImag = uint8(NewImag);figure()imshow(NewImag),title('均衡化的图像');figure()plot(NewGray),title('灰度变换曲线');实验结果:图1 原灰度图像图2 原图像的灰度直方图图3 经过直方图均衡化后的灰度图片图4 均衡化后的直方图图5 灰度变化曲线三、实验思考从上述实验结果可以看出,经过直方图均衡化后的图片的对比度更高,且边缘效果更高。

直方图均衡化实验报告

直方图均衡化实验报告

南京信息工程大学实验(实习)报告实验(实习)名称点操作及直方图均衡化实验(实习)日期得分指导教师系计算机系专业软件工程年级三班次 3 姓名学号实验目的:1、理解点操作图像增强方法2、理解直方图均衡化算法的原理,掌握算法的实现实验内容:1、理解图像灰度拉伸,练习imadjust函数的使用;I=imread('pout.tif');K=imadjust(I,[0.2 0.5],[0 1]); figure;subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(K);2、编程实现图像线性灰度变换算法;(全域截取分段 for循环)clear ;clc; I=imread('pout.tif');I=double(I);J=(I-80)*255/70;row=size(I,1);column=size(I,2);for i=1:rowfor j=1:columnif J(i, j)<0J(i,j)=0;endif J(i,j)>255;J(i,j)=255;endendendfigure;subplot(121); imshow(uint8(I)); subplot(122); imshow(uint8(J)); subplot(223),imhist(I);subplot(224),imhist(J);3、编程实现图像二值化算法;直方图选域值clear;clc;i=imread('pout.tif');bw=im2bw(i);subplot(121),imshow(i),subplot(122),imshow(bw);4、编程实现图像灰度对数log变换、指数(三角符号)变换算法;I=imread('pout.tif');J=log(im2double(I)+1);K=fft2(J);n=5;D0=0.1*pi;rh=0.7;rl=0.4;[row, column]=size(J);for i=1:rowfor j=1:columnD1(i,j)=sqrt(i^2+j^2);H(i,j)=rl+(rh/(1+(D0/D1(i,j))^(2*n)));endendL=K.*H;M=ifft2(L); N=exp(M)-1;figure;subplot(121),imshow(I); subplot(122),imshow(real(N));5、在Matlab中编程实现直方图均衡化算法(不使用histeq函数,编程实现其功能)。

直方图均衡化和匹配报告

直方图均衡化和匹配报告

直方图均衡化和匹配报告一.实验目的:加强直方图均衡化和直方图匹配的图像增强技术的认识和了解; 学会用Matlab 中的下列函数对输入图像进行上述2类运算; 感受各种不同的直方图图像增强处理方法对最终图像效果的影响; 二.实验内容:1.熟悉Matlab 文件中有关Imhist 和histeq 函数的使用说明,充分理解其使用方法并能运用它们完成实验内容。

2.将mountain.jpg 图像文件读入Matlab ,对其作直方图均衡化。

显示运算前后该图像的直方图,处理后的图像。

3.对mountain.jpg 图像做直方图匹配运算,显示运算前后该图像的直方图,处理后的图像和灰度变换函数。

直方图反映灰度等级的分布情况,本实验指定的直方图如下:1400×rr ≤5 7000-310×r 5<r ≤20 900-5×r 20<r ≤180 -1440+8×r 180<r ≤225 3060-12×r225<r ≤2554.利用mountain.jpg 图像的直方图(imhist 函数可生成),编写直方图均衡化函数,显示灰度变换函数。

三.实验结果与分析:1.图像均衡化处理前后的直方图和图像对比原图像 均衡化后的图像n =原图像直方图均衡化后的直方图由处理后的图像可以看出,图像的灰度值减少,图像对比度明显增强,但是导致很多地方的细节模糊,看不清楚;而且有些地方过分增强,严重干扰清晰度。

2.直方图匹配处理前后图像对比原图像处理后图像原图像直方图直方图匹配运算后的直方图直方图匹配运算函数采用直方图匹配运算后,发现效果明显比直接均衡化的效果好的多,将一些重要的细节突出来了,对比度明显增强,但是有些地方色彩过于暗淡,灰度值过高,影响了图像的美观,但用于进行图像对比分析还是比较实用的。

3.编写的直方图均衡化函数,进行灰度变换原图处理后图像原图直方图处理后直方图最后一步通过自己编写的程序,对直方图进行均衡化,效果与第一步所取得的效果差不多是一致的。

统计图像直方图及图像均衡化

统计图像直方图及图像均衡化

数字图像处理实验报告一、实验内容:1、统计图像直方图2、直方图的均衡化二、实验目的:1、学会在VC环境下使用opencv,能学会基本的图像导入与显示2、学会加载图像及图像各像素点的统计3、理解并掌握利用直方图均衡化图像的过程,并用程序加以实现三、实验代码:#include "cv.h"#include "highgui.h"#include<stdio.h>#include<math.h>int main( int argc, char** argv ){IplImage* plmg; //声明IplImage指针int height,width,step,channels;uchar *data;int i,j,k,r,count=0;int r0[256]={0};float pr[256]={0},sk[256]={0};//载入图像plmg = cvLoadImage("Tulips.jpg", 1);{cvNamedWindow( "Image", 1 );//创建窗口cvShowImage( "Image", plmg );//显示图像//统计图像各参数并赋值height=plmg->height;width=plmg->width;step=plmg->widthStep;channels=plmg->nChannels;data=(uchar *)plmg->imageData;printf("Processing a %d*%d with %d channels\n",height,width,channels);//反转图像/* for(i=0;i<height;i++)for(j=0;j<width;j++)for(k=0;k<channels;k++)data[i*step+j*channels+k]=255-data[i*step+j*channels+k];cvNamedWindow( "Image1", 1 );//创建窗口cvShowImage( "Image1", plmg );//显示图像*/for(i=0;i<height;i++) //统计直方图for(j=0;j<width;j++)for(k=0;k<channels;k++)//for(r=0;r<256;r++)r0[data[i*step+j*channels+k]]++;for(r=0;r<256;r++)count=count+r0[r];for(r=0;r<256;r++)printf("pixel %d is %d\n",r,r0[r]);printf("all pixels=%d\n",count);for(r=0;r<256;r++){pr[r]=r0[r]/(float)count; //像素点归一化printf("pixel %d 的个数及归一化:%d %f\n",r,r0[r],pr[r]);}sk[0]=255*pr[0]; //均衡化像素函数for(r=1;r<256;r++)sk[r]=sk[r-1]+pr[r]*255;for(r=0;r<256;r++){printf("pixel %d befor equilibria is %d ,after is %f \n",r,r0[r],sk[r]);}//映射到原图像,即像素值强制修改为均衡后的值for(i=0;i<height;i++)for(j=0;j<width;j++)for(k=0;k<channels;k++)data[i*step+j*channels+k]=sk[data[i*step+j*channels+k]];cvNamedWindow( "Image1", 1 );//创建窗口cvShowImage( "Image1", plmg );//显示图像*/cvWaitKey(0); //等待按键cvDestroyWindow( "Image" );//销毁窗口cvReleaseImage( &plmg ); //释放图像return 0;}return -1;}四、实验结果:五、实验心得:1、每建立一个将要使用opencv的VC Project ,都需要给它指定需要的lib文件2、需要加载的图像必须和所建工程的程序文件在同一个目录下3、对图像操作时,必须先把定义的图像参数赋值,否则将不能对图像进行修改4、初步掌握了opencv在VC环境下的运行与基本的opencv语句5、图像均衡化时,要注意归一时是除以所有像素点的总数,均衡时概率依次累加后乘以的是最大灰度级,同时要注意所用数组整型和浮点型的转换6、实验误区:各灰度级经过像素点的计算得到均衡化的结果是灰度数,而不再是像素点的个数7、数组赋值需用{}。

实验报告

实验报告

实验一直方图均衡化一、实验目的和要求1、实验目的(1)利用MATLAB的软件进行图像处理(2)掌握直方图修改技术进行图像增强(3)掌握MATLAB图像锐化处理2、实验要求(1)掌握课程设计的相关知识,概念清晰。

(2)程序设计合理,能够正确运行。

二、实验内容和原理1、直方图均衡化概念:直方图均衡化就是把一已知灰度概率分布的图像经过一种变换,使之演变成一幅具有均匀灰度概率分布的新图像。

它是以累积分布函数变换法为基础的直方图修正法。

灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数。

直方图操作能够有效用于图像增强;提供有用的图像统计资料,其在软件中易于计算,适用于商用硬件设备。

直方图均衡化是通过对原图像进行某种变换,使原图像的灰度直方图修正为均匀分布的直方图的一种方法。

图像灰度直方图均衡化使得图像的灰度分布趋向均匀,图像所占有的像素灰度间距拉开,加大了图像反差,改善了视觉效果,达到增强目的。

MATLAB是数字图像处理的常用工具,应用MATLAB的各种函数能够对数字图像进行各种处理。

s=kk三、程序设计(1)程序设计思路要实现图像直方图均衡化,根据直方图均衡化的理论基础,首先将原图像的灰度级归一化,将得到的灰度级数记为,计算每个级数灰度值的频率,按灰度值增大累加每个灰度级的频率,得到每个灰度级的累积频率。

输出图像的与原图像的灰度范围一样取个等级,将每个灰度级的累积频率近似为最接近的原图像的灰度值。

这就得到输出图像的每个灰度级灰度值。

根据旧图像灰度值和新灰度图像灰度值的对应关系,计算出对应每个的像素数。

计算出每个的频率,这样就实现了直方图的均衡化。

(2)编写程序编写的源程序代码如下:clc;clear all;close all;I=imread('图片路径\图片名称','图片类型');A=double(I);[m,n]=size(A);c=255;result=0;x=zeros(1,256);y=zeros(1,256);z=zeros(1,256);%计算原图所有灰度级像素数y(k)for i=1:mfor j=1:nt=A(i,j);y(t+1)=y(t+1)+1;endend%原图灰度分布概率z(k)for k=1:256z(k)=y(k)/(m*n);end%计算累计概率x(l)for l=1:256result=result+z(l);x(l)=result;end%累计概率取整x=round(c*x);%将处理后的灰度装入新的矩阵for i1=1:mfor j1=1:nM(i1,j1)=x(A(i1,j1)+1);endend%转换为unit8型P=uint8(M);%输出均衡化前后图像和直方图subplot(2,2,1);imshow(I);title('原始图像');subplot(2,2,2);imhist(I);title('原始直方图');subplot(2,2,3);imshow(P);title('均衡化图像');subplot(2,2,4);imhist(P);title('直方图均衡化');(3)运行程序在MATLAB的编辑器中输入程序,保存。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数字图像处理实验报告实验二图像直方图均衡姓名:*******学号:*********专业:************一.实验目的学习并掌握图像直方图均衡的基本理论,并通过分析均衡前后的图像验证课堂教学内容,总结直方图均衡的特点。

二.实验内容对图像 img2 进行直方图均衡(img2为X光片图像)1.对比均衡前后图像的直方图及特点,①图形显示其直方图以及灰度映射关系②计算以下参数:概率非零灰度数,概率非零灰度中最大概率、最小概率、最大最小概率之比。

③统计图像中概率大于平均概率的灰度级数;④计算非零概率的平均值和方差⑤您认为哪些参数能够表现图像直方图分布的均匀程度?试提取相关参数进行测试。

2.找一到两幅图像重复上述实验。

3.通过实验结果对比,能得出什么结论?三、实验报告要求1.源程序(C或Matlab):(1).画直方图的Matlab程序filname='E:\课件\大三下\图像处理\实验二\1.bmp'; //打开文件A=imread(filname); //读取文件信息imhist(A); //画出图像文件的直方图(2)C程序#include<stdio.h>#include<windows.h>#include<string.h>#include<math.h>BITMAPFILEHEADER bfh;BITMAPINFOHEADER bih;typedef struct PP{unsigned char GRAY;}PIXEL;////画出灰度映射关系图////void draw(double s[]){FILE *fout,*fin;int i,j;PIXEL p[256][256];BITMAPFILEHEADER m_bfh;BITMAPINFOHEADER m_bih;RGBQUAD colorPanel[256];fin=fopen("1.bmp","rb");fread(&m_bfh,1,sizeof(BITMAPFILEHEADER),fin);fread(&m_bih,1,sizeof(BITMAPINFOHEADER),fin);fread(colorPanel,256,sizeof(RGBQUAD),fin);fclose(fin);fout=fopen("Gray mapping relationship.bmp","wb");m_bih.biWidth=256;m_bih.biHeight=256;m_bih.biSizeImage=256*256;m_bfh.bfSize=m_bfh.bfOffBits+m_bih.biSizeImage;for(i=0;i<256;i++)for(j=0;j<256;j++) p[i][j].GRAY=255;for(i=0;i<256;i++){j=(int)s[i];p[i][j].GRAY=0;}fwrite(&m_bfh,1,sizeof(BITMAPFILEHEADER),fout);fwrite(&m_bih,1,sizeof(BITMAPINFOHEADER),fout);fwrite(colorPanel,256,sizeof(RGBQUAD),fout);fwrite(p,256*256,1,fout);fclose(fout);}////统计概率非零灰度数子函数 ///double nonzero(double p[])int i;double sum=0;for(i=0;i<256;i++)if(p[i]!=0) sum=sum+1;printf("概率非零灰度数:%.2f\n",sum);return sum;}////找到最大概率子函数////double lmax(double p[]){int i;double max;for(i=0;i<256;i++) //对max初始化if(p[i]!=0){max=p[i];break;}for(i=0;i<256;i++)if(p[i]!=0&&p[i]>max) max=p[i]; //找出概率非零最大值printf("概率非零最大值:%lf\n",max);return max;}////找到最小概率子函数////double lmin(double p[]){int i;double min;for(i=0;i<256;i++) //对min初始化if(p[i]!=0){min=p[i];break;}for(i=0;i<256;i++)if(p[i]!=0&&p[i]<min) min=p[i]; //找出概率非零最小值printf("概率非零最小值:%lf\n",min);return min;}////求最大最小概率之比子函数////double rate(double max,double min){double r;r=max/min;printf("最大最小概率之比:%lf\n",r);return r;}////统计图像中概率大于平均概率的灰度级数子函数 //// double lager(double p[]){int i;double sum=0;for(i=0;i<256;i++)if(p[i]>1.0/256) sum=sum+1;printf("图像中概率大于平均概率的灰度级数:%lf\n",sum);return sum;}////求非零概率的平均值的子函数////double average(double sum){double aver;aver=1.0/sum;printf("非零概率的平均值:%lf\n",aver);return aver;}////求非零概率的方差的子函数////double variance(double sum,double p[],double aver){int i;double asum=0,var;for(i=0;i<256;i++)if(p[i]!=0) asum=asum+pow((p[i]-aver),2);//printf("%lf\n",asum);var=asum/sum;printf("非零概率的方差:%lf\n",var);return var;}/////主函数//////int main(){FILE *fin,*fout;RGBQUAD colorPanel[256];PIXEL **bmpData;long i,j;double num[256]={0},p[256]={0},s[256]={0};double max,min,r,sum=0,asum=0,aver,psum=0,var;fin=fopen("1.bmp","rb");fread(&bfh,1,sizeof(BITMAPFILEHEADER),fin);fread(&bih,1,sizeof(BITMAPINFOHEADER),fin);fread(colorPanel,256,sizeof(RGBQUAD),fin);bmpData=(PIXEL **)malloc(bih.biHeight*sizeof(PIXEL *));for(i=0;i<bih.biHeight;i++){bmpData[i]=(PIXEL *)malloc(bih.biWidth*sizeof(PIXEL));fread(bmpData[i],bih.biWidth,sizeof(PIXEL),fin);}fclose(fin);////对图像进行直方图均衡////for(i=0;i<bih.biHeight;i++){ //二重循环遍历图象数据for(j=0;j<bih.biWidth;j++){num[bmpData[i][j].GRAY]++; //当前灰度级象素/总象素}}for(i=0;i<256;i++)p[i]=num[i]/bih.biWidth/bih.biHeight; //计算灰度概率s[0]=p[0];for(i=1;i<256;i++){s[i]=s[i-1]+p[i]; //计算累积概率(低灰度概率加到高灰度概率上)}for(i=0;i<256;i++){ //0~1映射到0~255s[i]=s[i]*255;for(j=0;j<256;j++){if(s[i]>=j-0.5&&s[i]<j+0.5)s[i]=j;}}for(i=0;i<bih.biHeight;i++){ //对原图像进行直方图均衡for(j=0;j<bih.biWidth;j++){bmpData[i][j].GRAY=(unsignedchar)s[bmpData[i][j].GRAY];}}////计算各个参数////sum=nonzero(p); //概率非零灰度数max=lmax(p); //概率非零灰度中最大概率min=lmin(p); //概率非零灰度中最小概率r=rate(max,min); //最大最小概率之比asum=lager(p); //图像中概率大于平均概率的灰度级数aver=average(sum); //非零概率的平均值var=variance(sum,p,aver); //非零概率的方差draw(s); //画灰度映射关系曲线fout=fopen("3.bmp","wb");fwrite(&bfh,1,sizeof(BITMAPFILEHEADER),fout);fwrite(&bih,1,sizeof(BITMAPINFOHEADER),fout);fwrite(colorPanel,256,sizeof(RGBQUAD),fout);for(i=0;i<bih.biHeight;i++)fwrite(bmpData[i],bih.biWidth,sizeof(PIXEL),fout);fclose(fout);return 0;}2.程序流程图:3.实验结果图像及对应参数:(1)图一:均衡前:均衡前直方图:灰度映射:对应参数:均衡后:均衡后的直方图:对应参数:均衡前后灰度映射关系:横轴表示均衡前的灰度,纵轴表示均衡后的灰度。

相关文档
最新文档