Retinex 图像去模糊(含MATLAB代码)

Retinex 图像去模糊

Retinex 理论:
Retinex是由 Retina + Cortex 组成,被称为视网膜皮层理论。 该理论指出 物体能够被观察到的信息是由两个因素来决定的:物体本身的反射性质和物体周围的光照强度。其中,光照强度决定了原始图像中所有像素点的动态范围大小,而原始图像的固有属性(颜色)是由物体本身的反射系数决定的。 因此该方法是将一幅图像分成两个不同的图像:反射图像和亮度图像,然后去除光照的影响,保留物体的固有属性。
在这里插入图片描述
该方法目前主要有三个分支:单尺度Retinex(SSR),多尺度Retinex(MSR)和带颜色恢复的多尺度Retinex(MSRCR)。
Retinex理论的基本思路:在原始图像中,通过某种方法去除或者降低入射图像的影响,从而保留物体本质的反射属性图像。

单尺度Retinex(SSR):

算法思路:
1 读取原始图像,分别取出RGB三个通道的数值矩阵,转化成 double 型。
2 利用高斯模板对各个通道的进行卷积操作处理。
3 将RGB图像以及卷积后的图像转化到对数域,并相减,然后利用反对数转化到 实数域。
4 对获得的各个通道的图像进行线性拉伸,合并RGB就可的处理后的图像。

算法实现(MATLAB):

close all; clear all; clc
I = imread('E:\水下目标识别\chinamm2019uw_train\jpegimage\000000.jpg');
I_r = double(I(:,:,1));
I_g = double(I(:,:,2));
I_b = double(I(:,:,3));

I_r_log = log(I_r+1);
I_g_log = log(I_g+1);
I_b_log = log(I_b+1);

Rfft1 = fft2(I_r);
Gfft1 = fft2(I_g);
Bfft1 = fft2(I_b);

%  SSR算法
[m,n] = size(I_r);
sigma = 200;
f = fspecial('gaussian', [m, n], sigma);
efft1 = fft2(double(f));

D_r = ifft2(Rfft1.*efft1);
D_g = ifft2(Gfft1.*efft1);
D_b = ifft2(Bfft1.*efft1);

D_r_log = log(D_r + 1);
D_g_log = log(D_g + 1);
D_b_log = log(D_b + 1);

R = I_r_log - D_r_log;
G = I_g_log - D_g_log;
B = I_b_log - D_b_log;

R = exp(R);
MIN = min(min(R)); 
MAX = max(max(R));
R = (R - MIN)/(MAX - MIN);
R = adapthisteq(R);
G = exp(G);
MIN = min(min(G)); 
MAX = max(max(G));
G = (G - MIN)/(MAX - MIN);
G = adapthisteq(G);
B = exp(B);
MIN = min(min(B)); 
MAX = max(max(B));
B = (B - MIN)/(MAX - MIN);
B = adapthisteq(B);

J = cat(3, R, G, B);

figure;
subplot(121);imshow(I);
subplot(122);imshow(J);
figure;imshow(J)

结果:
在这里插入图片描述

多尺度Retinex(MSR):

由于SSR需要在颜色保真度和细节保持上追求一个完美的平衡,而这个平衡不宜实现。MSR的提出就是解决该问题,它是针对一幅图像在不同尺度上利用高斯滤波处理,然后将多个尺度下的图像进行加权叠加。
它其实就是 SSR 的一中叠加操作。
代码:


close all; clear all; clc
I = imread('E:\水下目标识别\chinamm2019uw_train\jpegimage\000000.jpg');
I_r = double(I(:,:,1));
I_g = double(I(:,:,2));
I_b = double(I(:,:,3));

I_r_log = log(I_r+1);
I_g_log = log(I_g+1);
I_b_log = log(I_b+1);

