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

ACE算法是一种用于提升低对比度图像质量的技术,尤其在医学CT图像中常见。它通过分离图像的低频和高频部分,对高频细节进行增益处理来增强对比度。算法包括计算局部平均值和方差,然后根据选择的增益函数对高频部分进行增强。不同的增益函数会产生不同的增强效果,如示例中所示。最后,通过通道融合和颜色空间转换得到最终的增强图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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算法实现

  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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值