
Retinex图像增强算法
咱们今天来聊个硬核的——如何用Retinex算法给照片摘掉"雾霾滤镜"。这玩意儿可比美颜软件里的
滤镜高级多了,它模拟的是人眼视网膜的视觉适应机制。举个栗子,你在大雾天拍的照片灰蒙蒙的,Retine
x能还原出物体本来的颜色,就像突然给画面装了除雾器。
先上段代码热热身,咱们用Python+OpenCV实现基础版单尺度Retinex:
```python
import cv2
import numpy as np
def single_scale_retinex(img, sigma):
# 高斯核尺寸自动计算,经验值是sigma*6+1
kernel_size = int(sigma * 6) // 2 * 2 + 1
blurred = cv2.GaussianBlur(img, (kernel_size, kernel_size), sigma)
# 注意数据类型转换,避免溢出
log_img = np.log1p(img.astype(np.float64))
log_blur = np.log1p(blurred.astype(np.float64))
retinex = log_img - log_blur
return cv2.normalize(retinex, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)
# 使用示例
img = cv2.imread('foggy_photo.jpg')
enhanced = single_scale_retinex(img, sigma=80)
cv2.imwrite('enhanced.jpg', enhanced)
```
这段代码的关键在于高斯模糊的尺度选择。sigma参数越大,去雾效果越猛,但可能丢失细节。比如s
igma=80时效果就像突然把曝光拉高了三级,但暗部细节可能糊成一片。这时候咱们就需要祭出多尺度Re
tinex(MSR),把不同尺度的结果加权融合。
来看个进阶版的色彩恢复技巧:
```python
def color_restoration(img, alpha=125, beta=46):
img = img.astype(np.float32)
sum_channels = np.sum(img, axis=2) + 1e-6 # 防止除零