直方图均衡实验报告.docx
《直方图均衡实验报告.docx》由会员分享,可在线阅读,更多相关《直方图均衡实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
![直方图均衡实验报告.docx](https://file1.bdocx.com/fileroot1/2023-2/6/904f1008-20cf-4110-b094-cadf4e47c69f/904f1008-20cf-4110-b094-cadf4e47c69f1.gif)
直方图均衡实验报告
数字图像处理实验报告
实验二图像直方图均衡
姓名:
*******
学号:
*********
专业:
************
一.实验目的
学习并掌握图像直方图均衡的基本理论,并通过分析均衡前后的图像验证课堂教学内容,总结直方图均衡的特点。
二.实验内容
对图像img2进行直方图均衡(img2为X光片图像)
1.对比均衡前后图像的直方图及特点,
1图形显示其直方图以及灰度映射关系
2计算以下参数:
概率非零灰度数,概率非零灰度中最大概率、最小概率、最大最小概率之比。
3统计图像中概率大于平均概率的灰度级数;
4计算非零概率的平均值和方差
5您认为哪些参数能够表现图像直方图分布的均匀程度?
试提取相关参数进行测试。
2.找一到两幅图像重复上述实验。
3.通过实验结果对比,能得出什么结论?
三、实验报告要求
1.源程序(C或Matlab):
(1).画直方图的Matlab程序
filname='E:
\课件\大三下\图像处理\实验二\1.bmp';//打开文件
A=imread(filname);//读取文件信息
imhist(A);//画出图像文件的直方图
(2)C程序
#include
#include
#include
#include
BITMAPFILEHEADERbfh;
BITMAPINFOHEADERbih;
typedefstructPP{
unsignedcharGRAY;
}PIXEL;
////画出灰度映射关系图////
voiddraw(doubles[])
{
FILE*fout,*fin;
inti,j;
PIXELp[256][256];
BITMAPFILEHEADERm_bfh;
BITMAPINFOHEADERm_bih;
RGBQUADcolorPanel[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("Graymappingrelationship.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);
}
////统计概率非零灰度数子函数///
doublenonzero(doublep[])
{
inti;
doublesum=0;
for(i=0;i<256;i++)
if(p[i]!
=0)sum=sum+1;
printf("概率非零灰度数:
%.2f\n",sum);
returnsum;
}
////找到最大概率子函数////
doublelmax(doublep[])
{
inti;
doublemax;
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);
returnmax;
}
////找到最小概率子函数////
doublelmin(doublep[])
{
inti;
doublemin;
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]printf("概率非零最小值:
%lf\n",min);
returnmin;
}
////求最大最小概率之比子函数////
doublerate(doublemax,doublemin)
{
doubler;
r=max/min;
printf("最大最小概率之比:
%lf\n",r);
returnr;
}
////统计图像中概率大于平均概率的灰度级数子函数////
doublelager(doublep[])
{
inti;
doublesum=0;
for(i=0;i<256;i++)
if(p[i]>1.0/256)sum=sum+1;
printf("图像中概率大于平均概率的灰度级数:
%lf\n",sum);
returnsum;
}
////求非零概率的平均值的子函数////
doubleaverage(doublesum)
{
doubleaver;
aver=1.0/sum;
printf("非零概率的平均值:
%lf\n",aver);
returnaver;
}
////求非零概率的方差的子函数////
doublevariance(doublesum,doublep[],doubleaver)
{
inti;
doubleasum=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);
returnvar;
}
/////主函数//////
intmain(){
FILE*fin,*fout;
RGBQUADcolorPanel[256];
PIXEL**bmpData;
longi,j;
doublenum[256]={0},p[256]={0},s[256]={0};
doublemax,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{
bmpData[i]=(PIXEL*)malloc(bih.biWidth*sizeof(PIXEL));
fread(bmpData[i],bih.biWidth,sizeof(PIXEL),fin);
}
fclose(fin);
////对图像进行直方图均衡////
for(i=0;ifor(j=0;jnum[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~255
s[i]=s[i]*255;
for(j=0;j<256;j++){
if(s[i]>=j-0.5&&s[i]s[i]=j;
}
}
for(i=0;ifor(j=0;jbmpData[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;ifwrite(bmpData[i],bih.biWidth,sizeof(PIXEL),fout);
fclose(fout);
return0;
}
2.程序流程图:
3.实验结果图像及对应参数:
(1)图一:
均衡前:
均衡前直方图:
灰度映射:
对应参数:
均衡后:
均衡后的直方图:
对应参数:
均衡前后灰度映射关系:
横轴表示均衡前的灰度,纵轴表示均衡后的灰度。
(2)图二:
均衡前:
均衡前直方图:
对应的参数:
均衡后:
均衡后直方图:
对应参数:
均衡前后灰度映射关系:
横轴表示均衡前的灰度,纵轴表示均衡后的灰度。
(3)图三:
均衡前:
均衡前直方图:
对应参数:
均衡后:
均衡后直方图:
对应参数:
均衡前后灰度映射关系:
横轴表示均衡前的灰度,纵轴表示均衡后的灰度。
(4)图四:
均衡前:
均衡前直方图:
对应参数:
均衡后:
均衡后直方图:
对应参数:
均衡前后灰度映射关系:
横轴表示均衡前的灰度,纵轴表示均衡后的灰度。
(5)图五:
均衡前:
均衡前直方图:
对应参数:
均衡后:
均衡后直方图:
对应参数:
均衡前后灰度映射关系:
横轴表示均衡前的灰度,纵轴表示均衡后的灰度。
4.实验结果分析及结论
由实验结果的参数分析,直方图均衡前后有几项参数变化较大。
均衡后概率非零的灰度数减少了,表示图像灰度分布得更均匀了。
同时均衡后概率非零的最大值和最小值的比明显减小了,从这项数据中可以看出图像数据确实是被均衡了。
而且非零概率的方差和均值都变大了,也就是亮暗区域之间的变化大了,使得图像更清晰了。
直方图均衡能够使图像暗区变得更暗,亮区变得更亮,因此可以使一些看上去较暗的图变得更加容易辨认,视觉效果比较好。
并且通过比较种子图,可以看出,直方图均衡对那些整体画面比较暗或者看上去颜色比较浅的图效果比较好,可以使图像看上去变得更亮,对本身就亮暗较分明的图像效果不明显,由X光图片可以看出,直方图均衡可以使图像更好的显示骨骼结构中的。