2015-03-30 3 views
2

L'intention est d'estimer dans une fenêtre coulissante [3 3]. 0.5 * [(A (i) -A (5))^2] est calculé où a (i) est les pixels autour du pixel central a (5).Fenêtre coulissante pour matlab

La moyenne de chacune de ces 8 différences de demi-carré est stockée dans l'emplacement du pixel central.

Pour résoudre ce problème, conv2 et nlfilter ont été utilisés sur une matrice d'exemple d'apprentissage comme suit.

clc; 
close all; 
clear all; 
A = [1 2 3 4 5 6;5 4 6 3 2 1;2 3 2 1 4 5]; 
kernel = [-1 -1 -1; -1 8 -1; -1 -1 -1]; 
outputImage = conv2(A, kernel); 
fun = @(x) mean(x(:)); 
B= nlfilter (outputImage,[3 3],fun); 

L'idée initiale était de calculer la différence et de la stocker dans l'emplacement des pixels au lieu du pixel central. Ensuite, utilisez une fenêtre glissante pour prendre en compte ces différences et remplacer le pixel central.

Il était évident que ma logique était défectueuse.

Bien que j'ai été capable de calculer la différence (j'ai d'abord essayé de voir la simple différence était possible pour moi) j'ai dû faire face à des données étant écrasées. de plus, cette méthode créera une matrice plus grande que l'original, ce qui est également faux.

Répondre

2

La fonction mean et le noyau que vous utilisez sont linéaires et ne représentent pas l'opération non linéaire que vous essayez d'obtenir.

Une façon d'utiliser conv et mean est en calculant les 8 différences que différents canaux de sortie

ker = cell(1,8); 
for ii=1:8 
    ker{ii} = zeros(3); 
    ker{ii}(2,2) = 1; %// for a(5) 
    if ii < 5 
     ker{ii}(ii) = -1; 
    else 
     ker{ii}(ii+1) = -1; 
    end 
end 
interim = zeros([size(A,1) size(A,2), numel(ker)]); % allocate room for intermidiate results 
for ii=1:numel(ker) 
    interim(:,:,ii) = conv2(A, ker{ii}, 'same'); %//'same' takes care of output size for you 
end 

maintenant interim détient chacun des différents a(5)-a(i) nous sommes prêts pour l'opération non linéaire

interim = interim.^2; 
B = 0.5 * interim; 
+0

Merci! Je n'ai pas envisagé d'utiliser une variable intérimaire pour stocker des données dans des plans distincts. J'ai une question de suivi si je peux si la non-linéarité a été adressée la moyenne des différences de demi-carré devrait remplacer les pixels centraux. Puisque les noyaux calculent des différences simples dans chaque plan, l'indexation pour remplacer les pixels centraux avec la moyenne devient-elle beaucoup plus compliquée? –

+0

@BharathS si vous voulez seulement remplacer 'a (5)' par la somme sur tout 'i':' 0.5 * (a (5) - a (i))^2' alors 'B = somme (intérimaire, 3) et 'c'est tout! – Shai

+1

Merci! J'aimerais pouvoir voter mais nouveau sur le site. –