2017-09-25 6 views
1

Voici le code que je utilise:Pourquoi ai-je des cadres noirs dans cette image de montage?

function [filterResponses] = extractFilterResponses(img, filterBank) 
% Extract filter responses for the given image. 
% Inputs: 
% img:    a 3-channel RGB image with width W and height H 
% filterBank:   a cell array of N filters 
% Outputs: 
% filterResponses: a W x H x N*3 matrix of filter responses 

    if (~isa(img, 'double')) 
     img = double(img); 
    end 
    if (size(img, 3) == 1) 
     img = repmat(img, [1 1 3]); 
    end 
    img = img./255; 

    [L, a, b] = RGB2Lab(img(:, :, 1), img(:, :, 2), img(:, :, 3)); 
    filterResponses = zeros(size(img,1), size(img, 2), length(filterBank)*3); 

    for k = 1:length(filterBank) 

     L = imfilter(L, filterBank{k}, 'same', 'conv', 'replicate'); 
     filterResponses(:, :, k*3-2) = L; 

     a = imfilter(a, filterBank{k}, 'same', 'conv', 'replicate'); 
     filterResponses(:, :, k*3-1) = a; 

     b = imfilter(b, filterBank{k}, 'same', 'conv', 'replicate'); 
     filterResponses(:, :, k*3) = b; 

    end 

end 

La fonction ci-dessus applique un filtre à la fois d'un ensemble de 20 filtres sur chacun des L * a * b couches de l'image RVB donnée.

Le script suivant est utilisé pour exécuter la fonction:

img = imread('sun_advbapyfkehgemjf.jpg'); 
filterBank = createFilterBank(); 
filteredImg = extractFilterResponses(img, filterBank); 
filteredImgCell = cell(20,1); 
for k = 1:length(filterBank) 

    filteredImgCell{k} = cat(3, filteredImg(:, :, k*3-2), filteredImg(:, :, k*3-1), ... 
          filteredImg(:, :, k*3)); 
    filteredImgCell{k} = repmat(filteredImgCell{k}, [1 1 1 1]); 
end 

montage(cat(4, filteredImgCell{:}), 'size', [4 5]); 

Ce script concatène L * couches * b de la matrice filterResponses et repmats ensuite l'image pour ajouter une quatrième dimension à utiliser dans la fonction de montage et est stocké dans une cellule. La cellule est utilisée dans la fonction de montage.

La sortie que je reçois est comme suit:

enter image description here

Pourquoi le reste des cadres apparaissent en noir? Je sais qu'ils sont là parce que si je multiplie chaque image avec dis 10, je peux voir quelques images de plus. Donc, doit être quelque chose à voir avec la normalisation?

Répondre

3

Il y a deux questions possibles:

  • Vous ajoutez les filtres séquentiellement aux Lab composants, tels que l'itération k vous avez appliqué tous des filtres 1-k les . Cela va réduire continuellement l'amplitude de vos valeurs d'image, les amenant à devenir suffisamment petites pour que, lorsqu'elles sont ajoutées à un montage, les images de plus faible valeur semblent avoir très peu de plage dynamique et s'affichent simplement en noir.

    Je devine que vous souhaitez appliquer juste filtre k à l'itération k, par opposition à toutes les précédentes. Si oui, vous devriez changer votre code en boucle sur les points suivants:

    for k = 1:length(filterBank) 
    
        Lk = imfilter(L, filterBank{k}, 'same', 'conv', 'replicate'); 
        filterResponses(:, :, k*3-2) = Lk; 
    
        ak = imfilter(a, filterBank{k}, 'same', 'conv', 'replicate'); 
        filterResponses(:, :, k*3-1) = ak; 
    
        bk = imfilter(b, filterBank{k}, 'same', 'conv', 'replicate'); 
        filterResponses(:, :, k*3) = bk; 
    
    end 
    
  • sans savoir ce que l'image d'entrée exacte est, je vois un problème potentiel avec cette ligne particulière qui redimensionne les valeurs d'image:

    img = img./255; 
    

    Vous ne commencez pas par vérifier la plage de valeurs dans l'entrée. Si l'image d'entrée est déjà mise à l'échelle de 0 à 1, cela réduira l'amplitude maximale à une valeur beaucoup plus petite que 1. Comme précédemment, les applications répétées de vos filtres pourraient rendre les valeurs suffisamment petites pour être ajoutées à un montage, les images de plus faible valeur semblent avoir très peu de plage dynamique et apparaissent simplement en noir.

    Je suggère de vérifier la plage de l'image d'entrée et la mise à l'échelle en fonction de cela. Une option consiste à redimensionner l'image de sa propre valeur maximale pour donner une gamme résultante de 0 à 1:

    img = img./max(img(:)); 
    
+0

Ce fut probablement le premier cas, mais je corrige les deux cas. Je vous remercie! :) – xertzer