Question

J'ai une image RVB dans MATLAB et je souhaite parcourir en boucle chaque pixel et vérifier si elle a une couleur de peau (ish) [Je le ferai probablement plus tard dans l'espace HSV pour annuler les effets de l'éclairage, etc.]

Quelqu'un sait-il le meilleur moyen de le faire? La syntaxe étrange de MATLAB me confond un peu!

Pour le moment, j'ai:

for x = 1:size(I,1)
    for y = 1:size(I,2)
            %Get the value from this x,y coordinate and check the colour.
    end
end

Mais je pense que c'est horriblement faux.

Comment accédez-vous correctement aux différentes parties de la matrice?

Était-ce utile?

La solution

Ed,

Vous n'avez pas besoin de boucler:

>> a  = magic(5)

a =

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9


>> vi = (a > 5) & (a < 10)

vi =

     0     0     0     1     0
     0     0     1     0     0
     0     1     0     0     0
     0     0     0     0     0
     0     0     0     0     1

Vous pouvez voir comment cette déclaration pourrait être développée pour RVB et autres. Je ferais une fonction

function out = isFlesh (in)

%% a mis le code de vérification de la chair ici

Je soupçonne que vous allez vouloir une gamme de ces couleurs (Caucasienne, Asiatique, etc.) Le problème est qu’il existe une très grande gamme de couleurs de chair, vous voulez donc vérifier la proximité. aux voisins d'une gamme de couleurs similaire.

Cette partie du problème est facile, mais le problème le plus important est périlleux.

-Doug

Autres conseils

Il convient de garder à l’esprit que les images RVB sont des matrices 3D. Le premier " page " (c.-à-d. A (:,:, 1) ) est en rouge, le second en vert et le troisième en bleu. Parfois, il est plus facile de manipuler des matrices RVB en les transformant en matrices N-par-3 où tous les pixels rouges sont dans la colonne 1, le vert dans la colonne 2 et le bleu dans la colonne 3. Voici comment procéder:

A = (a 3-D RGB image);
matSize = size(A);
A = reshape(A,prod(matSize(1:2)),3);
...
% Modify or extract data from reshaped matrix
...
A = reshape(A,matSize);  % Return A to original dimensions

Je ne sais pas si cela vous aidera spécifiquement dans ce que vous voulez faire, mais je le trouve souvent utile.

Le seuillage de chaque canal n’est pas un moyen très robuste de détecter les couleurs de la peau. Une table de recherche simple fonctionne beaucoup mieux. La table de correspondance enregistrerait une valeur pour chaque couleur selon laquelle il est probable qu'il s'agisse d'une peau. Il existe différents jeux de données de couleur de peau que vous pouvez utiliser pour obtenir ces valeurs. Vous pouvez ensuite comparer la couleur du pixel à la valeur du tableau et prendre une décision en fonction d'un seuil.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top