ACE增强算法(自适应对比度增强)---Adaptive contrast enhancement

前言


ACE增强算法

①.ACE算法原理

     为了避免低频背景的干扰,采用“局部”的增强方法可能会取得更好的效果。

     自适应对比度增强算法(ACE)是非常有名的,经常应用于医学领域中的CT图,可有效增强低对比度图像的梯度ACE算法是将图像分为两部分分别处理的,完成之后重组得到输出图。

第一部分是将原图像进行平滑处后,得到低频部分;

第二部分是通过原始图像减去第一部分所得的图像,称为高频部分

进而对第二部分所得的图像进行增强,将第一、第二部分的图像进行重新组合,得到算法的输出结果图。


②.ACE算法

        ACE算法包括两个步骤:

        一. 假定 x(i, j)是图像中某点的灰度值,低频部分采用求局部平均值的方法获得,模板大小为(2n+1)×(2n+1)。 一般模板尺寸都比较大,经常选择(101*101)模板。

    通过式子求得模板的平均值 mx(i,j),则模板中的平均方差由下式求得dev(i,j)

          二.对高频部分进行增强,使用标准差做增益值,均值 mx 近似的认为是背景部
分,此时 [ x(i, j) - mx(i, j) ] 即是高频细节部分,对高频做增益乘积,有: 

 其中 D 取常系数。可以看出增益函数 gain(i,j) =  D / σ(i,j) , 说明一下,增益函数有很多形式,不同的增益函数的效果截然不同。常见的增益函数:


二、ACE效果

原图

增益函数①的ACE效果

增益函数②的ACE效果

原图

增益函数①的ACE效果

 

增益函数②的ACE效果

 可以看出增益函数②的ACE效果会比增益函数①效果好,增益函数②是笔者采取其他论文的增益函数。

三.ACE算法实现

1.求图像中每个点局部均值Mean(i,j)与局部方差Dev(i,j)

代码如下(示例):

//Step1 
	Mat roi_broaden;
	int winSize_Width = 51;//窗口宽度的一半
	int winSize_Height = 51;//窗口高度的一半
	int top, bottom, left, right;
	top = bottom = winSize_Height;
	left = right = winSize_Width;
	copyMakeBorder(roi,roi_broaden,top,bottom,left,right,BORDER_REFLECT);//采取镜像对称方式进行扩展边界
	
	int  height = roi.size().height;
	int  width = roi.size().width;

	Mat meanDst = Mat::zeros(roi.size(),CV_64F);
	Mat varianDst = Mat::zeros(roi.size(), CV_64F);
	float sum = 0;
	float pixelValue = 0;
	//遍历每个像素
	for (int h = 0; h < height; h++)
	{
		for (int w = 0; w < width; w++)
		{
			sum = 0;
			//遍历每个模板
			for (int x = 0; x < winSize_Width; x++)
			{
				for (int y = 0; y < winSize_Height; y++)
				{
					pixelValue = roi_broaden.at<uchar>(h + x, w + y);
					sum += pixelValue;
				}
			}
			//
			//	m(i,j) = Σx(i,j) / Area(模板面积)
			//
			meanDst.at<float>(h, w) = sum /( winSize_Height * winSize_Width );
		}
	}

	//遍历每个像素
	for (int h = 0; h < height; h++)
	{
		for (int w = 0; w < width; w++)
		{
			sum = 0;
			//遍历每个模板
			for (int x = 0; x < winSize_Width; x++)
			{
				for (int y = 0; y < winSize_Height; y++)
				{
					pixelValue = (roi_broaden.at<uchar>(h + x, w + y) - meanDst.at<float>(h, w));//x(i,j) - x0(i0,j0)
					sum += pixelValue * pixelValue;//Σ[x(i,j) - x0(i0,j0)]^2
				}
			}
			//
			//	σ(i,j)^2 = Σ[x(i,j) - x0(i0,j0)]^2 / Area(模板面积)
			//
			varianDst.at<float>(h, w) = sum / (winSize_Height * winSize_Width);
		}
	}

2.增益函数确定

