Retinex(SSR,MSR,MSRCR)

各参数的含义及取值还没完全搞懂

在低照度场景下进行目标检测任务,常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题,给检测带来一定的难度。使用图像增强模块对原始图像进行画质提升,恢复各类图像信息,再使用目标检测网络对增强图像进行特定目标检测,有效提高检测的精确度。

SSR

原理

I(X,Y)表示相机捕获的图像(计算机存储的实际图像)
L(X,Y)表示入射分量
R(X,Y)表示反射分量
目标:已知I和L,求R
公式:
I=R*L
其中L可以直接由I用高斯卷积估计得到
因此L,I已知,可以求R
方便起见,用对数表示公式:
log(R)=log(I)-log(L)
所求得logR后直接放缩到0-255

代码

# sigma:高斯模糊的sigma参数
def SSR(src_img, sigma):
	# 即所求L
    L_blur = cv2.GaussianBlur(src_img, (0, 0), sigma)  # 高斯函数
    dst_Img = np.log10(src_img+0.01)  # 归一化取log
    dst_Lblur = np.log10(L_blur+0.01)  # 归一化取log
    log_R = dst_Img-dst_Lblur  # 减  log(R(x,y))=log(I(x,y))-log(L(x,y))
    dst_R = cv2.normalize(log_R, None, 0, 255, cv2.NORM_MINMAX)  # 放缩到0-255
    log_uint8 = cv2.convertScaleAbs(dst_R)  # 取整
    return log_uint8

MSR

原理

1、需要对原始图像进行每个尺度的高斯模糊,得到模糊后的图像Li(x,y),其中小标i表示尺度数。

2、对每个尺度下进行累加计算 MSR(x,y)=w1*SSR(x,y,sigma1)+w2*SSR(x,y,sigma2)+w3*SSR(x,y,sigma3)…
其中Weight(i)表示每个尺度对应的权重,要求各尺度权重之和必须为1,经典的取值为等权重。

代码

def SSR(src_img, sigma):
    L_blur = cv2.GaussianBlur(src_img, (0, 0), sigma)  # 高斯函数
    dst_Img = np.log10(src_img + 0.01)  # 归一化取log
    dst_Lblur = np.log10(L_blur + 0.01)  # 归一化取log
    return dst_Img - dst_Lblur  # 减  log(R(x,y))=log(I(x,y))-log(L(x,y))


def MSR(img, sigma_list):
    retinex = np.zeros_like(img * 1.0)
    for sigma in sigma_list:
        retinex += SSR(img, sigma)
    retinex /= len(sigma_list)
    for i in range(retinex.shape[2]):
        retinex[:, :, i] = (retinex[:, :, i] - np.min(retinex[:, :, i])) / (
                    np.max(retinex[:, :, i]) - np.min(retinex[:, :, i])) * 255
    img_msr = np.uint8(np.minimum(np.maximum(retinex, 0), 255))
    return img_msr

MSRCR

原理

在前面的增强过程中,图像可能会因为增加了噪声,而使得图像的局部细节色彩失真,不能显现出物体的真正颜色,整体视觉效果变差。针对这一点不足,MSRCR在MSR的基础上,加入了色彩恢复因子C来调节由于图像局部区域对比度增强而导致颜色失真的缺陷.

先看一组公式:
RMSRCR(x,y)‘=G⋅RMSRCR(x,y)+b
RMSRCR (x,y)=C(x,y)RMSR(x,y)
C(x,y)=f[I’(x,y)]=f[I(x,y)/∑I(x,y)]Ci(x,y)=f[Ii′(x,y)]=f[Ii(x,y)∑j=1NIj(x,y)]
f[I’(x,y)]=βlog[αI’(x,y)]=β{log[αI’(x,y)]−log[∑I(x,y)]}

如果是灰度图像,只需要计算一次即可,如果是彩色图像,如RGB三通道,则每个通道均需要如上进行计算

G表示增益Gain(一般取值:5)

