MATLAB程序:基于小波软阈值算法的图像去雾

代码如下:

clc; 
clear; 
close all;
%% 读入彩色图像
I = imread('含噪声图片\11.jpg');
%% 将图像转为双精度类型并对三个通道进行分离
In = im2double(I);
R = In(:, :, 1);
G = In(:, :, 2);
B = In(:, :, 3);
%% 小波去噪处理
% 选择小波类型和分解层数
wname = 'db4';
level = 5;
% 定义变量保存最终处理后的图像结果
R_wd = zeros(size(R));
G_wd = zeros(size(G));
B_wd = zeros(size(B));
% 遍历三个通道,进行小波去噪处理
for i = 1:3
    % 对当前通道进行小波分解
    [C, S] = wavedec2(In(:, :, i), level, wname);

    % 计算噪声方差和软阈值
    sigma = median(abs(C)) / 0.6745;
    thr = sigma * sqrt(2 * log(prod(size(In(:, :, i)))));

    % 对分解系数进行软阈值处理
    s = wthresh(C, 's', thr);

    % 对阈值化系数进行重构
    wd = waverec2(s, S, wname);

    % 将当前通道的处理结果保存到结果变量中
    if i == 1
        R_wd = wd;
    elseif i == 2
        G_wd = wd;
    else
        B_wd = wd;
    end
end

% 合并三个通道的处理结果,并将像素值调整到 [0, 1] 范围内
I_wd = cat(3, R_wd, G_wd, B_wd);
if size(I, 3) == 1 % 原图为灰度图像时
    I_wd = imadjust(I_wd);
else % 原图为彩色图像时
    I_gray = rgb2gray(I);
    I_wd = imadjust(I_wd, stretchlim(I_gray));
end

%% 显示原始图像和处理后的图像
figure;
subplot(1, 2, 1); imshow(I); title('原始图像');
subplot(1, 2, 2); imshow(I_wd); title('去噪图像');

运行效果展示:

 经过对比,图像中的雾气确实有一定的削弱。

PS:文中图片均为互联网图片;如有建议,欢迎指正。

猜你喜欢

转载自blog.csdn.net/qq_48302410/article/details/131352101