图像的直方图显示与直方图均衡处理
来源:互联网 发布:cad绘图软件下载 编辑:程序博客网 时间:2024/05/22 09:00
一.直方图概念
直方图其实就是一副图像的灰度级统计,设一副图像的灰度级为[0,L-1],则可以建立一个二维坐标系(x,y),x取值[0,L-1],y取值为相应灰度级的像素数量。如果是归一化直方图,则y代表该灰度级在图像中的出现概率,且。
二.基于opencv的直方图显示
相较于matlab ,opencv的直方图显示要麻烦的多,因为它生成的只是一个数组,需要自己手动画出来,这里介绍基于c++ API的显示方法:
核心函数:
void calcHist(const Mat*arrays, intnarrays, const int*channels, InputArraymask, OutputArrayhist, intdims, const int*histSize, const float**ranges, booluniform=true, boolaccumulate=false )
常用参数简介,详细请参考opencv文档:
arrays:需要显示的图像数组;
narrays:输入的图像数目,一般都是取1吧;
channels:输入图像的通道数目,这里比较麻烦,详细参见官方文档,一般取1,也就是单通道灰度图;
mask:不明,通常取mat();
hist:输出的直方图数组;
dims:直方图维度;
histSize:直方图尺寸,如果是8位深就取256;
ranges;显示范围
这里给出一个简单的直方图显示类,将常用参数封装了一下:
class Histogram{public:Histogram(){ histSize[0] = 256; hrangee[0] = 0.0; hrangee[1] = 255.0; ranges[0]= hrangee;//8位深度,256灰度级 channels=0;}Mat calcHistogram(const Mat& imageGray)//创建直方图显示{ Mat hist,histImage; calcHist(&imageGray, 1, 0, Mat(), hist, 1, histSize, ranges);//构建直方图矩阵histImage=showHistogarm(hist);//图形显示return histImage;}Mat calcEqualizeHistogram(const Mat& imageGray,Mat& imageGrayEqualize)//直方图均衡化{Mat hist,histImage;equalizeHist(imageGray,imageGrayEqualize);//直方图均衡 calcHist(&imageGrayEqualize, 1, 0, Mat(), hist, 1, histSize, ranges);histImage=showHistogarm(hist);return histImage;}~Histogram(){}private:Mat showHistogarm( Mat& hist)//直方图的图形显示{Mat histImage = Mat::ones(200, 320, CV_8U)*255;//初始化图像normalize(hist, hist, 0, histImage.rows, CV_MINMAX, CV_32F);//归一化histImage = Scalar::all(255);int binW = cvRound((double)histImage.cols/histSize[0]);//各灰度级显示的宽度for( int i = 0; i < histSize[0]; i++ )//灰度256级,依次画出每一级的矩形表示 rectangle( histImage, Point(i*binW, histImage.rows), Point((i+1)*binW, histImage.rows - cvRound(hist.at<float>(i))), Scalar::all(0), -1, 8, 0 );return histImage;}private:int histSize[1]; //直方图尺寸float hrangee[2]; const float *ranges[1];//灰度级int channels;//通道数};
三.直方图的简单应用,直方图均衡:
直方图均衡可以说是最常用也是最基础的图像增强方法了,大致原理既是将图像的灰度范围动态展宽,是所有图像灰度级实现等概率分布。
假设r为输入图像灰度,s为增强图像灰度值,P(r),P(s)分别为相应的概率密度,设s,r之间存在灰度变换公式:
那么通过这样的变换,输出的图像存在怎么的特性呢?这里先给出一个概率变换公式:
接下来推倒此公式:
可以看到,对于任意取值的输出灰度值s,其概率密度都为1,即实现所有灰度的等概率分布,根据上述变换公式得到的图像即所谓的直方图均衡。
通常的直方图均衡都是基于灰度图像的,如果处理通常的rgb彩色图像的话,可以参考2种方法,一种即所有通道单独执行直方图均衡,然后合成图像,第二种可以将图像转换到YUV或者HSI色彩空间,然后只对亮度通道单独处理就可以了。
opencv中实现直方图均衡倒是很简单,直接调用equalizeHist函数就可以了。
四.实验测试
实验程序已上传,下载链接:
http://download.csdn.net/detail/emiyasstar__/3734114
实验图像是opencv samples里的那只狒狒= =,处理效果还是很明显的,但是直方图显示好像有点问题,欢迎各位指正。
参考书籍:数字图像处理 冈萨雷斯;
opencv 官方文档。
- 图像的直方图显示与直方图均衡处理
- 【VS开发】【图像处理】直方图均衡与平台直方图
- 基于直方图均衡化的图像处理
- 图像直方图与直方图均衡化
- 灰度图像直方图均衡处理
- 彩色图像直方图均衡处理
- 图像处理------直方图均衡化
- 【图像处理笔记】直方图均衡
- 【图像处理笔记】直方图均衡
- 【图像处理】直方图均衡化
- 直方图均衡化---图像处理
- andrid图像处理系统1.3.0图像的直方图均衡
- 【OpenCV3图像处理】图像直方图均衡化、直方图匹配
- 灰度图像直方图的创建与灰度图像直方图的均衡化[代码与运行结果]
- 图像处理opencv2-灰度直方图以及灰度直方图均衡化
- 基于opencv和c++的图像处理:直方图均衡化
- 【MATLAB图像处理2】 直方图的均衡化(附源码)
- 基于opencv和c++的图像处理:直方图均衡化
- poj 1696 Space Ant(叉积的性质,做极角排序)
- 自己搜集总结的nmap常用命令及参数说明
- Activity之间跳转和传递数据
- 【几何】2011 regional Beijing Site B——Hou Yi's secret——hdu 4082
- hash简介
- 图像的直方图显示与直方图均衡处理
- Javasocket套接字
- Blender自学笔记 3
- time
- Java中的equals方法与hashCode方法解析
- ARM寄存器组织
- 总结DataTable,DataSet的使用方法。
- Android四大组件
- java书籍推荐,有空看看吧