Retinex 算法代码
时间: 2023-09-24 09:09:58 浏览: 96
图像增强-retinex算法matlab代码
Retinex算法是一种图像增强算法,它可以提高图像的亮度、对比度和饱和度。以下是一个简单的Retinex算法的Python代码实现:
```python
import cv2
import numpy as np
def singleScaleRetinex(img, sigma):
# 将图像转换为浮点数类型
img = np.float64(img)
# 计算对数值
img_log = np.log10(img + 1.0)
# 计算高斯滤波器
gauss = cv2.GaussianBlur(img, (0,0), sigma)
# 计算高斯滤波器的对数值
gauss_log = np.log10(gauss + 1.0)
# 计算差异
img_retinex = img_log - gauss_log
# 将图像转换回uint8类型
img_retinex = np.uint8(np.clip((img_retinex + 1.0) * (255.0 / np.max(img_retinex)), 0, 255))
return img_retinex
def multiScaleRetinex(img, sigma_list):
# 将图像转换为浮点数类型
img = np.float64(img)
# 计算对数值
img_log = np.log10(img + 1.0)
# 初始化图像
img_retinex = np.zeros_like(img)
# 对每个sigma值进行单尺度Retinex处理
for sigma in sigma_list:
# 计算高斯滤波器
gauss = cv2.GaussianBlur(img, (0,0), sigma)
# 计算高斯滤波器的对数值
gauss_log = np.log10(gauss + 1.0)
# 计算差异
img_retinex += img_log - gauss_log
# 将图像转换回uint8类型
img_retinex = np.uint8(np.clip((img_retinex + 1.0) * (255.0 / np.max(img_retinex)), 0, 255))
return img_retinex
def colorRestoration(img, alpha, beta):
# 将图像转换为浮点数类型
img = np.float64(img)
# 分离通道
b, g, r = cv2.split(img)
# 计算均值
mb, mg, mr = cv2.mean(b), cv2.mean(g), cv2.mean(r)
# 进行颜色恢复
b = np.uint8(np.clip(b * alpha / mb, 0, 255))
g = np.uint8(np.clip(g * alpha / mg, 0, 255))
r = np.uint8(np.clip(r * alpha / mr, 0, 255))
# 合并通道
img_color = cv2.merge([b, g, r])
# 调整饱和度
img_hsv = cv2.cvtColor(img_color, cv2.COLOR_BGR2HSV)
img_hsv[:,:,1] = np.uint8(np.clip(img_hsv[:,:,1] * beta, 0, 255))
img_color = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR)
return img_color
def MSRCP(img, sigma_list, alpha, beta):
# 多尺度Retinex处理
img_retinex = multiScaleRetinex(img, sigma_list)
# 颜色恢复
img_color = colorRestoration(img, alpha, beta)
# 合并图像
img_msrcp = cv2.addWeighted(img_retinex, 0.75, img_color, 0.25, 0)
return img_msrcp
```
使用时,可以先调用`MSRCP()`函数,然后传入图像,sigma值列表、alpha和beta参数,函数将返回经过Retinex增强处理的图像。例如:
```python
img = cv2.imread('test.jpg')
sigma_list = [15, 80, 250]
alpha = 128
beta = 1.5
img_msrcp = MSRCP(img, sigma_list, alpha, beta)
cv2.imshow('MSRCP', img_msrcp)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这将会显示经过Retinex增强处理的图像。
阅读全文