【VC图像处理】直方图均衡化

来源:互联网 发布:长得帅的男生知乎 编辑:程序博客网 时间:2024/03/29 13:53
/*img 为输入原图outimg为输出直方图probality为输出的灰度直方概率,是数组*/void Histogram(Mat img,Mat &outImg,float *probality){outImg.create(500,256,CV_8UC3);outImg.setTo(Scalar(0,255,0));//outImg.setTo(Scalar::all(255));float tmp[256]={0};int gray[256]={0};int i,j;int Width=img.cols;int Height=img.rows;for( i=0;i<Height;i++){for(  j=0;j<Width;j++){gray[(int)(img.at<uchar>(i,j))]++;}}for(i=0;i<256;i++){probality[i]=(float)(gray[i]*1.0f/(Width*Height*1.0f));//tmp[i]=probality[i];}int max=0;for(i=0;i<256;i++)if(gray[i]>max)max=gray[i];for(i=0;i<256;i++){tmp[i]=(float)(gray[i]*1.0f/(float)(max*1.0f));tmp[i]*=500;//cout<<"tmp"<<i<<"="<<tmp[i]<<endl;}for(i=0;i<256;i++){line(outImg,Point(i,500),Point(i,500-(int)tmp[i]),Scalar(255,0,0));}}/*img原图outimg为输出直方均衡化后的图probality为输入的灰度直方概率,是数组*/void Histogram_Equalization(Mat img,Mat &OutImg,float *probality){int Height=img.rows;int Width=img.cols;OutImg.create(Height,Width,CV_8UC1);float temp[256];int tab[256];int i,j;for(i=0;i<256;i++){if(i==0){temp[0]=probality[0];}else{temp[i]=temp[i-1]+probality[i];}tab[i]=(int)(255.0f*temp[i]+0.5f);//cout<<"tab "<<i<<"="<<tab[i]<<endl;}for(i=0;i<Height;i++)for(j=0;j<Width;j++)OutImg.at<uchar>(i,j)=(uchar)(tab[(int)(img.at<uchar>(i,j))]);}
void main(){Mat SrcImg=imread("C:\\Users\\Administrator\\Desktop\\工作\\testp\\1.jpg",0);//01.jpg",0);if(!SrcImg.data)cout<<"读取图片错误\n";Mat ResultImg1,ResultImg2,ResultImg3;float a[256];Histogram(SrcImg,ResultImg1,a);Histogram_Equalization(SrcImg,ResultImg2,a);Histogram(ResultImg2,ResultImg3,a);imshow("直方图",ResultImg1);imshow("直方图均衡化处理图",ResultImg2);imshow("处理后的直方图",ResultImg3);imshow("src",SrcImg);waitKey(0);}


多少天过去了,再重新读、分析,一开始发现都忘光了,但是看了一会儿就懂了,这就是当初做笔记的好处,要不然又得翻书查资料费好大劲儿才能弄明白,记忆就是不断重复的过程。现在把直方图再总结如下:

直方图均衡化:首先要获得一张图片的直方图数据,一张灰度图像的直方图灰度值0,1,2,3,4,5,6,...,254,255 需要统计这些灰度值的个数gray[(int)(img.at<uchar>(i,j))]++; 特别需要注意这种数组格式,下标是灰度值索引值,数组值是个数。这些其实就是直方图的数据了,为了在一张图上显示直方图,需要归一化处理,就是找出个数最大的值作为分母。

但是均衡化的话也需要归一化,他的归一化方法是用图像的长和宽乘积做分母(总共有多少数据,所有归一化数据累加和为1)。均衡化就是用这个归一化的数组再计算累积积分,所谓的累积积分就是当前项等于前面所有的和,这是一种概率分布,在累积积分数组中当是255时候它的值自然为1,然后255*积分数组,这是最重要的,这就是接下来的映射表。这个映射数组其实就是对灰度值的一种重新分布。上面举得例子灰度值123很多,占的比重就很大,在积分图中纵坐标就会很高,再乘以255的话就更突出了,这可能就是直方图均衡化的真谛了。 就是多的灰度值就让他和其他一般的灰度值有明显的差距,所谓的拉伸对比度。分析完毕!

1 0
原创粉丝点击