提升小波与方向提升小波
标签(空格分隔): 算法学习
1、第二代提升小波
……(留在日后填写,原理以及实现细节,这里先直接贴程序吧)
2、自适应方向提升小波
2.1main函数
clear all;close all;clc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%此文件主要实现一种简单的自适应方向小波去噪
%%基于第二代提升小波的预测和更新两个步骤
%%%%%% 调参数
%%%%%%
img_ori = double(imread('test.bmp'));%读入图像
if size(img_ori,3) == 3;
img_ori = rgb2gray(img_ori);
end;
[img_rows,img_cols] = size(img_ori);
var_noise = 20;%噪声方差
img_noise = addNoise(img_ori,var_noise);%给图像加入高斯噪声
tic
%正变换
[LL,LH,HL,HH,dir_mat11,dir_mat12] = ADL97(img_noise,1);
[LL2,LH2,HL2,HH2,dir_mat21,dir_mat22] = ADL97(LL,2);
[LL3,LH3,HL3,HH3,dir_mat31,dir_mat32] = ADL97(LL2,3);
%系数处理
thr=sqrt(1*mean(abs(HH(:)))/0.6745)*sqrt(2*log(img_rows*img_cols));%%阈值计算
[LH,HL,HH]=softDe(LH,HL,HH,thr,1);
[LH2,HL2,HH2]=softDe(LH2,HL2,HH2,thr,2);
[LH3,HL3,HH3]=softDe(LH3,HL3,HH3,thr,3);
%反变换
LL2 = IADL97(LL3,LH3,HL3,HH3,dir_mat31,dir_mat32);
LL = IADL97(LL2,LH2,HL2,HH2,dir_mat21,dir_mat22);
out_img = IADL97(LL,LH,HL,HH,dir_mat11,dir_mat12);
toc
nois_PSNR = calcuPSNR(double(img_ori),double(img_noise));
recons_PSNR = calcuPSNR(double(img_ori),double(out_img));
imwrite(uint8(out_img),'recons.bmp');
2.2 ADL97正变换
function [LL,LH,HL,HH,dir_mat,dir_mat2] = ADL97(img,decom_level)
%%% 输入:待处理图像,分解级数
%%% 输出:小波分解系数LL,LH,HL,HH
%%% 提升小波系数: alfa: -1.586134342
%%% beta: -0.052980118
%%% gamma: 0.0882911075
%%% delta:0.443506852
%%% coef:1.230174105
%设置提升系数
alfa = -1.586134342;
beta = -0.052980118;
gamma = 0.882911075;
delta = 0.443506852;
coef = 1.230174105;
%得到方向矩阵,大小与输入图像大小一致
dir_mat = getDirMat(img,1,decom_level);
% dir_mat = getDirMat2(img,1);
%% 接下来是97二代提升小波核心步骤
%%%%%%%%%%%%%%%%%%============行变换 flag ==1 =================%%%%%%%%%%%
flag = 1;
%预测 step = 1
step =1;
img = singleLifting(img,flag,step,alfa,dir_mat);
%更新 step = 2
step =2;
img = singleLifting(img,flag,step,beta,dir_mat);
%预测 step = 1
step =1;
img = singleLifting(img,flag,step,gamma,dir_mat);
%更新 step = 2
step =2;
img = singleLifting(img,flag,step,delta,dir_mat);
%提取高频分量
high_freq = img(1:2:end,:)/coef;
%提取低频分量
low_freq = img(2:2:end,:)*coef;
%% 将提取到的高频分量再次进行上述步骤,得到HL,HH
%%%%%%%%%%%%%%%%%%============列变换 flag ==2 =================%%%%%%%%%%%
flag = 2;
%预测 step = 1
step =1;
high_freq =singleLifting(high_freq,flag,step,alfa);
%更新 step = 2
step =2;
high_freq = singleLifting(high_freq,flag,step,beta);
%预测 step = 1
step =1;
high_freq=singleLifting(high_freq,flag,step,gamma);
%更新 step = 2
step =2;
high_freq=singleLifting(high_freq,flag,step,delta);
%提取高频分量,HH
HH = high_freq(:,1:2:end)/coef;
%提取低频分量
HL = high_freq(:,2:2:end)*coef;
%% 再做一次方向预测,得到LL,LH;
dir_mat2 = getDirMat(low_freq,2,decom_level);
% dir_mat2 = getDirMat2(img,1);
%预测 step = 1
step =1;
low_freq = singleLifting(low_freq,flag,step,alfa,dir_mat2);
%更新 step = 2
step =2;
low_freq = singleLifting(low_freq,flag,step,beta,dir_mat2);
%预测 step = 1
step =1;
low_freq = singleLifting(low_freq,flag,step,gamma,dir_mat2);
%更新 step = 2
step =2;
low_freq = singleLifting(low_freq,flag,step,delta,dir_mat2);
%提取高频分量,LH
LH = low_freq(:,1:2:end)/coef;
LL = low_freq(:,2:2:end)*coef;
end
2.3方向预测
function dir_mat = getDirMat(img,flag,decom_level)
%%% 输入:
%%% img :待处理图像 double
%%% flag: 处理步骤 flag==1, 当前处理为行操作 flag== 2, 当前处理为列操作
%%% decom_levle:小波分解级数
%%% blk_size: 窗内所有分解采用一个方向 初始定为16
%%% 输出:
%%% dir_mat = 方向矩阵,大小与输入图像大小相同
blk_size =32;
win_size = blk_size/(2^(decom_level -1 ));%分块大小
%将整个图像分成大小为win*win的块进行计算
blk_img = getBlock(img,win_size);
[rows,cols] = size(blk_img);
for i = 1: rows
for j =1:cols
dir_mat(i,j)=dir_est(blk_img{i,j},flag);
end
end
[m,n] =size(dir_mat);
for i =1:m