#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include#include using namespace cv; using namespace std; /** @function main */ int main(int argc, char** argv) { Mat src, dst; /// 加载源图像 src = imread("D://b.png", 1); if (!src.data) { cout << "Usage: ./Histogram_Demo " << endl; return -1; } /// 转为灰度图 cvtColor(src, src, CV_BGR2GRAY); /// 应用直方图均衡化 equalizeHist(src, dst); /// 创建窗口 namedWindow("Source", CV_WINDOW_AUTOSIZE); namedWindow("equalized", CV_WINDOW_AUTOSIZE); //显示结果 imshow("Source", src); imshow("equalized", dst); /// 等待用户按键退出程序 waitKey(0); return 0; }
马上就要开会了,小编刚接触opencv就要给小伙伴们讲直方图均衡化了,有点小紧张,还是先做个笔记吧。
首先,直方图是什么?
直方图是图像中像素强度分布的图形表达方式,它统计了每一个强度值所具有的像素个数,描述了图像灰度值。
像素:一幅图像是由许多的小格子组成的,这些小格子就是像素点,像素点组成像素。
像素强度:0~255之间的值。在灰度图像中,它是图像的灰度值。
如图所示,横坐标的值即像素强度从0到255,从暗到亮,左暗右亮,左边用于描述图像的暗度,右边用于描述图像的亮度。纵坐标表示像素量,峰值高则像素量多,峰值低则像素量少。
图上的直方图说明,左边图像中暗的和亮的像素比较少,灰的像素比较多。
再给大家举两个例子:
https://blog.csdn.net/zhulf0804/article/details/52770613
直方图均衡化是通过拉伸像素强度分布范围来增强图像对比。
说得更清楚一些, 以上面的直方图为例,你可以看到像素主要集中在中间的一些强度值上。直方图均衡化要做的就是拉伸这个范围。见下面左图:绿圈圈出了少有像素分布其上的强度值。对其应用均衡化后,得到了中间图所示的直方图。均衡化的图像见下面右图。把图像变换成像素值是几乎均匀分布的图像。
对比度:一幅图中灰度反差的大小。对比度 = 最大亮度/最小亮度。
最后,直方图均衡化是怎么做到的? (三步)
第一步:把直方图的每个灰度级进行归一化处理。
先说一下涉及到基本概念。
灰度:灰度是表明图像明暗的数值,即黑白图像中点的颜色深度,范围一般从0到255,白色为255 ,黑色为0,故黑白图片也称灰度图像。灰度值指的是单个像素点的亮度。灰度值越大表示越亮。
灰度化:R=B=G。
灰度值与像素值的关系:一张灰度图像的像素值就是它的灰度值。一张彩色图像的灰度值需要经过函数映射来得到。
灰度级:灰度级表明图像中不同灰度的最大数量。灰度级越大,图像的亮度范围越大。
归一化:https://www.cnblogs.com/curo0119/p/8421811.html
https://blog.csdn.net/lanmeng_smile/article/details/49903865
归一化是为了后面数据处理的方便,其次是保证程序运行时收敛加快。归一化的具体作用是归纳统一样本的统计分布性。
归一化函数normalize(),归一化之后所有的像素值都在[0,1]区间内。
第二步:求每种灰度的累积分布,得到一个映射的灰度映射表。
累积分布函数是单调增函数,并且值域是0到1。
https://www.cnblogs.com/tianyalu/p/5687782.html
用以下公式计算累积分布:
其中,n是图像中像素的总和,nk是当前灰度级的像素个数,L是图像中可能的灰度级总数。
假设有如下图像:
得到的图像统计信息如下图所示,并根据统计信息完成灰度值映射:
概率 = 像素个数 / 图像总的像素个数。如:0.25 = 4 / 16,0.1875 / 16。
累积概率=概率的前k项之和。k是灰度级。如:第一行是0.25,第二行是0.25+0.1875=0.4375。第三行是0.25+0.1875+0.4375=0.75。
映射后的灰度值=累积概率*255。如:0.25*255=63.75。0.4375*255=111.5625。
映射后的图像如下所示:
第三步:根据相应的灰度值来修正原图中的每个像素。
代码附上,直接调用opencv中的equalizeHist( )函数,就能实现直方图的均衡化。