Pregunta

Tengo una imagen RGB en MATLAB, y quiero recorrer cada píxel y verificar si es de color piel (ish) [Probablemente lo haré en el espacio HSV en un punto posterior para negar los efectos de la iluminación, etc.]

¿Alguien sabe la mejor manera de hacer esto? ¡La extraña sintaxis de MATLAB me está confundiendo un poco!

Por el momento tengo:

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

Pero creo que eso es terriblemente incorrecto.

¿Cómo accede a las diferentes partes de la matriz correctamente?

¿Fue útil?

Solución

Ed,

No necesita hacer un bucle:

>> 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

Puede ver cómo esta declaración podría expandirse para RGB y demás. Haría una función


function out = isFlesh (in)

%% pone el código de verificación de carne aquí


Sospecho que querrá una gama de estos (isCaucasian, isAsian, etc.). El problema será que hay una gran variedad de colores de carne, por lo que querrá verificar la proximidad a vecinos de una gama de colores similar.

Esta parte del problema es fácil, pero el problema más grande está lleno de peligros.

-Doug

Otros consejos

Una cosa a tener en cuenta es que las imágenes RGB son matrices 3-D. La primera " página " (es decir, A (:,:, 1) ) es rojo, el segundo es verde y el tercero es azul. A veces me resulta más fácil operar en matrices RGB al darles forma en matrices N-por-3 donde todos los píxeles rojos están en la columna 1, el verde en la columna 2 y el azul en la columna 3. Así es como se hace:

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

No estoy seguro de si esto lo ayudará específicamente con lo que quiere hacer, pero a menudo lo encuentro útil.

Umbralizar cada canal no es una forma muy sólida de detectar el color de la piel. Una tabla de búsqueda simple funciona mucho mejor. La tabla de búsqueda registraría un valor para cada color con la probabilidad de que sea piel. Existen varios conjuntos de datos de color de piel que puede usar para obtener dichos valores. Luego puede comparar el color del píxel con el valor de la tabla y tomar una decisión basada en un umbral.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top