代码如下:
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:文中图片均为互联网图片;如有建议,欢迎指正。