#include
#include
#include
#include
#include
#include
#include
#include
#define
IMAGE1_PATH
“/home/jacob/图片/1.png“
#define
IMAGE2_PATH
“/home/jacob/图片/2.png“
#define
IMAGE3_PATH
“/home/jacob/图片/3.png“
using
namespace
std;
using
namespace
cv;
class
Histogram1D
{
private:
int
histSize[1];
//
项的数量
float
hranges[2];
//
统计像素的最大值和最小值
const
float*
ranges[1];
int
channels[1];
//
仅计算一个通道
public:
Histogram1D()
{
//
准备1D直方图的参数
histSize[0]
=
256;
hranges[0]
=
0.0f;
hranges[1]
=
255.0f;
ranges[0]
=
hranges;
channels[0]
=
0;
}
Mat
getHistogram(const
Mat
&image)
{
Mat
hist;
//
计算直方图
calcHist(&image,//
要计算图像的1,//
只计算一幅图像的直方图
channels,//
通道数量
Mat(),//
不使用掩码
hist,//
存放直方图
1,//
1D直方图
histSize,//
统计的灰度的个数
ranges);
//
灰度值的范围
return
hist;
}
Mat
getHistogramImage(const
Mat
&image)
{
Mat
hist
=
getHistogram(image);
//查找最大值用于归一化
double
maxVal
=
0;
minMaxLoc(hist,NULL,&maxVal);
//绘制直方图的图像
Mat
histImg(histSize[0],histSize[0],CV_8U,Scalar(255));
//
设置最高点为最大值的90%
double
hpt
=
0.9
*
histSize[0];
//每个条目绘制一条垂直线
for
(int
h
=
0;
h
histSize[0];
h++)
{
//直方图的元素类型为32位浮点数
float
binVal
=
hist.at
int
intensity
=
static_cast
*
hpt
/
maxVal);
line(histImg,Point(h,histSize[0]),Point(h,histSize[0]
intensity),Scalar::all(0));
}
return
histImg;
}
};
/**
*
@brief
EqualizeImage
对灰度图像进行直方图均衡化
*
@param
src
输入图像
*
@param
dst
均衡化后的图像
*/
void
EqualizeImage(const
Mat
&src,Mat
&dst)
{
Histogram1D
hist1D;
Mat
hist
=
hist1D.getHistogram(src);
hist
/=
(src.rows
*
src.cols);
//
对得到的灰度直方图进行归一化,得到密度(0~1)
float
cdf[256]
=
{0};
//
灰度的累积概率
Mat
lut(1,256,CV_8U);
//
创建用于灰度变换的查找表
for
(int
i
=
0;
i
256;
i++)
{
//
计算灰度级的累积概率
if
(i
==
0)
cdf[i]
=
hist.at
else
cdf[i]
=
cdf[i
1]
+
hist.at
lut.at
=
static_cast
*
cdf[i]);
//
创建灰度的查找表
}
LUT(src,lut,dst);
//
应用查找表,进行灰度变化,得到均衡化后的图像
}