算法实现
//自适应对比度增强算法,C表示对高频的直接增益系数,n表示滤波半径,maxCG表示对CG做最大值限制
int ACE(Mat& src, Mat& dst, int C, int n, float MaxCG)
{
if (src.empty())
return -1;
int nrows = src.rows;
int ncols = src.cols;
int jMax = ncols*src.channels();
int i = 0;
int j = 0;
Mat meanLocal; //图像局部均值
Mat varLocal; //图像局部方差
Mat meanGlobal; //全局均值
Mat varGlobal; //全局标准差
blur(src, meanLocal, Size(n, n));
Mat highFreq = src - meanLocal;
varLocal = highFreq.mul(highFreq);
varLocal.convertTo(varLocal, CV_32F);
sqrt(varLocal, varLocal);
meanStdDev(src, meanGlobal, varGlobal);
Mat gainArr = meanGlobal / varLocal; //增益系数矩阵
for (int i = 0; i < nrows; i++)
{
float* pdata = gainArr.ptr<float>(i);
for (int j = 0; j < jMax; j++)
{
pdata[j] = pdata[j] > MaxCG ? MaxCG : pdata[j];
}
}
gainArr.convertTo(gainArr, CV_8U);
gainArr = gainArr.mul(highFreq);
dst = meanLocal + gainArr;
//Mat dst2 = meanLocal + C * highFreq;
return 0;
}
int ACEAlgorithm(Mat& src, Mat& dst, int C , int n, float MaxCG)
{
int ret = PreDealSource(src, dst);
if (-1 == ret)
return -1;
vector<Mat>vSrc;
split(src, vSrc);
int iSize = static_cast<int>(vSrc.size());
for (int i = 0; i < iSize; i++)
{
ACE(vSrc[i], vSrc[i], C, n, MaxCG);
}
merge(vSrc, dst);
return 0;
}
#include<iostream>
#include <windows.h>
#include"ImageAlgorithm.h"
using namespace std;
void ACETest()
{
Mat src = imread("E:\\AlgorithmImage\\ACE2.jpg");
Mat dst;
int ret = ACEAlgorithm(src, dst,4,50,5);
printf("rows:%d,cols:%d\n", src.rows, src.cols);
/*if (0 == ret)
{
imshow("src", src);
imshow("dst", dst);
waitKey(0);
}*/
}
//主函数
int main()
{
LARGE_INTEGER t1, t2, tc;
QueryPerformanceFrequency(&tc);
QueryPerformanceCounter(&t1);
// testGrayWorld();
// testAutoBalance();
ACETest();
QueryPerformanceCounter(&t2);
printf("Use Time:%f\n", (t2.QuadPart - t1.QuadPart)*1.0 / tc.QuadPart);
/*int j = 0;
int a[3]{ 1,2,3 };
int dj = a[++j] + a[++j];
cout << dj << endl;*/
system("pause");
return 0;
}
效果展示
参数与时间
Debug
int C = 4;
int n = 50;
float MaxCG = 5;
Release
参考文献
https://mp.weixin.qq.com/s/aPi7haF7eTDabbYi4c75cA