Rfft1 = fft2(I_r);
Gfft1 = fft2(I_g);
Bfft1 = fft2(I_b);[m,n] = size(I_r);
sigma1 = 15;
sigma2 = 80;
sigma3 = 200;
f1 = fspecial('gaussian', [m, n], sigma1);
f2 = fspecial('gaussian', [m, n], sigma2);
f3 = fspecial('gaussian', [m, n], sigma3);
efft1 = fft2(double(f1));
efft2 = fft2(double(f2));
efft3 = fft2(double(f3));

D_r1 = ifft2(Rfft1.*efft1);
D_g1 = ifft2(Gfft1.*efft1);
D_b1 = ifft2(Bfft1.*efft1);
D_r_log1 = log(D_r1 + 1);
D_g_log1 = log(D_g1 + 1);
D_b_log1 = log(D_b1 + 1);
R1 = I_r_log - D_r_log1;
G1 = I_g_log - D_g_log1;
B1 = I_b_log - D_b_log1;

D_r2 = ifft2(Rfft1.*efft2);
D_g2 = ifft2(Gfft1.*efft2);
D_b2 = ifft2(Bfft1.*efft2);
D_r_log2 = log(D_r2 + 1);
D_g_log2 = log(D_g2 + 1);
D_b_log2 = log(D_b2 + 1);
R2 = I_r_log - D_r_log2;
G2 = I_g_log - D_g_log2;
B2 = I_b_log - D_b_log2;

D_r3 = ifft2(Rfft1.*efft3);
D_g3 = ifft2(Gfft1.*efft3);
D_b3 = ifft2(Bfft1.*efft3);
D_r_log3 = log(D_r3 + 1);
D_g_log3 = log(D_g3 + 1);
D_b_log3 = log(D_b3 + 1);
R3 = I_r_log - D_r_log3;
G3 = I_g_log - D_g_log3;
B3 = I_b_log - D_b_log3;

R = 0.1*R1 + 0.4*R2 + 0.5*R3;
G = 0.1*G1 + 0.4*G2 + 0.5*G3;
B = 0.1*B1 + 0.4*B2 + 0.5*B3;

R = exp(R);
MIN = min(min(R)); 
MAX = max(max(R));
R = (R - MIN)/(MAX - MIN);
R = adapthisteq(R);
G = exp(G);
MIN = min(min(G)); 
MAX = max(max(G));
G = (G - MIN)/(MAX - MIN);
G = adapthisteq(G);
B = exp(B);
MIN = min(min(B)); 
MAX = max(max(B));
B = (B - MIN)/(MAX - MIN);
B = adapthisteq(B);

J = cat(3, R, G, B);

figure;
subplot(121);imshow(I);
subplot(122);imshow(J,[]);

figure;imshow(J)

结果:
在这里插入图片描述

带颜色恢复的多尺度Retinex(MSRCR):

由于在采用SSR和MSR的过程会产生色差,MSRCR将MSR得到的结果按照一定的比例进行调整以求恢复原来的比例数值,具体是通过引入颜色恢复因子C,来弥补由于图像局部区域对比度增强而导致的图像颜色失真的缺陷。
代码:

