1.問題の説明:
ウェーブレット領域の隠れマルコフツリーモデルに基づく画像ノイズ除去法。隠れマルコフモデル(HMM)は、隠れマルコフ連鎖から観測シーケンスをランダムに生成するプロセスを記述し、生成モデルに属します。HMMは、時系列に関する確率モデルであり、隠れマルコフ連鎖から観測不可能な状態の乱数列(状態シーケンス)をランダムに生成し、各状態から観測の乱数列(観測シーケンス)を生成するプロセスを記述します。
2.プログラムの一部:
M =サイズ(ES、1);
P =サイズ(w、1);
level = log2(P);
BE = zeros(M、P、P);
BEP = zeros(M、P、P);
BER = zeros(M、P、P);
AL = zeros(M、P、P);
P1 = zeros(M、P、P);
P2 = zeros(M、M、P、P);
%UPステップ
wtmp = repmat(w、[1 1 M]);
wtmp = shiftdim(wtmp、2);
si = 2 ^(レベル-1)+1; ei = P; sj = 2 ^(レベル-1)+1; ej = P;
gtmp = gauss(wtmp、MU、SI);
scale = repmat(mean(gtmp、1)、[M 1 1]);
BE(:、si:ei、sj:ej)= gtmp(:、si:ei、sj:ej)./ scale(:、si:ei、sj:ej);
%clear MUtmp SItmp;
k =レベルの場合:-1:2
J = 2 ^(k-1); J2 = J * J; si = J + 1; ei = 2 * J; sj = J + 1; ej = 2 * J;
EStmp = reshape(ES(:、:、si:ei、sj:ej)、M、M * J2);
M == 2の場合
%%%%%% M = 2の場合、以下の方が高速です
BEtmp = zeros(M、M * J2);
BEtmp(:、1:M:(M * J2))= reshape(BE(:、si:ei、sj:ej)、M、J2);
BEtmp(:、2:M:(M * J2))= BEtmp(:、1:M:(M * J2));
else
%一般的なM(2に等しくない)の場合、次を使用します
%
BEtmp = zeros(M、M * 4 ^(k-1));
m = 1:Mの場合
BEtmp(:、m:M:(M * 4 ^(k-1)))= reshape(BE(:、si:ei、sj:ej、:)、M、4 ^(k -1));
終わり;
終わり;
BEtmp = reshape(EStmp。* BEtmp、[MMJJ]);
BEP(:、si:ei、sj:ej)= squeeze(sum(BEtmp、1));
sni = J / 2 + 1; eni = si-1; snj = J / 2 + 1; enj = sj-1;
%ベータ子行列の
構築BCtmp = BEP(:、si:2:ei、sj:2:ej);
BCtmp = BCtmp。* BEP(:、si + 1:2:ei、sj:2:ej);
BCtmp = BCtmp。* BEP(:、si:2:ei、sj + 1:2:ej);
BCtmp = BCtmp。* BEP(:、si + 1:2:ei、sj + 1:2:ej);
scaletmp = repmat(mean(BCtmp、1)、[M 1 1]);
scale(:、sni:eni、snj:enj)= scale(:、sni:eni、snj:enj)。* scaletmp;
BE(:、sni:eni、snj:enj)= gtmp(:、sni:eni、snj:enj)./ scale(:、sni:eni、snj:enj)。* BCtmp;
%構成BE(:、pai(i)、paj(j)、dindex)行列
Btmp =ゼロ(M、J、J);
Btmp(:、1:2:J、1:2:J)= BE(:、sni:eni、snj:engine);
Btmp(:、2:2:J、1:2:J)= BE(:、sni:eni、snj:engine);
Btmp(:、1:2:J、2:2:J)= BE(:、sni:eni、snj:engine);
Btmp(:、2:2:J、2:2:J)= BE(:、sni:eni、snj:engine);
BER(:、si:ei、sj:ej)= Btmp。/ BEP(:、si:ei、sj:ej);
終わり;
EStmp BEtmp BCtmpBtmpをクリアします。
%DOWNステップ
%initialize
AL(:、2,2)= PS(:、2,2);
k = 2の場合:レベル
J = 2 ^(k-1); J2 = J * J;
si = J + 1; ei = 2 * J; sj = J + 1; ej = 2 * J;
sni = J / 2 + 1; eni = si-1; snj = J / 2 + 1; エンジン= sj-1;
Atmp =ゼロ(M、J、J);
Atmp(:、1:2:J、1:2:J)= AL(:、sni:eni、snj:エンジン);
Atmp(:、2:2:J、1:2:J)= AL(:、sni:eni、snj:エンジン);
Atmp(:、1:2:J、2:2:J)= AL(:、sni:eni、snj:エンジン);
Atmp(:、2:2:J、2:2:J)= AL(:、sni:eni、snj:エンジン);
Atmp = repmat(reshape(Atmp。* BER(:、si:ei、sj:ej)、1、M * J2)、[M 1]);
EStmp = reshape(ES(:、:、si:ei、sj:ej)、M、M * J2);
ALtmp = reshape(EStmp。* Atmp、[MMJJ]);
AL(:、si:ei、sj:ej)= squeeze(sum(ALtmp、2));
終わり;
クリアAtmpEStmp ALtmp;
%
k = 2の確率を計算します:レベル
J = 2 ^(k-1); J2 = J * J;
si = J + 1; ei = 2 * J; sj = J + 1; ej = 2 * J;
sni = J / 2 + 1; eni = si-1; snj = J / 2 + 1; エンジン= sj-1;
temp = repmat(sum(AL(:、si:ei、sj:ej)。* BE(:、si:ei、sj:ej)、1)、[M 1]);
P1(:、si:ei、sj:ej)= AL(:、si:ei、sj:ej)。* BE(:、si:ei、sj:ej)./ temp;
%計算P2
M == 2
%の場合M = 2の場合、以下の方が速い可能性があります
BEtmp = zeros(M、M * J2);
BEtmp(:、1:M:(M * J2))= reshape(BE(:、si:ei、sj:ej)、M、J2);
BEtmp(:、2:M:(M * J2))= BEtmp(:、1:M:(M * J2));
else
%一般的なM(2に等しくない)の場合、次の
BEtmp = zeros(M、M * J2);を使用します。
m = 1:Mの場合
BEtmp(:、m:M:(M * J2))= reshape(BE(:、si:ei、sj:ej、:)、M、J2);
終わり;
終わり;
BEtmp = reshape(BEtmp、[MMJJ]);
EStmp = ES(:、:、si:ei、sj:ej);
Atmp = zeros(M、J、J);
Atmp(:、1:2:J、1:2:J)= AL(:、sni:eni、snj:enj);
Atmp(:、2:2:J、1:2:J)= AL(:、sni:eni、snj:enj);
Atmp(:、1:2:J、2:2:J)= AL(:、sni:eni、snj:enj);
Atmp(:、2:2:J、2:2:J)= AL(:、sni:eni、snj:enj);
Atmp = repmat(reshape(Atmp、1、M * J2)、[M 1]);
Atmp = reshape(Atmp、[MMJJ]);
BERtmp = repmat(reshape(BER(:、si:ei、sj:ej)、1、M * J2)、[M 1]);
BERtmp = reshape(BERtmp、[MMJJ]);
temp = repmat(reshape(temp、1、M * J2)、[M 1]);
temp = reshape(temp、[MMJJ]);
P2(:、:、si:ei、sj:ej)= BEtmp。* EStmp。* Atmp。* BERtmp。/ temp;
終わり;
P1(:、2,2)= AL(:、2,2)。* BE(:、2,2)./ repmat(sum(AL(:、2,2)。* BE(:、2,2 )、1)、[M 1 1]);
clear temp BEtmp EStmp Atmp BERtmp;
%Mステップ
PS(:、2,2)= P1(:、2,2);
k = 2の場合:レベル
J = 2 ^(k-1); J2 = J * J;
si = J + 1; ei = 2 * J; sj = J + 1; ej = 2 * J;
sni = J / 2 + 1; eni = si-1; snj = J / 2 + 1; エンジン= sj-1;
pstmp = sum(sum(P1(:、si:ei、sj:ej)、3)、2)/ J2;
pstmp = pstmp。*(pstmp> 1st-4)+ 1st-4 *(pstmp <= 1st-4);
PS(:、si:ei、sj:ej)= repmat(pstmp、[1 JJ]);
if zm == 0
%平均密度がゼロの場合はMUを更新しない
mutmp = sum(sum(wtmp(:、si:ei、sj:ej)。* P1(:、si:ei、sj:ej)、3)、 2)/ J2;
MU(:、si:ei、sj:ej)= repmat(mutmp、[1 JJ])./ PS(:、si:ei、sj:ej);
終わり;
sitmp = sum(sum((wtmp(:、si:ei、sj:ej))-MU(:、si:ei、sj:ej))。^ 2. * P1(:、si:ei、sj:ej )、3)、2)/ J2;
SI(:、si:ei、sj:ej)= repmat(sitmp、[1 JJ])./ PS(:、si:ei、sj:ej);
estmp = sum(sum(P2(:、:、si:ei、sj:ej)、4)、3)/ J2;
ptmp = [PS(:、sni、snj) '; PS(:、sni、snj) '];
ES(:、:、si:ei、sj:ej)= repmat(estmp、[1 1 JJ])./ repmat(ptmp、[1 1 JJ]);
終わり; %k
ESN = ES; PSN = PS; MUN = MU; INS = SI;
3.シミュレーションの結論:
D-13