Calculo distância (Processamento de imagens)

Olá pessoal…
Preciso de uma orientação sobre um trabalho que estou desenvolvendo. A área é processamento de imagens. As API que estou testando é a JAI e algo sobre RASTER. Mas estou com dificuldades de achar a lógica para esse cálculo.
O principal foco seria calcular a distância entre pontos.
Preciso de orientação dos passos a serem seguidos para isso.
Já li a respeito de distância euclidiana, área, perímetro e outras análises de imagem.
A imagem é binária (exemplo: http://uploads.javafree.com.br/files_user/files/0/10/CF/exemploimagem.JPG)
a escala é uma constante, definida por mim. Os pontos são identificados como agrupamento de 2 ou mais pixels.
O problema é a distância, deve usar algum algoritmo de vizinhança, ou seria melhor identificar o ângulo da linha e aplicar a distancia euclidiana?
Ou alguém conhece algum método melhor para achar a distância?
(Exemplo: http://uploads.javafree.com.br/files_user/files/B/19/CC/distancia.JPG)

A principio fazendo um processo (uma distância apenas entre 2 pontos, apenas uma linha tracejada) seria excelente, mas futuramente devo calcular a distância entre todos pontos.

Agradeço a ajuda dos amigos!!!

Distância do que você quer calcular?

Se for simplesmente entre 2 pontos, basta fazer a distância euclidiana mesmo. Se precisar de mais precisão e for sobre o globo terrestre, use a distância geodésica.
Você não precisa do ângulo da linha, só da posição dos pontos. Afinal, calcula-se usando o teorema de pitágoras…

distancia = Math.sqrt(Math.sqr(x1 - x2) + Math.sqr(y1 - y2));

[quote=ViniGodoy]Distância do que você quer calcular?

Se for simplesmente entre 2 pontos, basta fazer a distância euclidiana mesmo. Se precisar de mais precisão e for sobre o globo terrestre, use a distância geodésica.
Você não precisa do ângulo da linha, só da posição dos pontos. Afinal, calcula-se usando o teorema de pitágoras…

distancia = Math.sqrt(Math.sqr(x1 - x2) + Math.sqr(y1 - y2));

Ok. mas na imagem ira existir algumas linhas com uma certa curvatura…
imagino dae que a distância euclidiana terá um pouco de perda de exatidão da distância.
Teria alguma distância que se aplica-se a este problema???
A geodésica se aplicaria será?
Será que um método que seguisse o rastro da linha não seria melhor aplicado?

Você pode dividir a linha maior em uma série de linhas menores. Isso se chama calculo a partir de cordas.
Quanto mais cordas você tiver, menor será seu erro.

Na verdade, é exatamente isso que o cálculo integral faz:

Aqui tem uma leitura muito boa.

http://homepages.inf.ed.ac.uk/rbf/HIPR2/wksheets.htm

[quote=ViniGodoy]
Na verdade, é exatamente isso que o cálculo integral faz:
http://pt.wikipedia.org/wiki/Comprimento_do_arco[/quote]

mas no caso me surgiu uma dúvida:
no caso da distância euclidiana, eu informaria a posição coluna e linha do ponto_1 e do ponto_2 e assim teria a distância entre os pontos. Correto? distancia = Math.sqrt(Math.sqr(x1 - x2) + Math.sqr(y1 - y2));
agora com comprimento do arco, como funcionaria? eu informaria só a posição inicial dos pontos? e a fórmula, como funciona? como ele detecta os outros pontos? essa parte, não consegui compreender.
Alguém não teria o código em java dessa distância?
Obrigado pela ajuda!!!

http://obsn3.on.br/~jlkm/geopath/

caro thingol, obrigado pela ajuda, só que como estavamos explanando, acho que a distância geodésica não se aplicaria, pelo fato de existir alguns trajetos (na linha) em formato de “S”, o que poderia ocasionar uma certa margem de erro na distância.
Pelo que li a distância que melhor se aplicaria seria a que calcula o comprimento do arco, (pq ela segmenta a curvatura em várias retas e as soma). Só que não entendi como transpassar isso para o Java.
Alguma idéia?

Ah, você quer determinar uma distância entre duas cidades, como seguir um caminho na estrada (que obviamente não é uma reta). É isso? Se for isso, você precisa ter o caminho, para poder determinar o comprimento desse caminho.

Sim. na verdade, no projeto, eu tenho um mapa importado por um GPS de um “Rio e seus afluentes”. A distância que tenho que calcular é entre todos os pontos de afluentes. Seria o mesmo desenho de uma faixa BR e suas inter-regionais. Só que para chegar ao final do projeto, estou tentando aplicar a fórmula em apenas 1 distância (distância entre 2 pontos), somente para testar os algoritmos. Essa imagem deste mapa importado por um GPS já é tratada e corrigida pelo ArcGis, que é um software de analise de imagens. Eu teria ela já binarizada só com os pontos de referencia e seus trajetos. Assim teria que calcula a distância e o ângulo destes pontos. Só que agora estou entravado nessa distância.

Precisa criar um vetor com quantidade de pixel do trajeto, e converter na medida que precisa. Depois usar a escala e converter novamente.

OK. dexa ver se entendi:
Devo segmentar apenas uma distância entre 2 pontos. Definindo a espessura do traçado (trajeto) eu teria uma escala, que é definida por mim mesmo. Digamos que a expessura do trajeto seria de 1 pixel. Assim eu somando a quantidade dos pixels dividindo pela minha escala eu teria a distância entre os 2 pontos.
Seria +ou- isso? será que entendi?

OK. dexa ver se entendi:
Devo segmentar apenas uma distância entre 2 pontos. Definindo a espessura do traçado (trajeto) eu teria uma escala, que é definida por mim mesmo. Digamos que a expessura do trajeto seria de 1 pixel. Assim eu somando a quantidade dos pixels dividindo pela minha escala eu teria a distância entre os 2 pontos.
Seria +ou- isso? será que entendi? [/quote]

Na verdade, não seria espessura…mas a distância. Mesmo contendo curvas, vc teria e referência em pixels. Os pixels podem ser traduzidos em mm, e cm…ae por diante. Posteriormente, seu mapa deve estar escalado.

Ex: 1Km : 1cm, entende?

Dessa maneira pode conseguir uma boa precisão.

OK. entendi. Mas e na linguagem java, como eu posso criar um método que fizesse a leitura do trajeto, no mapa. de uma distância até outra.
Essa leitura teria que seguir o traçado da linha no mapa. Certo?
Será que existe alguma API para isso, ou teria que ser no dedo mesmo?
Seria algum algoritmo de leitura de pixel de vizinhança?
E eu também teria que definir o ponto inicial e o final, para obter essa distância.

OK. entendi. Mas e na linguagem java, como eu posso criar um método que fizesse a leitura do trajeto, no mapa. de uma distância até outra.
Essa leitura teria que seguir o traçado da linha no mapa. Certo?
Será que existe alguma API para isso, ou teria que ser no dedo mesmo?
Seria algum algoritmo de leitura de pixel de vizinhança?
E eu também teria que definir o ponto inicial e o final, para obter essa distância.[/quote]

Vai ter que ser no dedo.
O link que te enviei é um livro de processamento de imagens. Lá tem todos esses algoritmos.