2012-11-11 2 views
1

Après avoir appliqué une opération de fenêtre glissante comme stdfilt(i, ones(5, 5)) à une image dans MATLAB, je voudrais définir les pixels de bordure, les pixels calculés en utilisant le remplissage, à NaN pour les marquer comme sans signification. Dans cet exemple, je définirais les deux lignes et les colonnes les plus externes à NaN. Étant donné une fenêtre M * M, comment définir cette bordure de (M - 1)/2 pixels de large à une valeur spécifique?Comment puis-je définir la valeur des pixels de bordure après l'application d'une opération de fenêtre glissante?

Répondre

0

Première trouvaille où sont NaN dans votre matrice. Supposons que votre nom d'image est A.

a = isnan(A); 

Cela va créer imm a avec 0 à des endroits qui sont des nombres, et 1 à des endroits qui sont NaN. Ensuite, trouver l'emplacement de Nan éléments tels que:

[x,y]=find(a==1); 

les remplacer ensuite avec une valeur V comme:

for i=1:length(x) 
    A(x(i),y(i)) = V; 
end 
+0

Je ne demande pas comment remplacer les NaN avec quelque chose, je demande comment remplacer les bords de l'image (pixels où stdfilt est calculée à partir des valeurs de pixels de faux) avec une valeur particulière. –

3

On suppose, r est la matrice (résultat de stdfilt). Voici un exemple comment assigner NaN aux frontières. En général, vous devez spécifier l'index correct.

>> r = rand(4) 

r = 

    0.8147 0.6324 0.9575 0.9572 
    0.9058 0.0975 0.9649 0.4854 
    0.1270 0.2785 0.1576 0.8003 
    0.9134 0.5469 0.9706 0.1419 

>> r([1, end], :) = nan 

r = 

     NaN  NaN  NaN  NaN 
    0.9058 0.0975 0.9649 0.4854 
    0.1270 0.2785 0.1576 0.8003 
     NaN  NaN  NaN  NaN 

>> r(:, [1, end]) = nan 

r = 

     NaN  NaN  NaN  NaN 
     NaN 0.0975 0.9649  NaN 
     NaN 0.2785 0.1576  NaN 
     NaN  NaN  NaN  NaN 

mise à jour: en général, étant donné que l'image est une matrice, votre question est "comment définir certaines valeurs de la matrice?". La réponse est: "en utilisant les index de la matrice". Il existe plusieurs façons de le faire (par exemple, en créant une matrice d'index, un masque logique ou en utilisant des coordonnées de lignes/colonnes). La décision quant à la méthode à utiliser dépend généralement de la vitesse de l'opération pour cette tâche spécifique. Par exemple, si vous devez remplacer des zéros par des NaN, il est plus rapide d'utiliser un masque logique: r(r == 0) = nan, et ainsi de suite.

0

Cela fera l'affaire, mais cela semble être le genre de fonction qui serait dans la boîte à outils de traitement d'image.

mask = logical(ones(size(i))); 
width = (m - 1)/2; 
mask(width + 1:size(i, 1) - width, width + 1:size(i, 2) - width) = 0; 
i(mask) = NaN; 
Questions connexes