Retinex详解

Retinex图像增强算法详解
一、Retinex理论
1)物体的颜色由物体对长波(红)、中波(绿)和短波(蓝)光线的反射能力决定,而不是由反射光强度的绝对值决定;
2)物体的色彩不受光照非均性的影响,具有一致性;
3)Retinex理论是以色感一致性为基础。
 
如下图所示,观察者所看到的图像S(x,y)是由入射图像L(x,y)和反射图像R(x,y)构成。即入射光照射在反射物体上,通过反射物体的反射,形成反射光进入人眼,从而形成图像。其公式如下表示:
\[S(x,y) = R(x,y) \bullet L(x,y)\]
  Retinex算法的核心就是估测入射图像L(x,y),从图像S(x,y)中来估测L(x,y)分量,并去除L(x,y)分量,从而得到反射图像R(x,y)。具体操作:
1)两边同时取对数:

\[\log [R(x,y)] = \log [S(x,y)] - \log [L(x,y)]\]

2)由于L(x,y)只能近似求取,因此用S(x,y)和高斯核进行卷积来表示。所以公式如下:

\[L{\rm{og}}(R(x,y)) = (Log(S(x,y)) - Log(S(x,y) * G(x,y)))\]

其中 * 代表卷积操作,G(x,y)代表高斯核。

 3)对求取的R(x,y)映射到(0,255)之间。对于量化公式:

\[R(x,y) = (Value - Min)/(Max - Min)(255 - 0)\]

 

二、Retinex代码

import numpy as np
import cv2


def replaceZeroes(data):
    min_nonzero = min(data[np.nonzero(data)])
    data[data == 0] = min_nonzero
    return data

def SSR(src_img, size):
    L_blur = cv2.GaussianBlur(src_img, (size, size), 0)
    img = replaceZeroes(src_img)
    L_blur = replaceZeroes(L_blur)

    dst_Img = cv2.log(img/255.0)
    dst_Lblur = cv2.log(L_blur/255.0)
    dst_IxL = cv2.multiply(dst_Img,dst_Lblur)
    log_R = cv2.subtract(dst_Img, dst_IxL)

    dst_R = cv2.normalize(log_R,None,0,255,cv2.NORM_MINMAX)
    log_uint8 = cv2.convertScaleAbs(dst_R)
    return log_uint8


if __name__ == '__main__':
    img = r'E:\chengxu\CV\ls\2023.2\12345.jpg'
    size = 3
    src_img = cv2.imread(img)
    b_gray, g_gray, r_gray = cv2.split(src_img)
    b_gray = SSR(b_gray, size)
    g_gray = SSR(g_gray, size)
    r_gray = SSR(r_gray, size)
    result = cv2.merge([b_gray, g_gray, r_gray])

    cv2.imshow('img',src_img)
    cv2.imshow('result',result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

 

 

转载:(68条消息) OpenCV—Python Retinex图像增强算法_SongpingWang的博客-CSDN博客_基于路径的retinex算法

 
posted on 2023-02-16 19:40  DLst_liu  阅读(1226)  评论(0编辑  收藏  举报