【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
- 【VC图像处理】直方图均衡化
- 图像处理------直方图均衡化
- 【图像处理】直方图均衡化
- 直方图均衡化---图像处理
- 【OpenCV3图像处理】图像直方图均衡化、直方图匹配
- 图像处理(二)直方图均衡化
- 图像处理之直方图均衡化
- 图像处理-光照规整-直方图均衡化
- 图像处理之(直方图)均衡化
- 直方图均衡化处理图像(python)
- 图像处理之直方图均衡化
- 图像处理之直方图均衡化
- 图像处理之直方图均衡化
- 图像处理(三):直方图均衡化
- 基于直方图均衡化的图像处理
- 图像处理opencv2-灰度直方图以及灰度直方图均衡化
- 灰度图像直方图均衡处理
- 彩色图像直方图均衡处理
- LR11如何打开回放结果窗口 “Results.qtp”,
- git 添加ssh-key查看config
- SpringMVC 使用 @Value获取properties文件中的属性值
- Android样式的开发:shape
- POJ 1611 The Suspects
- 【VC图像处理】直方图均衡化
- js 自定义hashmap
- 使用Bootstrap组件【上篇】
- [Zookeeper系列一]Zookeeper应用介绍与安装部署
- 第10课:Spark Streaming源码解读之流数据不断接收全生命周期彻底研究和思考
- centos 安装eclipse 配置tomcat
- 《Android 之美 从0到1 -- 高手之路》
- iOSwebView修改字体大小字体颜色背景颜色
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)