本文是对OpenCV2.4.13文档的部分翻译,作个人学习之用,并不完整。
图像直方图:图像灰度梯度的几何化表示,表现了每种灰度的像素数量。
直方图均衡化:将灰度范围延伸来改善图像的对比度。
原理:
均衡化表示将给定直方图的分布映射到另一个灰度更广更均匀的分布上,灰度值就会在整张图像上分散。
为了获得均衡化效果,重映射应该用概率分布函数(cdf),对于直方图H(i),概率分布函数H‘(i):
为了使用重映射函数,我们必须正态化H'(i)使得最大值是255(或者该图像上的灰度最大值)。
对于上例,cdf应为:
最终可以使用一个重映射处理来获得均衡化图像的灰度值:
#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() { // 声明原图像和目标图像 Mat src, dst; const char* source_window = "Source image"; const char* equalized_window = "Equalized Image"; /// 载入图像 src = imread("lena.jpg", 1 ); if( !src.data ) { cout<<"Usage: ./Histogram_Demo <path_to_image>"<<endl; return -1; } /// 转换为灰度图 cvtColor( src, src, COLOR_BGR2GRAY ); /// 应用直方图均衡化 equalizeHist( src, dst ); /// 显示结果 namedWindow( source_window, WINDOW_AUTOSIZE ); namedWindow( equalized_window, WINDOW_AUTOSIZE ); imshow( source_window, src ); imshow( equalized_window, dst ); /// 等待按键 waitKey(0); return 0; }结果: