最近学习基于暗通道的图像去雾技术,遇到了一些问题,我将rgb图像转入YCbCr空间进行暗通道的计算
但是一直报如下错误,不知道如何修改,有无知道的人指导一下,无比感谢。
```c
function [dehaze] = dehaze(img_name)
% DEHAZE - 暗通道去雾算法
% img_name: 输入图像
% dehaze: 去雾后的图像
I = double(img_name)/255;
w0=0.95;%去雾系数
[h,w,c] = size(I); %获取图像大小
%计算暗通道
% 将输入图像从RGB颜色空间转换为YCbCr颜色空间
I_ycbcr = rgb2ycbcr(I);
% 计算Y通道的暗通道
win_dark = zeros(h,w); %初始化暗影通道图像
for i=1:h
for j=1:w
%计算当前像素周围的最小值
win_dark(i,j) = min(I_ycbcr(max(1,i-2):min(h-1,i+2),max(1,j-2):min(w-1,j+2),1));
end
end
%使用带权重的滤波器平滑暗通道图像
win_dark = imgaussfilt(win_dark, 5, 'FilterSize', 15);
%将暗通道图像映射到[0,1]范围
win_dark = (win_dark - min(win_dark(:))) / (max(win_dark(:)) - min(win_dark(:)));
%计算输出图像
J = zeros(h,w,c);
for i=1:c
if i == 1 % Y通道
J(:,:,i) = I_ycbcr(:,:,i) - w0*win_dark;
else % Cb和Cr通道
J(:,:,i) = I_ycbcr(:,:,i);
end
end
% 将输出图像从YCbCr颜色空间转换回RGB颜色空间
J = ycbcr2rgb(J);
%计算大气亮度A
dark_channel = win_dark;
A = max(max(dark_channel));
[i0,j0] = find(dark_channel==A);
i = i0(1);
j = j0(1);
A = mean(I(i,j,:));
%计算透射率t(x)
transmission = 1-w0*win_dark/A; %透射率预估
gray_I = I(:,:,3); %这里gray_I可以是RGB图像中任何一个通道
p = transmission; %透射率图
r = 50;
eps = 10^-3;
transmission_filter = guidedfilter(gray_I,p,r,eps); %用guided filter对trasmission map做soft matting获得更为精细的透射率图
t0=0.1;%设置阈值
t1 = max(t0,transmission_filter);
%无雾图像恢复
dehaze = zeros(h,w,c);
for i=1:c
for j=1:h
for l=1:w
dehaze(j,l,i)=(I(j,l,i)-A)/t1(j,l)+A;
end
end
end
%显示图像
figure;
subplot(2,2,1); imshow(I); title('原图');
subplot(2,2,2); imshow(win_dark); title('暗通道');
subplot(2,2,3); imshow(t1); title('透射率图');
subplot(2,2,4); imshow(dehaze); title('去雾后的图像');
end
万分感谢