% close all; clear all; clc
% I = imread('E:\水下目标识别\chinamm2019uw_train\jpegimage\000000.jpg');
% figure;imshow(I)
% I_r = I(:,:,1);
% I_g = I(:,:,2);
% I_b = I(:,:,3);
% figure;
% subplot(131);imshow(I_r);
% subplot(132);imshow(I_g);
% subplot(133);imshow(I_b);
% 
% I_r = double(I_r);
% I_g = double(I_g);
% I_b = double(I_b);
% 
% [m, n] = size(I_r);
% Rlog = log(I_r+1);
% Rfft2 = fft2(I_r);
% 
% Glog = log(I_g+1);
% Gfft2 = fft2(I_g);
% 
% Blog = log(I_b+1);
% Bfft2 = fft2(I_b);
% 
% sigma1 = 128;
% f = fspecial('gaussian', [m,n], sigma1);
% Efft1 = fft2(double(f));
% 
% DI_r = Rfft2.* Efft1;
% DR = ifft2(DI_r);
% DRlog = log(DR+1);
% Rr1 = Rlog - DRlog;
% figure;imshow(Rr1);
% 
% DI_g = Gfft2.* Efft1;
% DG = ifft2(DI_g);
% DGlog = log(DG+1);
% Gg1 = Glog - DGlog;
% figure;imshow(Gg1);
% 
% DI_b = Bfft2.* Efft1;
% DB = ifft2(DI_b);
% DBlog = log(DB+1);
% Bb1 = Blog - DBlog;
% figure;imshow(Bb1);
% 
% Rr1 = Rr1 .* 255/max(max(Rr1));
% Gg1 = Gg1 .* 255/max(max(Gg1));
% Bb1 = Bb1 .* 255/max(max(Bb1));
% 
% II(:,:,1) = Rr1;
% II(:,:,2) = Gg1;
% II(:,:,3) = Bb1;
% figure;
% subplot(121);imshow(I);
% subplot(122);imshow(II)

I = imread('E:\水下目标识别\chinamm2019uw_train\jpegimage\000000.jpg');
figure;imshow(I)

% 提取RGB
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);

result = cat(3, EXPRr, EXPGg, EXPBb);  
figure;
subplot(121), imshow(I);
subplot(122), imshow(result);
figure;imshow(result)

结果:
在这里插入图片描述
上述是Retinex的一些列算法实现。

Retinex算法是一种用于图像增强的经典算法,可以在去除图像模糊的同时提高图像的亮度、对比度等。下面是一种基于MATLAB实现的Retinex图像去模糊的方法: 1. 读取图像 ```matlab img = imread('image.jpg'); ``` 2. 对图像进行高斯模糊 ```matlab sigma = 20; % 高斯核的标准差 ksize = ceil(sigma*3)*2+1; % 高斯核的大小 h = fspecial('gaussian', ksize, sigma); % 生成高斯核 img_blurred = imfilter(img, h, 'replicate'); % 对图像进行高斯模糊 ``` 3. 计算图像的对数灰度值 ```matlab img_log = log(double(img_blurred)+1); % 对图像进行对数变换 ``` 4. 分解图像的亮度和细节 ```matlab sigma_l = 10; % 亮度分量的高斯核标准差 ksize_l = ceil(sigma_l*3)*2+1; % 亮度分量的高斯核大小 h_l = fspecial('gaussian', ksize_l, sigma_l); % 生成亮度分量的高斯核 img_l = imfilter(img_log, h_l, 'replicate'); % 计算亮度分量 img_d = img_log - img_l; % 计算细节分量 ``` 5. 对亮度分量进行伽马校正 ```matlab gamma = 0.5; % 伽马校正参数 img_l_gamma = exp(img_l).^gamma; % 对亮度分量进行伽马校正 ``` 6. 对细节分量进行增强 ```matlab sigma_d = 0.5; % 细节分量的高斯核标准差 ksize_d = ceil(sigma_d*3)*2+1; % 细节分量的高斯核大小 h_d = fspecial('gaussian', ksize_d, sigma_d); % 生成细节分量的高斯核 img_d_enhanced = imfilter(img_d, h_d, 'replicate'); % 对细节分量进行高斯滤波 img_d_enhanced = imadjust(img_d_enhanced); % 对细节分量进行直方图均衡化 ``` 7. 将亮度和细节分量相乘得到增强后的图像 ```matlab img_enhanced = img_l_gamma .* exp(img_d_enhanced); % 将亮度和细节分量相乘得到增强后的图像 img_enhanced = uint8(img_enhanced); % 将图像转换为8位无符号整型 ``` 以上就是基于MATLAB的Retinex图像去模糊的实现方法,您可以根据实际情况调整算法中的参数来得到更好的效果。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值