水下图像增强带有颜色矫正的多尺度色彩恒常Retinex算法python代码
时间: 2024-01-31 15:03:06 浏览: 163
以下是基于Python实现的带有颜色矫正的多尺度色彩恒常Retinex算法的代码:
```
import cv2
import numpy as np
def color_correction(img):
# 将图像转换为YCbCr颜色空间
img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
# 提取亮度通道
y = img_yuv[:,:,0]
# 计算亮度直方图均值
hist_y = cv2.calcHist([y],[0],None,[256],[0,256])
mean_y = np.sum(hist_y * np.arange(256)) / np.sum(hist_y)
# 计算颜色矫正系数
alpha = 128 / mean_y
# 对亮度通道进行矫正
y_corrected = np.uint8(np.clip(alpha * y, 0, 255))
# 将矫正后的亮度通道与原图的色度通道合并
img_corrected = cv2.cvtColor(cv2.merge([y_corrected, img_yuv[:,:,1], img_yuv[:,:,2]]), cv2.COLOR_YUV2BGR)
return img_corrected
def single_scale_retinex(img, sigma):
# 高斯模糊
img_blur = cv2.GaussianBlur(img, (0, 0), sigma)
# 计算对数值
img_log = np.log10(np.float32(img)) - np.log10(np.float32(img_blur))
# 反变换
img_log = cv2.normalize(img_log, None, 0, 255, cv2.NORM_MINMAX)
img_retinex = np.uint8(img_log)
return img_retinex
def multi_scale_retinex(img, sigma_list):
img_retinex = np.zeros_like(img)
for sigma in sigma_list:
img_retinex += single_scale_retinex(img, sigma)
img_retinex = img_retinex / len(sigma_list)
return np.uint8(img_retinex)
def underwater_image_enhancement(image_path, sigma_list):
# 读取图像
img = cv2.imread(image_path)
# 颜色矫正
img_corrected = color_correction(img)
# 应用多尺度色彩恒常Retinex算法
img_retinex = multi_scale_retinex(img_corrected, sigma_list)
# 显示增强后的图像
cv2.imshow('Retinex', img_retinex)
cv2.waitKey()
if __name__ == '__main__':
image_path = 'underwater_image.jpg'
sigma_list = [15, 80, 250]
underwater_image_enhancement(image_path, sigma_list)
```
在上述代码中,我们首先定义了颜色矫正函数,通过将图像转换为YCbCr颜色空间,提取亮度通道并计算亮度直方图均值,然后计算颜色矫正系数并对亮度通道进行矫正,最后将矫正后的亮度通道与原图的色度通道合并。接着,我们定义了单尺度Retinex和多尺度Retinex两个函数,与之前的多尺度Retinex算法类似,但这里使用了矫正后的图像进行增强处理。在测试代码中,我们读取了一张水下图像,并设置了sigma列表进行多尺度色彩恒常Retinex增强,最后通过cv2.imshow()函数显示增强后的图像。
阅读全文
相关推荐

















