Retinex 算法:MSRCR 与 MSRCP 的 Python 实现
Retinex 理论由 Edwin Land 提出,旨在模拟人类视觉系统对颜色和亮度的感知。其核心思想是将图像分解为 照度分量(illumination)和 反射分量(reflection),通过去除照度的影响,增强图像的细节和颜色。Retinex 算法广泛应用于图像增强、去雾、低光照图像处理等领域。
多尺度 Retinex (MSR) 是 Retinex 的扩展版本,通过在多个尺度上对图像进行高斯滤波,获得更稳定的照度估计。MSR 的公式如下:
R ( x , y ) = ∑ i = 1 N w i ⋅ ( log ( I ( x , y ) ) − log ( G i ( x , y ) ∗ I ( x , y ) ) ) R(x, y) = \sum_{i=1}^{N} w_i \cdot \left( \log(I(x, y)) - \log(G_i(x, y) * I(x, y)) \right) R(x,y)=i=1∑Nwi⋅(log(I(x,y))−log(Gi(x,y)∗I(x,y)))
其中:
• I ( x , y ) I(x, y) I(x,y) 是输入图像。
• G i ( x , y ) G_i(x, y) Gi(x,y) 是第 i i i 个尺度的高斯核。
• w i w_i wi 是第 i i i 个尺度的权重。
• N N N 是尺度数量。
MSR 通过加权求和多个尺度的结果,能够更好地处理不同尺度的图像细节。
MSRCR (Multi-Scale Retinex with Color Restoration) 在 MSR 的基础上引入了颜色恢复机制,解决了 MSR 可能导致颜色失真的问题。其公式如下:
R M S R C R ( x , y ) = C ( x , y ) ⋅ R M S R ( x , y ) R_{MSRCR}(x, y) = C(x, y) \cdot R_{MSR}(x, y) RMSRCR(x,y)=C(x,y)⋅RMSR(x,y)
其中 C ( x , y ) C(x, y) C(x,y) 是颜色恢复因子,用于调整颜色平衡。
MSRCP (Multi-Scale Retinex with Chromaticity Preservation) 则通过保留图像的色度信息,进一步优化颜色表现。其公式如下:
R M S R C P ( x , y ) = α ⋅ R M S R ( x , y ) + ( 1 − α ) ⋅ I c h r o m ( x , y ) R_{MSRCP}(x, y) = \alpha \cdot R_{MSR}(x, y) + (1 - \alpha) \cdot I_{chrom}(x, y) RMSRCP(x,y)=α⋅RMSR(x,y)+(1−α)⋅Ichrom(x,y)
其中 I c h r o m ( x , y ) I_{chrom}(x, y) Ichrom(x,y) 是图像的色度分量, α \alpha α 是权重系数。
以下是 MSRCR 和 MSRCP 的 Python 实现代码:
import cv2
import numpy as np
def gaussian_kernel(size, sigma):
"""生成高斯核"""
kernel = cv2.getGaussianKernel(size, sigma)
return kernel * kernel.T
def MSR(img, sigma_list):
"""多尺度 Retinex"""
retinex = np.zeros_like(img, dtype=np.float32)
for sigma in sigma_list:
kernel = gaussian_kernel(3, sigma)
log_img = np.log1p(img.astype(np.float32))
blur_img = cv2.filter2D(log_img, -1, kernel)
retinex += (log_img - blur_img) / len(sigma_list)
return retinex
def MSRCR(img, sigma_list, G, b, alpha, beta, low_clip, high_clip):
"""MSR with Color Restoration"""
msr = MSR(img, sigma_list)
color_restoration = G * (np.log1p(img * alpha) - np.log1p(b))
msrcr = beta * (msr * color_restoration)
msrcr = np.clip(msrcr, low_clip, high_clip)
return msrcr
def MSRCP(img, sigma_list, low_clip, high_clip):
"""MSR with Chromaticity Preservation"""
msr = MSR(img, sigma_list)
chrom = img / (np.sum(img, axis=2, keepdims=True) + 1e-6)
msrcp = 0.5 * msr + 0.5 * chrom
msrcp = np.clip(msrcp, low_clip, high_clip)
return msrcp
• MSRCR 在增强图像细节的同时,能够较好地恢复颜色,适用于低光照或雾天图像。
• MSRCP 则更注重色度的保留,适合处理颜色丰富的图像。
• 医学图像处理:增强 X 光或 MRI 图像的细节。
• 自动驾驶:改善低光照或雾天条件下的道路图像。
• 摄影:修复曝光不足或过曝的照片。
Retinex 算法通过模拟人类视觉系统,能够有效增强图像的细节和颜色。MSRCR 和 MSRCP 作为其扩展版本,分别在颜色恢复和色度保留方面表现出色。通过 Python 实现,可以方便地将这些算法应用于实际场景中。
参考文献: