水下图像颜色校正与增强使用Retinex方法
水下图像常常因为能见度差和散射而退化,导致色彩丢失和光照减弱,特别是在红色通道。本项目复制了一种用于水下图像的颜色校正算法。该算法利用相机中的彩色滤波阵列(CFA)特性来增强色彩和光照,并采用Retinex模型改进光照效果以及自适应直方图均衡化来提升对比度。算法的有效性在各种图像上进行了测试。主要目标是恢复水下图像的颜色和对比度,以利于研究和探索中的分析和推理。
项目概述
本项目成功实现了基于文献的水下图像颜色校正算法。该算法分步骤地增强了图像,解决了由水下红色通道衰减和散射引起的问题。通过恢复原始色彩和对比度,提高了水下图像用于分析和探索的可用性。
动机
项目的动机在于将实际的图像处理技术应用于之前难以处理的彩色图像。由于文献中关于Retinex增强细节的缺乏,促使了更深入的研究。确保处理步骤之间的兼容性和理解中间数据类型至关重要。未来的工作包括自动化参数调整和提高计算效率,因为Retinex计算过程耗时较长。
阶段性成果
以下展示了各阶段处理后获得的结果:
- 原始图像
-
红色通道补偿
-
白平衡处理后的红色通道补偿
-
使用Retinex改善光照
-
直方图均衡化
代码
function output_img = MSRCR_retinex(I)
R = I(:, :, 1);
G = I(:, :, 2);
B = I(:, :, 3);
R0 = double(R);
G0 = double(G);
B0 = double(B);
[N1, M1] = size(R);
Rlog = log(R0+1);
Rfft2 = fft2(R0);
sigma1 = 128;
F1 = fspecial('gaussian', [N1,M1], sigma1);
Efft1 = fft2(double(F1));
DR0 = Rfft2.* Efft1;
DR = ifft2(DR0);
DRlog = log(DR +1);
Rr1 = Rlog - DRlog;
sigma2 = 256;
F2 = fspecial('gaussian', [N1,M1], sigma2);
Efft2 = fft2(double(F2));
DR0 = Rfft2.* Efft2;
DR = ifft2(DR0);
DRlog = log(DR +1);
Rr2 = Rlog - DRlog;
sigma3 = 512;
F3 = fspecial('gaussian', [N1,M1], sigma3);
Efft3 = fft2(double(F3));
DR0 = Rfft2.* Efft3;
DR = ifft2(DR0);
DRlog = log(DR +1);
Rr3 = Rlog - DRlog;
Rr = (Rr1 + Rr2 +Rr3)/3;
a = 125;
II = imadd(R0, G0);
II = imadd(II, B0);
Ir = immultiply(R0, a);
C = imdivide(Ir, II);
C = log(C+1);
Rr = immultiply(C, Rr);
EXPRr = exp(Rr);
MIN = min(min(EXPRr));
MAX = max(max(EXPRr));
EXPRr = (EXPRr - MIN)/(MAX - MIN);
EXPRr = adapthisteq(EXPRr);
Glog = log(G0+1);
Gfft2 = fft2(G0);
DG0 = Gfft2.* Efft1;
DG = ifft2(DG0);
DGlog = log(DG +1);
Gg1 = Glog - DGlog;
DG0 = Gfft2.* Efft2;
DG = ifft2(DG0);
DGlog = log(DG +1);
Gg2 = Glog - DGlog;
DG0 = Gfft2.* Efft3;
DG = ifft2(DG0);
DGlog = log(DG +1);
Gg3 = Glog - DGlog;
Gg = (Gg1 + Gg2 +Gg3)/3;
Ig = immultiply(G0, a);
C = imdivide(Ig, II);
C = log(C+1);
Gg = immultiply(C, Gg);
EXPGg = exp(Gg);
MIN = min(min(EXPGg));
MAX = max(max(EXPGg));
EXPGg = (EXPGg - MIN)/(MAX - MIN);
EXPGg = adapthisteq(EXPGg);
Blog = log(B0+1);
Bfft2 = fft2(B0);
DB0 = Bfft2.* Efft1;
DB = ifft2(DB0);
DBlog = log(DB +1);
Bb1 = Blog - DBlog;
DB0 = Gfft2.* Efft2;
DB = ifft2(DB0);
DBlog = log(DB +1);
Bb2 = Blog - DBlog;
DB0 = Gfft2.* Efft3;
DB = ifft2(DB0);
DBlog = log(DB +1);
Bb3 = Blog - DBlog;
Bb = (Bb1 + Bb2 + Bb3)/3;
Ib = immultiply(B0, a);
C = imdivide(Ib, II);
C = log(C+1);
Bb = immultiply(C, Bb);
EXPBb= exp(Bb);
MIN = min(min(EXPBb));
MAX = max(max(EXPBb));
EXPBb = (EXPBb - MIN)/(MAX - MIN);
EXPBb = adapthisteq(EXPBb);
output_img = cat(3, EXPRr, EXPGg, EXPBb);
方法论
为了实现上述目标,本项目采用了以下几种关键技术:
- 彩色滤波阵列(CFA)属性:利用相机传感器中的CFA特性来捕捉和增强水下的色彩信息。
- Retinex模型:这是一种模拟人类视觉系统的算法,它分离反射光和环境光成分,从而改善图像的光照条件。特别适用于修正因水介质引起的颜色失真。
- 自适应直方图均衡化:这种方法可以动态调整图像的对比度,使得暗部和亮部都能显示出更多细节,而不只是简单地拉伸整个图像的亮度范围。
结论
综上所述,本项目不仅实现了有效的水下图像颜色校正和增强,还为后续研究提供了宝贵的经验和技术参考。随着对Retinex方法及其变体的不断优化,以及对其他相关技术的应用,我们可以期待在未来进一步提升水下成像的质量,为海洋科学、考古学和其他领域带来更多的可能性。
请注意,文中提到的图片链接仅为示意,实际应用时应替换为真实图像路径或直接嵌入相应的图像。
标签:ifft2,Retinex,log,MIN,EXPBb,算法,图像,图像增强 From: https://blog.csdn.net/qq1309399183/article/details/144861219