代码如下(示例):

	//全局均值与全局方差
	float globalMean = 0.0;
	float globalVar = 0.0;

	Scalar globalMeanMat, globalVarMat;
	meanStdDev(roi, globalMeanMat,globalVarMat);
	globalMean = globalMeanMat.val[0];
	globalVar = globalVarMat.val[0];


	//Step2
	Mat result = Mat::zeros(roi.size(),CV_8UC1);
	for (int h = 0; h < height; h++)
	{
		for (int w = 0; w < width; w++)
		{
			//低频 m(i,j)
			float lowF = meanDst.at<float>(h, w);
			//高频 x(i,j) - m(i,j)
			float highF = roi.at<uchar> - lowF;
			//增益系数 grain = D / σ(i,j)
			float grain = globalMean / varianDst.at<float>(h, w);
			//增益函数
			//f(i,j) = m(i,j) + grain * [x(i,j) - m(i,j)]
			uchar newPixel = lowF + grain * highF;
			
			result.at<uchar>(h, w) = newPixel;
		}
	}

3.通道融合与颜色空间转换

merge(channels, ycc);

cvtColor(ycc, dst, COLOR_YCrCb2RGB);

三、关注+私聊可获取完整工程

总结

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是基于杜鹃搜索算法的CLAHE自适应阈值对比度增强算法的示例代码: ```python import cv2 import numpy as np import math # 定义CLAHE算法 def clahe(image, clip_limit=2.0, grid_size=(8, 8)): clahe = cv2.createCLAHE(clipLimit=clip_limit, tileGridSize=grid_size) return clahe.apply(image) # 定义杜鹃搜索算法 def cuckoo_search(fit_func, dim, lb, ub, pa=0.25, gen=100): pop_size = 50 nest = np.random.rand(pop_size, dim) * (ub - lb) + lb fitness = np.zeros(pop_size) best_nest_index = np.zeros(gen) best_nest = np.zeros((gen, dim)) fmin = fit_func(nest[0, :]) best_nest[0, :] = nest[0, :] for i in range(pop_size): fitness[i] = fit_func(nest[i, :]) if fitness[i] < fmin: fmin = fitness[i] best_nest[0, :] = nest[i, :] for it in range(1, gen): new_nest = np.zeros((pop_size, dim)) for i in range(pop_size): u = np.random.rand(dim) < pa step_size = np.random.rand() * (nest[np.random.randint(pop_size), :] - nest[np.random.randint(pop_size), :]) new_nest[i, :] = nest[i, :] + step_size * u for i in range(pop_size): for j in range(dim): if new_nest[i, j] < lb: new_nest[i, j] = lb if new_nest[i, j] > ub: new_nest[i, j] = ub for i in range(pop_size): fitness_new = fit_func(new_nest[i, :]) if fitness_new < fitness[i]: fitness[i] = fitness_new nest[i, :] = new_nest[i, :] if fitness_new < fmin: fmin = fitness_new best_nest[it, :] = new_nest[i, :] best_nest_index[it] = fmin return best_nest, best_nest_index # 定义自适应阈值CLAHE算法 def adaptive_clahe(image, clip_limit=2.0, grid_size=(8, 8), search_gen=50, search_pa=0.25): # 定义适应度函数 def fitness_func(threshold): img = np.array(image) img[img < threshold] = 0 img[img >= threshold] = 255 img = clahe(img, clip_limit=clip_limit, grid_size=grid_size) mse = np.mean((img - image) ** 2) return mse # 搜索最佳阈值 lb = 0 ub = 255 dim = 1 best_nest, best_nest_index = cuckoo_search(fitness_func, dim, lb, ub, pa=search_pa, gen=search_gen) threshold = best_nest[-1, 0] # 对图像进行CLAHE处理 img = np.array(image) img[img < threshold] = 0 img[img >= threshold] = 255 img = clahe(img, clip_limit=clip_limit, grid_size=grid_size) return img # 测试代码 if __name__ == '__main__': img = cv2.imread('lena.png', cv2.IMREAD_GRAYSCALE) img_adaptive_clahe = adaptive_clahe(img, clip_limit=2.0, grid_size=(8, 8), search_gen=50, search_pa=0.25) cv2.imshow('Original Image', img) cv2.imshow('Adaptive CLAHE Image', img_adaptive_clahe) cv2.waitKey(0) cv2.destroyAllWindows() ``` 该代码使用了numpy和OpenCV库,首先定义了CLAHE算法和杜鹃搜索算法的函数,然后定义了自适应阈值CLAHE算法的函数,最后进行测试并显示结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉默羔羊_GUET

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值