Rastreamento robusto de blobs

Eu tenho um problema de extração de recurso de imagem. As imagens de entrada são binárias (preto e branco) e podem conter bolhas de área e proporção aproximadamente conhecidas. Eles precisam ser ajustados com elipses usando o algoritmo de melhor ajuste.

Exemplo de entrada:

Saída desejada:

Pode haver vários blobs (zero ou mais), o número não é conhecido antecipadamente. A área aproximada e a proporção de todos os blobs são conhecidas (e são iguais). Quantos estão na imagem, sua posição, orientação e tamanho real são o que estou tentando encontrar. A saída deve ser a elipse mais adequada para cada blob, com base no tamanho encontrado real e na proporção.

O que torna isso difícil é o ruído e as possíveis sobreposições.

Exemplo com ruído:

Exemplo com sobreposição e ruído:

A imagem barulhenta pode ter orifícios nos blobs e também outros pequenos espalhados ao redor. Os outros pequenos blobs não são contados porque são muito pequenos e não cobrem nenhuma área com densidade suficiente para serem considerados uma correspondência real.

A imagem com sobreposição deve ser contada como dois blobs, porque a área é muito grande para um único blob cobrir bem.

Uma métrica possível que avalia um ajuste potencial é:

soma de todas as elipses de (K1 * desvio percentual do tamanho esperado + K2 * desvio percentual da proporção esperada + K3 * porcentagem de elipse que não é preta + K4 * porcentagem sobreposta a qualquer outra elipse) + K5 * porcentagem de restante da imagem que é preto

para alguns parâmetros escolhidos adequadamente K1..K5. Uma combinação perfeita marca 0.

Eu posso ver como resolver isso usando força bruta, por exemplo, tentando diferentes ajustes possíveis para provar bem o espaço de pesquisa. Não consigo pensar num método muito mais rápido que a força bruta.

Eu preferiria exemplos em python e / ou opencv. Vou tentar implementar e publicar quaisquer soluções sugeridas em python. Obrigado!

P.S. Não se pode presumir que um blob esteja conectado. Pode haver ruído suficiente para dividi-lo em peças descontínuas.

P.P.S. Os pequenos pedaços de ruído não podem ser removidos por erosão binária. Em algumas de minhas imagens, existem furos internos suficientes para que a erosão faça com que o blob (real) desapareça se a imagem for erodida o suficiente para fazer com que os bits de ruído desapareçam também.

P.P.P.S. Eu acho que seria muito difícil resolver isso usando qualquer abordagem baseada em contornos. Os dados que vejo na prática têm muito ruído de borda; pode haver (e geralmente existem) bits de ruído que conectam blobs separados ou que separam um único blob em vários componentes conectados (aparentes). Gostaria de uma abordagem baseada em áreas, já que a cobertura da área parece ser muito menos intrometida do que as formas das arestas.

P.P.P.P.S. Conforme solicitado, aqui está um exemplo com um corte direto devido ao ruído:

e uma amostra com muito e muito barulho, mas, no entanto, uma bolha distinta:

EDITAR Nenhuma das respostas realmente resolve o problema, embora Bharat tenha sugerido uma solução parcial que funciona bem para blobs não sobrepostos. Mais por favor :) Atribuirei recompensa adicional a quaisquer soluções reais.

questionAnswers(2)

yourAnswerToTheQuestion