Cálculo exato do comprimento limite de uma imagem raster

5

Eu tenho uma imagem rasterizada que contém duas cores: branco e preto. A parte preta é totalmente conectada e parece uma grande bolha. Existe uma boa maneira de estimar o comprimento da fronteira entre as regiões?

Um método que considerei é simplesmente contar quantas "arestas" da grade rasterizada têm uma cor diferente em cada lado. Contudo, por exemplo uma linha puramente diagonal, isso irá superestimar a distância do limite por um fator de sqrt (2). Existe um método melhor para estimar o comprimento do limite que não tem esse problema?

    
por Jim Garrison 06.08.2013 / 02:30
fonte

3 respostas

1

A postagem no blog " Medindo o comprimento dos limites " de Cris Luengo discute precisamente este problema e descreve várias soluções de sofisticação crescente. Caso o blog caia, aqui está uma referência permanente à melhor discutida no post:

Vossepoel and Smeulders, "Vector code probability and metrication error in the representation of straight lines of finite length" (Computer Graphics and Image Processing 20(4):347-364, 1982).

    
por 24.07.2014 / 08:44
fonte
3

O problema com a superestimação de comprimento para linhas diagonais deriva inteiramente da abordagem que você está tomando, ou seja, contar "bordas da grade de pixels com cores diferentes em cada lado" e declarar a soma de um comprimento de contorno. Esses dois não são equivalentes no caso geral.

Essencialmente, você está se restringindo a calcular distâncias "na grade" em vez de distâncias Euclidianas ("diretas") ou "suavizadas por múltiplos pontos" entre as bordas reais do contorno (não "bordas" da grade). O motivo pelo qual você considera sua abordagem imprecisa para linhas diagonais é porque seus critérios de precisão têm a ver com a precisão de subpixel, enquanto no seu algoritmo você está operando em um nível de precisão de pixel ("arestas" de grade rasterizada).

Por que não aplicar primeiro a detecção de borda e obter uma lista de arestas com coordenadas de subpixel (é possível aplicar qualquer algoritmo de detecção de borda de subpixel de finalidade geral). Sua saída desta etapa será uma lista de pares de duplas. Esta etapa transformará seu problema em um domínio de subpixel, onde você poderá calcular distâncias e atender aos seus critérios de precisão.

Após perfurar as bordas no nível de subpixel, temos duas opções principais:

  • para calcular a soma das distâncias euclidianas entre as bordas sucessivas. Ele nos dará uma contagem de precisão aceitável, já que escolhemos um algoritmo de detecção de borda decente;
  • para conectar suas bordas de forma suave (por exemplo, B-splines) e calcular uma soma de comprimentos de arco entre bordas sucessivas de acordo com a função de interpolação escolhida.

ATUALIZAÇÃO A abordagem simplificada para o primeiro passo seria escolher um ponto médio de subpixel de suas "bordas" elegíveis da grade rasterizada e declará-lo como um centro de sua borda. A partir daí, você continua calculando as distâncias - mesmo com distâncias euclidianas entre os pontos centrais, você obterá um resultado muito preciso, contando então com as "bordas" elidíveis da grade rasterizada. Pelo menos o seu problema de "superestimação por fator de sqrt (2)" para linhas diagonais será resolvido. Espero que ajude.

    
por 01.03.2014 / 08:56
fonte
-1

Como o rwong escreveu, você pode usar findContours para obter os countours, se você ainda não os tiver. Em seguida, você pode usar arcLength para calcular a duração do contorno .

    
por 18.08.2013 / 02:04
fonte