b表示偏差Offset(一般取值:25)

I (x, y)表示某个通道的图像

C表示某个通道的彩色回复因子,用来调节3个通道颜色的比例;

f(·)表示颜色空间的映射函数;

β是增益常数(一般取值:46);

α是受控制的非线性强度(一般取值:125)

MSRCR算法利用彩色恢复因子C,调节原始图像中3个颜色通道之间的比例关系,从而把相对较暗区域的信息凸显出来,达到了消除图像色彩失真的缺陷。 处理后的图像局部对比度提高,亮度与真实场景相似,在人们视觉感知下,图像显得更加逼真;但是MSRCR算法处理图像后,像素值一般会出现负值。所以从对数域r(x, y)转换为实数域R(x, y)后,需要通过改变增益Gain,偏差Offset对图像进行修正。

另外:介绍下什么是颜色的简单白平衡(simplest Color Balance)

白平衡的意思就是:是图片中最亮的部分为白色,最暗的部分为黑色。其余部分进行拉伸

简单的说就是:在RGB三通道上分别统计每个像素值的出现次数。将1%的最大值和最小值设置为255和0。其余值映射到(0,255),这样使得每个值通道的值在RGB中分布较均匀。达到颜色平衡的结果

代码

def SSR(src_img, sigma):
    L_blur = cv2.GaussianBlur(src_img, (0, 0), sigma)  # 高斯函数
    dst_Img = np.log10(src_img + 0.01)  # 归一化取log
    dst_Lblur = np.log10(L_blur + 0.01)  # 归一化取log
    return dst_Img - dst_Lblur  # 减  log(R(x,y))=log(S(x,y))-log(L(x,y))


def MSR(img, sigma_list):
    retinex = np.zeros_like(img * 1.0)
    for sigma in sigma_list:
        retinex += SSR(img, sigma)
    retinex /= len(sigma_list)
    return retinex

# 即求色彩恢复因子C或f
def colorRestoration(img, alpha, beta):
    img_sum = np.sum(img, axis=2, keepdims=True)
    return beta * (np.log10(alpha * (img+0.01)) - np.log10(img_sum+0.01))

# 简单白平衡,low_clip:0.01,high_clip:0.99
# 将最小的前0.01像素值映射到0,最大的后0.01映射到255
# low_val:前0.01像素值的分界点,high_val:后0.01像素值的分界点
# 其他像素值放缩到[low_val,high_val]之间
def simplestColorBalance(img, low_clip, high_clip):
    total = img.shape[0] * img.shape[1]
    for i in range(img.shape[2]):
        unique, counts = np.unique(img[:, :, i], return_counts=True)
        current = 0
        for u, c in zip(unique, counts):
            if float(current) / total < low_clip:
                low_val = u
            if float(current) / total < high_clip:
                high_val = u
            current += c
        img[:, :, i] = np.maximum(np.minimum(img[:, :, i], high_val), low_val)
    return img


def MSRCR(img, sigma_list, G, b, alpha, beta, low_clip, high_clip):
    C = colorRestoration(img, alpha, beta)
    RMSRCR = C * MSR(img, sigma_list)
    img_msrcr = G * RMSRCR + b
    for i in range(img_msrcr.shape[2]):
        img_msrcr[:, :, i] = (img_msrcr[:, :, i] - np.min(img_msrcr[:, :, i])) / (
                np.max(img_msrcr[:, :, i]) - np.min(img_msrcr[:, :, i])) * 255
    img_msrcr = np.uint8(np.minimum(np.maximum(img_msrcr, 0), 255))
    img_msrcr = simplestColorBalance(img_msrcr, low_clip, high_clip)
    return img_msrcr


效果

原图:
原图
SSR:
在这里插入图片描述
MSR:
在这里插入图片描述

MSRCR:
在这里插入图片描述




参考: https://blog.csdn.net/weixin_43334693/article/details/135168674
https://www.cnblogs.com/wangyong/p/8665434.html#!comments
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值