Detecção e medição de formas irregulares em python opencv

Estou tentando fazer uma análise de imagem usando o OpenCV em python, mas acho que as próprias imagens serão bastante complicadas e nunca fiz nada assim antes, então quero soar minha lógica e talvez ter algumas idéias / código prático para alcançar o que quero fazer, antes de investir muito tempo no caminho errado.

Esta discussão chega bem perto do que eu quero alcançar e, na minha opinião, usa uma imagem que deve ser ainda mais difícil de analisar do que a minha. Eu estaria interessado no tamanho dessas bolhas coloridas, e não na distância do canto superior esquerdo. Eu também tenho seguidoesse código, embora eu não esteja especialmente interessado em um objeto de referência (apenas as dimensões em pixels seriam suficientes por enquanto e poderão ser convertidas posteriormente).

Aqui está a imagem de entrada:

O que você está vendo são cristais de gelo, e eu quero encontrar o tamanho médio de cada um. Os limites de cada um são razoavelmente bem definidos; portanto, conceitualmente, essa é minha abordagem e gostaria de ouvir sugestões ou comentários, se este for o caminho errado:

A imagem em RGB é importada e convertida em cinza de 8 bits (32 seria melhor com base nos meus testes no ImageJ, mas ainda não descobri como fazer isso no OpenCV).As bordas são opcionalmente desfocadas gaussianas para remover o ruídoUm detector de borda Canny capta as linhasAs transformações morfológicas (erosão + dilatação) são feitas para tentar fechar um pouco mais os limites.

Neste ponto, parece que tenho uma escolha a fazer. Eu poderia binarizar a imagem e medir os blobs acima de um limite (ou seja, pixels de valor máximo se os blobs forem brancos) ou continuar com a detecção de bordas fechando e preenchendo os contornos mais detalhadamente. Os contornos parecem complicados, apesar de olhar para esse tutorial e, embora eu possa executar o código nas minhas imagens, ele não detecta os cristais corretamente (sem surpresa). Também não tenho certeza se devo me transformar antes de binarizar também?

Supondo que eu possa fazer tudo isso funcionar, estou pensando que uma medida razoável seria o eixo mais longo da caixa ou elipse mínima.

Ainda não terminei todos os limiares e, consequentemente, alguns dos cristais foram perdidos, mas, como estão sendo calculados, isso não está apresentando um grande problema no momento.

O script armazena as imagens processadas à medida que avança, então eu também gostaria da imagem final de saída semelhante à imagem 'blobs rotulados' no encadeamento SO vinculado, mas talvez cada blob anotado com suas dimensões.

Aqui está como seria uma saída idealizada (incompleta), cada cristal é identificado, anotado e medido (com certeza eu posso lidar com a medição quando chegar tão longe).

Abreviou as imagens e as tentativas de código anteriores, pois estão tornando o encadeamento excessivamente longo e não são mais relevantes.Edição III:

De acordo com os comentários, o algoritmo do divisor de águas parece estar muito próximo de alcançar o que estou procurando. O problema aqui é que é muito difícil atribuir as regiões de marcador que o algoritmo requer (http://docs.opencv.org/3.2.0/d3/db4/tutorial_py_watershed.html)

Não acho que isso possa ser resolvido com limites pelo processo de binarização, pois a cor aparente dos grãos varia muito mais do que o exemplo de brinquedo nesse segmento.

Editar IV

Aqui estão algumas outras imagens de teste com as quais eu brinquei. Está muito melhor do que eu esperava com os cristais menores, e obviamente há muito refinamento que poderia ser feito com os limiares que ainda não tentei.

Aqui está 1: o canto superior esquerdo para o canto inferior direito corresponde às imagens exibidas nas etapas de Alex abaixo.

E aqui está um segundo com cristais maiores.

Você notará que essas cores tendem a ser mais homogêneas, mas com arestas mais difíceis de discernir. Algo que achei um pouco surpreendente é que o preenchimento de borda é um pouco zeloso com algumas das imagens; eu pensaria que esse seria o caso da imagem com cristais muito pequenos, mas na verdade parece ter mais efeito nos maiores. Provavelmente há muito espaço para melhorar a qualidade das imagens de entrada da nossa microscopia real, mas quanto mais folga a programação puder tirar do sistema, mais fácil será a nossa vida!

questionAnswers(1)

yourAnswerToTheQuestion