Eliminación de ruido mediante filtro de partículas en matlab
-
20-12-2019 - |
Pregunta
Estoy intentando eliminar el ruido de una imagen usando un filtro de partículas.No es una implementación completa del filtro de partículas, solo estoy usando una parte del mismo.Soy nuevo en matlab y recibo el siguiente error
"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)];"
Intenté depurar, pero no puedo encontrar por qué el código falla.
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');
Solución
El error significa que i
o j
es mayor que el número de filas o columnas en EImg
.
La razón por la que esto sucede es que estás sobrescribiendo EImg
en cada iteración del bucle, en la línea: EImg=mean(X_Particle)
.Esto hace EImg
una matriz de diferente tamaño, por lo que no tendrá r
filas y c
columnas más.No puedo decirte cómo solucionar el problema porque no sé qué hace el código, pero es por eso que ves el error.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow