简单有效的低照度增强

低照度图像增强:

本文基于《Adaptive and integrated neighborhood-dependent approach for nonlinear enhancement of color images》

先放图片:
原图
增强图

其算法主要分为三步:

  1. 根据图像的亮度分布建立一个全局映射;
  2. 自适应对比度增强;
  3. 颜色恢复。

全局曲线调整:

  1. 首先计算出图像的亮度值,公式如下:
    I ( x , y ) = 76.245 ⋅ I R ( x , y ) + 149.685 ⋅ I B ( x , y ) + 29.07 ⋅ I G ( x , y ) 255 I(x,y)=\frac{76.245\cdot I_R(x,y)+149.685\cdot I_B(x,y)+29.07\cdot I_G(x,y)}{255} I(x,y)=25576.245IR(x,y)+149.685IB(x,y)+29.07IG(x,y)

  2. 对亮度进行归一化:
    I N ( x , y ) = I ( x , y ) 255 I_N(x,y)=\frac{I(x,y)}{255} IN(x,y)=255I(x,y)

  3. 通过映射函数对图像进行线性增强:
    a = 0.24 , b = 0.5 I n ( x , y ) = I ( x , y ) a + ( 1 − I ( x , y ) ) b + I ( x , y ) 2 2 a=0.24,b=0.5\\In(x,y)=\frac{I(x,y)^a+(1-I(x,y))^b+I(x,y)^2}{2} a=0.24,b=0.5In(x,y)=2I(x,y)a+(1I(x,y))b+I(x,y)2

对比度增强:

  1. 接着对 I ( x , y ) I(x,y) I(x,y)进行不同尺度的高斯核函数进行卷积运算,其结果包含图像相邻像素的亮度信息
    G ( x , y ) = K e ( − ( X 2 + y 2 ) c 2 ) G(x,y)=Ke(\frac{-(X^2+y^2)}{c^2}) G(x,y)=Ke(c2(X2+y2))
    c为尺度或是高斯环绕空间常数
    I g ( x , y ) = I ( x , y ) ∗ G ( x , y ) I_g(x,y)=I(x,y)\ast G(x,y) Ig(x,y)=I(x,y)G(x,y)

  2. 对比度增强:

R ( x , y ) = I n ( x , y ) r ( x , y ) r ( x , y ) = I g ( x , y ) I ( x , y ) R(x,y)=I_n(x,y)^{r^{(x,y)}}\\r(x,y)=\frac{I_g(x,y)}{I(x,y)} R(x,y)=In(x,y)r(x,y)r(x,y)=I(x,y)Ig(x,y)

  1. 线性组合:
    R ( x , y ) = ∑ i 3 ω i R i ( x , y ) R(x,y)=\sum_i^3\omega _iR_i(x,y) R(x,y)=i3ωiRi(x,y)
    ω \omega ω通常取1/3

颜色恢复:

使用线性颜色恢复:
R j ( x , y ) = I j ( x , y ) I n ( x , y ) j 为 r , b , g R_j(x,y)=\frac{I_j(x,y)}{I_n(x,y)}\\j为r,b,g Rj(x,y)=In(xy)Ij(x,y)jr,b,g

代码:

  1. matlab代码:

    I=im2double(imread('hockey.png'));
    I1=rgb2gray(I);
    In=(I1.^(0.24)+(1-I1).*0.5+I1.^2)/2;
    %通过高斯核对灰度增强图像做卷积运算
    sigma=5;
    window = double(uint8(3*sigma)*2 + 1);
    G1=fspecial('gaussian',window,sigma);
    Guass1=imfilter(I1,G1,'conv','replicate','same');
    r1=Guass1./I1;
    R1=In.^r1;
    sigma=20;
    window = double(uint8(3*sigma)*2 + 1);
    G2=fspecial('gaussian',window,sigma);
    Guass2=imfilter(I1,G2,'conv','replicate','same');
    r2=Guass2./I1;
    R2=In.^r2;
    sigma=240;
    window = double(uint8(3*sigma)*2 + 1);
    G3=fspecial('gaussian',window,sigma);
    Guass3=imfilter(I1,G3,'conv','replicate','same');
    r3=Guass3./I1;
    R3=In.^r3;
    R=(R1+R2+R3)/3;
    Rr=R.*(I(:,:,1)./I1);
    Rg=R.*(I(:,:,2)./I1);
    Rb=R.*(I(:,:,3)./I1);
    rgb=cat(3,Rr,Rg,Rb);
    imshow([I rgb]);
    
  2. Python代码:

    def Image_enhancing(image):
        img=cv2.cvtColor(image,cv2.COLOR_BGR2GARY)/255
        # img = 0.2989*image[:, :, 2]+0.5870*image[:, :, 1]+0.1140*image[:, :, 0]
        #二者效果一样,使用后者不需要再除以255
        img = replaceZeroes(img)
        img_n = (np.power(img, 0.24)+(1-img)*0.5+np.power(img, 2))/2
        sigma = 3
        window = 3*sigma*2+1
    
        guass1 = cv2.GaussianBlur(img, (window, window), sigma)
        r1 = guass1/img
        R1 = np.power(img_n, r1)
        sigma = 20
        window = 3*sigma*2+1
    
        guass2 = cv2.GaussianBlur(img, (window, window), sigma)
        r2 = guass2/img
        R2 = np.power(img_n, r2)
        sigma = 24
        window = 255
    
        guass3 = cv2.GaussianBlur(img, (window, window), sigma)
        r3 = guass3/img
        R3 = np.power(img_n, r3/255)
        R = (R1+R2+R3)/3
        Rr = R*(image[:, :, 2]/img_n)
        Rg = R*(image[:, :, 1]/img_n)
        Rb = R*(image[:, :, 0]/img_n)
        rgb = np.concatenate(
            (Rb[:, :, np.newaxis], Rg[:, :, np.newaxis], Rr[:, :, np.newaxis]), axis=2)
        return rgb+image
    
    def replaceZeroes(img):
        min_nonzero = min(img[np.nonzero(img)])
        img[img == 0] = min_nonzero
        return img
    

    几个要点:

    1. 读取图像时需要归一化,我将归一化放在转为灰度图之后;

    2. 显示增强图像时需要除以255;

    3. cv2.imread()读取图片通道为BGR;

    4. 有文章说需要将增强图像超过1的部分设为1,详见,但实际并没有遇到问题。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值