定义
直方图匹配也叫直方图规定化(Histogram Matching/Normalization)
通俗的理解:相比于均衡化,它是用原图自带的灰度信息进行重新分布,可以说原图确定了之后均衡化也就定了。但是在有些场合,用均衡化达不到想要的效果,需要使用某种特定分布的直方图,让新生成的图按照指定直方图的分布规律进行重新匹配,使两幅图具有类似的色温或者对比度特征,这就叫做直方图匹配。
实现原理
1、把原图和匹配图都均衡化,并得到匹配图逆均衡化的对应关系。
2、由于都是均衡化,可以理解为相等,所以把原图均衡化后的点,按照匹配图的逆均衡化对应关系,得到结果图。
如果用 T(r) 和 G(z) 分别表示原图和匹配图的均衡化变换函数。那么结果可以表示为:
z=G−1[T(r)]
代码实现
OpenCV库中也有相关的函数来实现直方图统计和均衡化等。
这里为了明确的验证规定化的具体实现原理,笔者使用最笨的方法来实现。
灰度图的直方图匹配
#include <cv.h>
#include <highgui.h>
using namespace cv;
// show histogram of grey image with sticks or continuous curve
void myShowHist(int *psrccnt,string winname,int style=0, int rows=400,int cols=512)
{
Mat hist(rows,cols,CV_8UC3,Scalar(188,188,188));
int maxcnt=psrccnt[0];
for(int i=0; i<=255; i++){
if(psrccnt[i]>maxcnt) maxcnt=psrccnt[i];
}
int lineType = 8;
if(style==0) { //sticks
int thickness = 1;
for(int i=0; i<=255; i++){
if(psrccnt[i]!=0){
line(hist,
Point((int)((float)i*(