直方图均衡化的作用是增强图像的对比度,即通过拉伸像素强度分布范围来增强图像对比度的一种方法.均衡化指的是把一个分布
(给定的直方图) 映射到另一个分布 (一个更宽更统一的强度值分布), 所以强度值分布会在整个范围内展开.要想实现均衡化的效果,
映射函数应该选用累积分布函数,二是使用累积分布函数处理后像素值会均匀分布。直方图均衡化过程中,映射方法是
最终每个灰度级映射后的灰度值为Sk*255。
其中,n是图像中像素的总和,是当前灰度级的像素个数,L是图像中可能的灰度级总数。
来看看通过上述公式怎样实现的拉伸。假设有如下图像:
得图像的统计信息如下图所示,并根据统计信息完成灰度值映射:
映射后的图像如下所示:
以上就是直方图映射均衡化的步骤
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
/** @function main */
int main( int argc, char** argv )
{
Mat src, dst;
char* source_window = "Source image";
char* equalized_window = "Equalized Image";
/// 加载源图像
src = imread( argv[1], 1 );
if( !src.data )
{ cout<<"Usage: ./Histogram_Demo <path_to_image>"<<endl;
return -1;}
/// 转为灰度图
cvtColor( src, src, CV_BGR2GRAY );
/// 应用直方图均衡化
equalizeHist( src, dst );
/// 显示结果
namedWindow( source_window, CV_WINDOW_AUTOSIZE );
namedWindow( equalized_window, CV_WINDOW_AUTOSIZE );
imshow( source_window, src );
imshow( equalized_window, dst );
/// 等待用户按键退出程序
waitKey(0);
return 0;
}
学习参考博客:直方图均衡化原理
- honpey爱编程 - 博客频道 - youkuaiyun.com
http://blog.youkuaiyun.com/honpey/article/details/8770919