2017-09-18 3 views
-1

Nous voulons exécuter notre banque de filtres sur une image en convolvant chaque filtre de la banque avec l'image et en concaténant toutes les réponses dans un vecteur pour chaque pixel. En utilisant la commande imfilter dans une boucle pour ce faire. Puisque les images couleur ont 3 canaux, nous allons avoir un total de 3F réponses de filtre par pixel si la banque de filtres est de taille F. N ensuite en sortie le résultat en tant qu'image de canal 3FSauvegarder la sortie de l'image 3 canaux après avoir utilisé une matrice de filtres avec collage de montage dans Matlab

final = []; 
for i = 1: length(filterBank) 
    x = imfilter(img, cell2mat(filterBank(i))); 
    imshow(x); 
    final(i)= [x] 
end 

où:

FilterBank est une cellule de 20X1; FilterBank (i) est 5X5 à double

img est un 230X307X3 uint8

finale est juste []

cela donne une erreur incompatibilité de dimension d'affectation indicés.

Alors j'ai essayé:

final(1:1:1) = x 

cela donne une erreur: Dans une affectation A (:) = B, le nombre d'éléments dans A et B doit être le même .

Je suis un noob Matlab mais veulent essentiellement pour enregistrer toutes les matrices 3d résultat sur l'application de chaque filtre à une seule matrice puis appliquer une commande de montage

Répondre

1

Vous essayez de définir un seul élément (final(i)) à la valeur d'une matrice. Utilisez plutôt des tableaux de cellules.

% pre-allocate for memory friendliness 
final = cell(size(filterBank)); 
% Loop using ii not i, as i=sqrt(-1) by default in MATLAB 
% Also using numel, as length is only the size in the largest direction 
for ii = 1:numel(filterBank) 
    % You say filterBank is a cell, so use {}, then shouldn't need cell2mat() 
    x = imfilter(img, filterBank{ii}); 
    imshow(x); 
    % Curly braces because we're indexing a cell now 
    final{ii} = x; 
end 

Sinon, vous pouvez utiliser une matrice 4D (3D pour x, 1D pour variable de boucle),

final = zeros([size(img), numel(filterBank)]); % pre-allocation instead of cell 
for ii = 1:numel(filterBank) 
    x = imfilter(img, filterBank{ii}); 
    imshow(x); 
    % assign to ii-th layer of 3D matrix 
    final(:,:,:,ii) = x; 
end