急求大神帮助 相对一幅图像进行降噪处理 求能把自适应滤波和小波软阈值降噪的matlab代码

2024-11-07 21:27:06
推荐回答(1个)
回答1:

自适应滤波
clear all
I1=imread('1.jpg');
I=rgb2gray(I1);
J=imnoise(I,'gaussian',0,0.05); %添加均值为0,方差为0.05的高斯噪声
K1=wiener2(J,[5,5]);
figure
imshow(J);
title('加入高斯噪声图像');
figure
imshow(K1);
title('5*5窗口自适应滤波');

小波软阈值
clear all
I1=imread('1.jpg');
I=rgb2gray(I1);
J=imnoise(I,'gaussian',0,0.05); %添加均值为0,方差为0.05的高斯噪声
[Cr, Sr] = wavedec2(J, 2, 'sym4');

thr= Donoho(J);

J_soft = wdenoise(xr, 'gbl', 's', thr, 'sym4', 2);

figure; imshow(J_soft);

/////////////////////////////////用到的函数
function thr = Donoho(x)
%用Donoho通用阈值公式计算阈值 x为要进行处理的图像
% thr = delta * sqrt( 2 * log(n))
% n为信号的长度或尺寸
% delta = MAD / 0.6745 -经验公式,其中MAD为小波分解后高子带系数的中值

n = prod( size(x) ); %图像尺寸

%计算delta
[C, S] = wavedec2(x, 1, 'db1'); %小波分解
d = C( prod( S(1,:) ) + 2 * prod( S(2,:) ) + 1 : end); %HH子带系数
delta = median( abs(d) ) / 0.6745;

%计算阈值
thr = delta * sqrt(2*log(n));

////////////////////////////////////用到的函数
function X = wdenoise(x, measure, sorh, thr, wname, n)
% 阈值去噪函数
% x为带噪声图像
% measure表示全局或局部
% sorh表示软硬阈值方法
% thr为阈值
% wname为小波函数名
% n为分解层次

[C, S] = wavedec2(x, n, wname); % 对图像进行小波分解
switch measure
case 'gbl' % 全局阈值方法
dcoef = C( prod(S(1, :)) + 1 : end); % 提取细节部分系数
switch sorh
case 'h' % 硬阈值
dcoef = dcoef .* (abs(dcoef) > thr);
case 's' % 软阈值
temp = abs(dcoef) - thr;
temp = (temp + abs(temp)) / 2;
dcoef = sign(dcoef) .* temp;
end
C( prod(S(1, :)) + 1 : end) = dcoef;

case 'lvd' % 局部阈值方法
for i = n:-1:1 % 每层单独处理
k = size(S,1) - i;
first = prod(S(1, :)) + ...
3 * sum(S(2:k-1, 1) .* S(2:k-1, 2)) + 1;
% 第i层细节系数的起始位置
last = first + 3*prod(S(k,:)) - 1; % 终止位置
dcoef = C(first : last); % 细节系数
switch sorh
case 'h' % 硬阈值
dcoef = dcoef .* (abs(dcoef) > thr(i));
case 's' % 软阈值
temp = abs(dcoef) - thr(i);
temp = (temp + abs(temp)) / 2;
dcoef = sign(dcoef) .* temp;
end
C(first:last) = dcoef;
end
end

X = waverec2(C, S, wname); % 重构图像