void GetHistogram(const Mat &image, int *histogram)
{
memset(histogram, 0, 256 * sizeof(int));
//计算直方图
int pixelCount = image.cols*image.rows;
uchar *imageData = image.data;
for (int i = 0; i <= pixelCount - 1; ++i)
{
int gray = imageData[i];
histogram[gray]++;
}
}
void EqualizeHistogram(const Mat &srcImage, Mat &dstImage)
{
CV_Assert(srcImage.type() == CV_8UC1);
dstImage.create(srcImage.size(), srcImage.type());
// 计算直方图
int histogram[256];
GetHistogram(srcImage, histogram);
// 计算分布函数(也就是变换函数f(x))
int numberOfPixel = srcImage.rows*srcImage.cols;
int LUT[256];
LUT[0] = 1.0*histogram[0] / numberOfPixel*255;
int sum = histogram[0];
for (int i = 1; i <= 255; ++i)
{
sum += histogram[i];
LUT[i] = 1.0*sum / numberOfPixel * 255;
}
// 灰度变换
uchar *dataOfSrc = srcImage.data;
uchar *dataOfDst = dstImage.data;
for (int i = 0; i <= numberOfPixel - 1; ++i)
dataOfDst[i] = LUT[dataOfSrc[i]];
}
当然opencv有直接可以实现的函数:equalizeHist()函数。