憨个睿 2023-06-03 15:22 采纳率: 25%
浏览 16

基于暗通道的图像去雾技术

最近学习基于暗通道的图像去雾技术,遇到了一些问题,我将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


img


万分感谢

  • 写回答

2条回答 默认 最新

  • 辞轩. 2023-06-05 10:18
    关注

    以下内容来自chat gpt:
    您好,根据您所提供的信息和错误提示,我猜测您遇到的问题可能是 Undefined function 'rgb2ycbcr' for input arguments of type 'double',这是因为该函数需要在Image Processing Toolbox中使用。您需要确保已经安装了Image Processing Toolbox。如果已安装但仍然出现此错误,请尝试使用 rgb2ntsc 函数替代 rgb2ycbcr 函数,并将 I_ycbcr 的第二维改为3,以输出Y、Cb和Cr通道。您的代码中的更改如下所示:

    % 将输入图像从RGB颜色空间转换为YCbCr颜色空间
    I_ycbcr = rgb2ntsc(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
    
    %计算输出图像
    J = zeros(h,w,c);
    for i=1:c
        if i == 1 % Y通道
            J(:,:,i) = I_ycbcr(:,:,1) - w0*win_dark; % 更改此处
        else % Cb和Cr通道
            J(:,:,i) = I_ycbcr(:,:,i+1); % 更改此处
        end
    end
    

    希望这能帮助您解决问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 6月3日

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值