Vamos ter uma imagem (em escala de cinza ou até binária), como mostrado na figura a seguir, no lado esquerdo. O objetivo é gerar uma lista de pontos, isto é, coordenadas na forma de (x, y) para cada pacote do pixels escuros na imagem.
Quais são as ferramentas adequadas de processamento de imagem para fazer isso e onde estão disponíveis?
Atualizações:
1)
Aqui você pode encontrar mais detalhes sobre o problema. (Observe a variação no tamanho das embalagens)
Eu posso sugerir que os pacotes sejam detectados para calcular o limite do casco convexo para cada um e, em seguida, encontre o centróide representativo {veja isso para obter detalhes} .
2)
Aqui está o resultado produzido pela aplicação da Distância Transformada (sugerida por "Libor"). Observe minhas anotações na figura. O método não funciona como promissor!
3) A
erosão elimina embalagens pequenas!
from __future__ import division
from scipy import zeros, ndimage as dsp
from pylab import subplot,plot,matshow,show
img = zeros((30,30))
img[10:14,10:14] = 1
img[16:17,16:17] = 1
img[19:23,19] = 1
img[19,19:23] = 1
subplot(221)
matshow(img,0)
subplot(222)
y = dsp.binary_erosion(img,[[1,1],[1,1]])
matshow(y,0)
subplot(223)
y = dsp.binary_erosion(img,[[0,1,0],[1,1,1],[0,1,0]])
matshow(y,0)
subplot(224)
y = dsp.binary_erosion(img,[[1,1,1],[1,1,1],[1,1,1]])
matshow(y,0)
show()
4)
Bem, aqui está uma implementação em Python (isto é, a linguagem do amor :)) da idéia de rotular (também proposta por "Jean-Yves" abaixo):
subplot(221)
l,n = dsp.label(img)
sl = dsp.find_objects(l)
for s in sl:
x = (s[1].start+s[1].stop-1)/2
y = (s[0].start+s[0].stop-1)/2
plot(x,y,'wo')
e o resultado:
Observe que, embora seja feito em Python tão rapidamente devido ao desempenho do Scipy, o procedimento em segundo plano na label
função deve ser uma iteração exaustiva. Isso pode ser considerado um trade-off. Por um tempo, continuo ansioso para buscar algoritmos mais eficientes. E observe também que, no código fornecido acima, achei o centro da geometria tão simples, enquanto que para formas complexas ou assimétricas, isso pode causar um viés de posicionamento. Ou seja, é um trabalho em andamento;).
5)
Aqui está um caso complexo (uma imagem real) capturado daqui em que a proposta de rotulagem foi aplicada e você vê os resultados. Observe que foram necessários apenas 0,015 s para todo o procedimento, incluindo rotular e localizar os objetos. Pessoal Scipy , fez um ótimo trabalho, eu acho. Uau! {clique com o botão direito do mouse na imagem, clique em Visualizar imagem para obter resolução total}