局部标准差实现对比度增强

基于“局部标准差”的图像增强(原理、算法、代码)

一、理论
         图像增强算法的基本原则是“降低低频区域,突出高频区域”,以此强化边缘,达到增强的目的。最简单的例子就是通过原始图像减去高斯模糊处理后的图像,就能够将边缘强化出来。
         直方图均衡化也是一种非常常见的增强方法。但是为了避免背景的干扰,更倾向于采用“局部”方法进行处理。我们这里着重研究自适应对比度增强(ACE)的相关内容。
        ACE的定义和原理看上去还是比较简单的。这里的 都可以根据图像本身计算出来。而 则需要单独计算。

          可以为单独的常量,或者通过来代替。这里的D是一个全局的值,比如平均值。

二、实现
        涉及到局部的运算,自然而然会想到使用卷积的方法。更好的是Opencv提供了专门的函数用来做这个工作—BLUR
文档中写到:
那么正是我们想要的结果。
//ace 自适应对比度均衡研究
//by  jsxyhelu
//感谢 imageshop
# include  "stdafx.h"
# include  <iostream >
# include  "opencv2/core/core.hpp"
# include  "opencv2/highgui/highgui.hpp"
# include  "opencv2/imgproc/imgproc.hpp"
using  namespace std;
using  namespace cv;
//点乘法 elementWiseMultiplication
cv : :Mat EWM(cv : :Mat m1,cv : :Mat m2){
    Mat dst =m1.mul(m2);
     return dst;
}
void main()
{
    Mat src  = imread( "hand.jpg", 0);
    Mat meanMask;
    Mat varMask;
    Mat meanGlobal;
    Mat varGlobal;
    Mat dst;
    Mat tmp;
    Mat tmp2;
     int C  =  30;
     int D  =  133;
     //全局均值和均方差
    blur(src.clone(),meanGlobal,src.size());
    varGlobal  = src  - meanGlobal;
    varGlobal  = EWM(varGlobal,varGlobal);
    blur(src.clone(),meanMask,Size( 50, 50)); //meanMask为局部均值
    tmp  = src  - meanMask;                        
    varMask  = EWM(tmp,tmp);              
    blur(varMask,varMask,Size( 50, 50));     //varMask为局部方差
    
    dst  = meanMask  + C *tmp;
    imshow( "src",src);
    imshow( "dst",dst);
     
    waitKey();
}
接下来,为了实现 那么需要计算局部标准差和全局均值或方差
前面已经计算出了局部均值,那么
tmp  = src  - meanMask;  
    varMask  = EWM(tmp,tmp);         
    blur(varMask,varMask,Size( 50, 50));     //varMask为局部方差   
计算出局部方差
//换算成局部标准差
    varMask.convertTo(varMask,CV_32F);
     for ( int i = 0;i <varMask.rows;i ++){
         for ( int j = 0;j <varMask.cols;j ++){
            varMask.at < float >(i,j)  =  ( float)sqrt(varMask.at < float >(i,j));
        }
    }
换算成局部标准差
meanStdDev(src,meanGlobal,varGlobal);  //meanGlobal为全局均值 varGlobal为全局标准差
是opencv提供的全局均值和标准差计算函数。
全部代码进行重构后如下
//ace 自适应对比度均衡研究
//by  jsxyhelu
//感谢 imageshop
# include  "stdafx.h"
# include  <iostream >
# include  "opencv2/core/core.hpp"
# include  "opencv2/highgui/highgui.hpp"
# include  "opencv2/imgproc/imgproc.hpp"
using  namespace std;
using  namespace cv;
//点乘法 elementWiseMultiplication
cv : :Mat EWM(cv : :Mat m1,cv : :Mat m2){
    Mat dst =m1.mul(m2);
     return dst;
}
//图像局部对比度增强算法
cv : :Mat ACE(cv : :Mat src, int C  =  4, int n = 20, int MaxCG  =  5){
    Mat meanMask;
    Mat varMask;
    Mat meanGlobal;
    Mat varGlobal;
    Mat dst;
    Mat tmp;
    Mat tmp2;
    blur(src.clone(),meanMask,Size( 50, 50)); //meanMask为局部均值 
    tmp  = src  - meanMask;  
    varMask  = EWM(tmp,tmp);         
    blur(varMask,varMask,Size( 50, 50));     //varMask为局部方差   
     //换算成局部标准差
    varMask.convertTo(varMask,CV_32F);
     for ( int i = 0;i <varMask.rows;i ++){
         for ( int j = 0;j <varMask.cols;j ++){
            varMask.at < float >(i,j)  =  ( float)sqrt(varMask.at < float >(i,j));
        }
    }
    meanStdDev(src,meanGlobal,varGlobal);  //meanGlobal为全局均值 varGlobal为全局标准差
    tmp2  = varGlobal /varMask;
     for ( int i = 0;i <tmp2.rows;i ++){
         for ( int j = 0;j <tmp2.cols;j ++){
             if (tmp2.at < float >(i,j) >MaxCG){
                tmp2.at < float >(i,j)  = MaxCG;
            }
        }
    }
    tmp2.convertTo(tmp2,CV_8U);
    tmp2  = EWM(tmp2,tmp);
    dst  = meanMask  + tmp2;
    imshow( "D方法",dst);
    dst  = meanMask  + C *tmp;
    imshow( "C方法",dst);
     return dst;
}
void main()
{
    Mat src  = imread( "plant.bmp", 0); 
    imshow( "src",src);
    ACE(src);
    waitKey();
}
三、小结
      从结果上来看,ACE算法对于特定情况下的图片细节增强是显著的,但是并不是适用于所有的情况,并且其参数需要手工进行调整。了解它的特性,就能够解决一系列的问题,有效地增强现实。
 
 





