%% MSR I=imread('C:\Users\sensen\Desktop\雾霾天气素材\1.jpg'); wu1 = rgb2gray(I); fr=I(:,:,1); fg=I(:,:,2); fb=I(:,:,3); mr=im2double(fr); mg=im2double(fg); mb=im2double(fb); n=141;%定义模板大小。 kid=141; n1=floor((n+1)/2);%确定中心 a1=60; %定义标准差(尺度) kid=60; for i=1:n for j=1:n b(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(a1*a1))/(pi*a1*a1); %高斯函数。 end end nr1=imfilter(mr,b,'conv','replicate'); ng1=imfilter(mg,b,'conv','replicate'); nb1=imfilter(mb,b,'conv','replicate');%卷积滤波。 ur1=log(nr1); ug1=log(ng1); ub1=log(nb1); tr1=log(mr+eps);tg1=log(mg+eps);tb1=log(mb+eps); yr1=(tr1-ur1)/3;yg1=(tg1-ug1)/3;yb1=(tb1-ub1)/3; a2=10; %定义标准差(尺度) for i=1:n for j=1:n a(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(a2*a2))/(pi*a2*a2); %高斯函数。 end end nr2=imfilter(mr,a,'conv','replicate'); ng2=imfilter(mg,a,'conv','replicate'); nb2=imfilter(mb,a,'conv','replicate');%卷积滤波。 ur2=log(nr2);ug2=log(ng2);ub2=log(nb2); tr2=log(mr+eps);tg2=log(mg+eps);tb2=log(mb+eps); yr2=(tr2-ur2)/3;yg2=(tg2-ug2)/3;yb2=(tb2-ub2)/3; a3=150; %定义标准差(尺度)kid=150; for i=1:n for j=1:n e(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(a3*a3))/(pi*a3*a3); %高斯函数。 end end nr3=imfilter(mr,e,'conv','replicate'); ng3=imfilter(mg,e,'conv','replicate'); nb3=imfilter(mb,e,'conv','replicate');%卷积滤波。 ur3=log(nr3);ug3=log(ng3);ub3=log(nb3); tr3=log(mr+eps);tg3=log(mg+eps);tb3=log(mb+eps); yr3=(tr3-ur3)/3;yg3=(tg3-ug3)/3;yb3=(tb3-ub3)/3; dr=yr1+yr2+yr3;dg=yg1+yg2+yg3;db=yb1+yb2+yb3; cr=im2uint8(dr); cg=im2uint8(dg); cb=im2uint8(db); z=cat(3,cr,cg,cb); wu2 = rgb2gray(z); figure(2) subplot(2,2,1), imshow(I);title('原图'); subplot(2,2,2), imshow(z);title('MSR去雾后'); subplot(2,2,3), imhist(wu1);title('原图-灰度'); subplot(2,2,4), imhist(wu2);title('SSR去雾后-灰度');
时间: 2023-12-09 21:04:57 浏览: 158
这段代码实现了 MSR (Multi-Scale Retinex) 算法的图像去雾,以下是代码的解释:
1. 读取输入图像,转换为灰度图像。
2. 对 R、G、B 三个通道分别进行 MSR 算法处理,得到三个去雾图像。
3. 将三个去雾图像合并,得到最终的去雾图像。
4. 显示原图、去雾图像以及两者的灰度直方图。
需要注意的是,这段代码中 MSR 算法的具体实现部分使用了高斯滤波器对图像进行平滑处理,并计算图像的对数值,以增强图像的细节。另外,这里的 MSR 算法实现只是一个简单的示例,实际应用中需要根据具体情况进行调整和优化。
同时,这段代码中 SSR 去雾后灰度直方图的绘制有误,应该是针对 MSR 去雾后的灰度直方图。可以将第 18 行的 `SSR去雾后` 改为 `MSR去雾后`。
以下是代码的修改建议:
```matlab
% 读取输入图像,转换为灰度图像
I = imread('C:\Users\sensen\Desktop\雾霾天气素材\1.jpg');
wu1 = rgb2gray(I);
% 分离 R、G、B 三个通道
fr = I(:,:,1);
fg = I(:,:,2);
fb = I(:,:,3);
% 对每个通道分别进行 MSR 算法处理,得到三个去雾图像
mr = im2double(fr);
mg = im2double(fg);
mb = im2double(fb);
n = 141; % 定义模板大小
kid = 141;
n1 = floor((n+1)/2); % 确定中心
a1 = 60; % 定义标准差(尺度)
for i = 1:n
for j = 1:n
b(i,j) = exp(-((i-n1)^2+(j-n1)^2)/(a1*a1))/(pi*a1*a1); % 高斯函数
end
end
nr1 = imfilter(mr, b, 'conv', 'replicate');
ng1 = imfilter(mg, b, 'conv', 'replicate');
nb1 = imfilter(mb, b, 'conv', 'replicate'); % 卷积滤波
ur1 = log(nr1);
ug1 = log(ng1);
ub1 = log(nb1);
tr1 = log(mr+eps);
tg1 = log(mg+eps);
tb1 = log(mb+eps);
yr1 = (tr1-ur1)/3;
yg1 = (tg1-ug1)/3;
yb1 = (tb1-ub1)/3;
a2 = 10; % 定义标准差(尺度)
for i = 1:n
for j = 1:n
a(i,j) = exp(-((i-n1)^2+(j-n1)^2)/(a2*a2))/(pi*a2*a2); % 高斯函数
end
end
nr2 = imfilter(mr, a, 'conv', 'replicate');
ng2 = imfilter(mg, a, 'conv', 'replicate');
nb2 = imfilter(mb, a, 'conv', 'replicate'); % 卷积滤波
ur2 = log(nr2);
ug2 = log(ng2);
ub2 = log(nb2);
tr2 = log(mr+eps);
tg2 = log(mg+eps);
tb2 = log(mb+eps);
yr2 = (tr2-ur2)/3;
yg2 = (tg2-ug2)/3;
yb2 = (tb2-ub2)/3;
a3 = 150; % 定义标准差(尺度)
kid = 150;
for i = 1:n
for j = 1:n
e(i,j) = exp(-((i-n1)^2+(j-n1)^2)/(a3*a3))/(pi*a3*a3); % 高斯函数
end
end
nr3 = imfilter(mr, e, 'conv', 'replicate');
ng3 = imfilter(mg, e, 'conv', 'replicate');
nb3 = imfilter(mb, e, 'conv', 'replicate'); % 卷积滤波
ur3 = log(nr3);
ug3 = log(ng3);
ub3 = log(nb3);
tr3 = log(mr+eps);
tg3 = log(mg+eps);
tb3 = log(mb+eps);
yr3 = (tr3-ur3)/3;
yg3 = (tg3-ug3)/3;
yb3 = (tb3-ub3)/3;
dr = yr1 + yr2 + yr3;
dg = yg1 + yg2 + yg3;
db = yb1 + yb2 + yb3;
% 将三个去雾图像合并
cr = im2uint8(dr);
cg = im2uint8(dg);
cb = im2uint8(db);
z = cat(3, cr, cg, cb);
wu2 = rgb2gray(z);
% 显示原图、去雾图像以及两者的灰度直方图
figure(2)
subplot(2,2,1), imshow(I); title('原图');
subplot(2,2,2), imshow(z); title('MSR去雾后');
subplot(2,2,3), imhist(wu1); title('原图-灰度');
subplot(2,2,4), imhist(wu2); title('MSR去雾后-灰度');
```
阅读全文