Rauschunterdrückung mit Partikelfilter in Matlab
-
20-12-2019 - |
Frage
Ich versuche, ein Bild mit einem Partikelfilter zu entrauschen.Es ist keine vollständige Implementierung des Partikelfilters, ich benutze nur einen Teil davon.Ich bin neu in Matlab und erhalte die folgende Fehlermeldung
"Index exceeds matrix dimensions.
Error in particle_filter_denoising (line 42)
Xkposeterior=[EImg(i,j-1);EImg(i-1,j);EImg(i-1,j-1)];"
Ich habe versucht zu debuggen, aber ich kann nicht herausfinden, warum der Code falsch läuft.
Img = imread('a.jpg');
Img= rgb2gray(Img);
Img=im2double(Img);
V =0.001;
clc;
x_N=V ;
x_R=V *2;
NImg=imnoise(Img,'gaussian',Var);
subplot(1,3,1);imshow(Img);title('Original Image');
subplot(1,3,2);imshow(NImg);title('Noisy Gaussian Image');
[r c] =size(Img);
EImg=zeros(r,c);
EImg(1,:) =Img(1,:);
EImg(:,1)=Img(:,1);
A=[0.35 0.35 0.3;0 1 0;0 0 1];
%Initial state
Xkposeterior=[EImg(2, 1);EImg(1,2);EImg(1,1)];
X_prior = A*Xkposeterior;
%particles
N=100;
X_Particle=[];
X_P_wi=[];
for i = 1:N
X_Particle(i) = X_prior(1) + sqrt(V) * randn;
end
%%Xkposeterior=[EImg(2,1);EImg(1,2);EImg(1,1)];
for i=2:r
for j=2:c
Zk=NImg(i,j);
Xkposeterior=[EImg(i,j-1);EImg(i-1,j);EImg(i-1,j-1)];
X_prior = A*Xkposeterior;
for k_particle=1:N
X_Particle(k_particle)=X_prior(1) + sqrt(V) * randn;
X_P_wi(k_particle)=(1/sqrt(2*pi*x_R)) * exp(-(Zk - X_Particle(k_particle))^2/(2*x_R));
end
X_P_wi = X_P_wi./sum(X_P_wi);
for m = 1 : N
X_Particle(m) = X_Particle(find(rand <= cumsum( X_P_wi),1));
end
EImg= mean(X_Particle);
end
end
subplot(1,3,3);imshow(EImg, []);title(' Particle Denoised Image');
Lösung
Der Fehler bedeutet, dass i
oder j
ist größer als die Anzahl der Zeilen oder Spalten in EImg
.
Der Grund, warum das passiert, ist, dass Sie überschreiben EImg
bei jeder Iteration der Schleife an der Zeile: EImg=mean(X_Particle)
.Das macht EImg
ein Array mit einer anderen Größe, und so wird es nicht haben r
zeilen und c
spalten mehr.Ich kann Ihnen nicht sagen, wie Sie das Problem beheben können, da ich nicht weiß, was der Code bewirkt, aber deshalb wird der Fehler angezeigt.