<think>好的,用户的问题是关于如何在OpenCV和Python中实现局部对比度增强。我需要先回忆一下相关的技术方法,并结合提供的引用内容来组织回答。 首先,用户提到的局部对比度增强,通常与全局方法(如直方图均衡化)不同,局部方法处理的是图像的小区域,这样可以更好地增强细节,特别是在不同区域对比度差异较大的情况下。根据引用[3],CLAHE(限制对比度自适应直方图均衡化)是一个常用的方法,它通过将图像分成小块并对每个块进行直方图均衡化,同时限制对比度来避免噪声放大。所以CLAHE应该是回答的重点之一。 接下来,用户可能需要了解其他局部增强方法。比如,局部标准差增强,通过计算局部区域的标准差来调整对比度,这种方法需要手动定义邻域大小和增益参数。另外,Unsharp Masking(非锐化掩模)也是一种增强边缘和细节的技术,属于局部处理。这些方法可能在引用中没有提到,但属于常见的局部对比度增强技术,需要补充进去。 然后,结合用户提供的引用内容,引用[1]提到了直方图均衡化,但这是全局的,而引用[3]详细说明了CLAHE的实现,所以应该详细解释CLAHE的步骤和参数,如clipLimit和tileGridSize的作用。同时,代码示例需要根据引用[3]中的代码进行调整,确保正确性。 还需要考虑用户可能的实际应用场景,比如处理医学图像或低光照条件下的图像,这时候局部方法更能有效提升细节。同时,注意事项部分应该包括参数调整的影响,比如clipLimit过大会导致噪声放大,tileGridSize影响局部块的大小,这些都需要在回答中提到,帮助用户避免常见问题。 最后,生成相关问题时,需要覆盖用户可能进一步询问的方向,比如不同方法的比较、参数调整技巧、处理后的评估方法以及与其他技术的结合使用。这样能帮助用户深入理解并解决后续可能遇到的问题。 总结步骤:先介绍CLAHE方法,给出代码示例;然后介绍局部标准差增强和Unsharp Masking,分别说明原理和代码;接着讨论应用场景和注意事项;最后生成相关问题。确保引用正确,如引用[3]用于CLAHE部分,其他方法可能需要引用其他资料,但用户提供的引用中只有CLAHE相关,所以需注意引用标注的准确性。</think>在OpenCV中实现局部对比度增强,可采用以下方法: ### 一、CLAHE(限制对比度自适应直方图均衡化) 1. **原理**:将图像划分为$8 \times 8$的局部区域,对每个区域单独进行直方图均衡化,并通过`clipLimit`限制对比度放大以避免噪声 2. **实现代码**: ```python import cv2 img = cv2.imread('input.jpg', cv2.IMREAD_GRAYSCALE) clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) # clipLimit控制对比度阈值 enhanced_img = clahe.apply(img) ``` 参数说明: - `clipLimit=2.0`:限制对比度增幅的阈值,值越大对比度增强越明显,但可能引入噪声[^3] - `tileGridSize=(8,8)`:定义局部处理块的大小 ### 二、局部标准差增强 1. **原理**:计算像素邻域内的标准差,动态调整对比度: $$ I_{out}(x,y) = \alpha \cdot (I_{in}(x,y) - \mu) + \mu $$ 其中$\mu$为局部均值,$\alpha$为增益系数 2. **实现代码**: ```python from skimage.filters import window, rank from skimage import exposure kernel = window('disk', 5) # 定义5x5圆形邻域 local_mean = rank.mean(img, kernel) local_std = rank.std(img, kernel) enhanced_img = (img - local_mean) * 3.0 + local_mean # 增益系数设为3 ``` ### 三、Unsharp Masking(非锐化掩模) 1. **原理**:通过高斯模糊生成掩模,突出边缘细节: $$ I_{sharp} = I_{orig} + \lambda (I_{orig} - I_{blur}) $$ 2. **OpenCV实现**: ```python blur = cv2.GaussianBlur(img, (0,0), 3.0) enhanced_img = cv2.addWeighted(img, 1.5, blur, -0.5, 0) # λ=0.5 ``` ### 四、应用场景 1. 医学影像增强(如X光片局部细节增强) 2. 低光照图像处理(增强暗部细节) 3. 文档图像处理(改善文字与背景对比度) ### 五、注意事项 1. CLAHE的`tileGridSize`不宜超过图像尺寸的1/10 2. 局部处理可能造成块状伪影,可通过后处理平滑 3. 彩色图像需转换到LAB色彩空间单独处理L通道
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值