Verifique cada pixel para obter uma cor específica (dentro de um determinado limite)
-
19-08-2019 - |
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?
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.