Se a saída do seu filtro Gábor for confiável e a variação nos dados da imagem não for tão alta que o resultado pareça completamente diferente, você poderá usar a seguinte abordagem (partes dela já mencionadas):
Binarize sua segunda imagem com qualquer algoritmo de limiar automático. O intervalo de limites que funcionará é grande como você verá.
Use um algoritmo de rotulagem de componentes para rotular cada região conectada de pixel com um valor exclusivo.
Calcule para cada componente de sua imagem uma propriedade que descreva o quão próximo seu objeto está de um círculo preenchido. Para isso, você pode usar, por exemplo, a compacidade . Usei abaixo da fração de pixels dentro do raio equivalente do disco . Esse raio é o raio de um disco com a mesma área que seu objeto teria.
- Área é simplesmente contar o número de pixels do seu objeto
- O cálculo do raio de um círculo, dada sua área, também deve ser administrável
- Para o pixel dentro desse raio, você precisa do centro de cada objeto de imagem, mas esta é apenas a média de todas as posições dos pixels do objeto. Se você é físico, conhece o centro de massa de várias massas pontuais. Isso é equivalente.
- Agora você calcula para cada pixel de cada objeto a distância do centro e verifica se é menor ou menor que o raio do círculo. Dividindo os dois números, você obtém a fração de pixel interno e externo.
- Pegue o objeto com a fração mais alta. Nota: objetos com apenas um pixel obterão o valor 1. Portanto, você deve definir um limite de tamanho e aumentar apenas os objetos, digamos 10 pixels.
Para ver que uma binarização automática deve funcionar, eis os resultados para um limite muito baixo e muito alto:
Atualizar rotulagem de componentes
A escolha da etiqueta do componente não é crítica para a sua aplicação. Eu sugeriria, se você precisar implementá-lo por conta própria, usar um método muito simples. A versão de uma passagem do site da Wikipedia é muito fácil. Basicamente, você repete sua imagem binária e, quando encontra um pixel branco e ainda não está rotulado, usa um novo rótulo para esse objeto e começa com esse pixel.
O processo de rotular esse objeto com um rótulo é basicamente semelhante a um preenchimento de inundação. Este é o site da Wikipedia, as etapas internas 1-4 do algoritmo. Você começa com esse pixel rotulado e coloca todos os seus vizinhos em uma pilha (eles usaram um vetor ). Para um pixel na pilha, verifique se ele está em primeiro plano e se ainda não está identificado. Se você precisar rotulá-lo, coloque novamente todos os seus vizinhos na pilha. Faça isso até que sua pilha esteja vazia.
Então você continua sua digitalização através da imagem. Diferente da descrição no site Wiki, você não precisa remover um pixel da imagem original, apenas pula quando tem um valor diferente de 0 na imagem da etiqueta.