Pergunta

Eu tenho uma imagem RGB no MATLAB e quero fazer um loop através de cada pixel e verificar se é colorida da pele (ish) [provavelmente o farei no espaço HSV posteriormente para negar os efeitos da iluminação etc.

Alguém sabe a melhor maneira de fazer isso? A sintaxe estranha de Matlab está me confundindo um pouco!

No momento eu tenho:

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

Mas acho que isso é terrivelmente errado.

Como você acessa as diferentes partes da matriz corretamente?

Foi útil?

Solução

Ed,

Você não precisa fazer um loop:

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

Você pode ver como essa declaração pode ser expandida para RGB e tal. Eu faria uma função


função out = isflesh (in)

%% Coloque o código de verificação de carne aqui


Eu suspeito que você vai querer um intervalo deles (iscaucasiano, isasiano, etc ...), o problema será que há uma enorme variedade de cores de carne, então você vai querer verificar a proximidade com os vizinhos de vizinhos de uma faixa de cores semelhante.

Essa parte do problema é fácil, mas o problema maior está repleto de perigo.

-Doug

Outras dicas

Uma coisa a ter em mente é que as imagens RGB são matrizes 3D. A primeira "página" (ou seja, A (:,:, 1)) é vermelho, o segundo é verde e o terceiro é azul. Às vezes, acho mais fácil operar em matrizes RGB, remodelando-as em matrizes N por N por 3, onde todos os pixels vermelhos estão na coluna 1, o verde na coluna 2 e o azul na coluna 3. É como fazê-lo:

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

Não tenho certeza se isso o ajudará especificamente com o que você deseja fazer, mas muitas vezes acho útil.

O limiar de todos os canais não é uma maneira muito robusta de fazer a detecção de cores da pele. Uma tabela de pesquisa simples funciona muito melhor. A tabela de pesquisa registraria um valor para cada cor de quão provável é ser pele. Existem vários conjuntos de dados de cores da pele que você pode usar para obter esses valores. Em seguida, você pode comparar a cor do pixel com o valor na tabela e tomar uma decisão com base em um limite.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top