ACE原理及結合Opencv算法實現

在這裏插入圖片描述

算法實現

//自適應對比度增強算法,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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章