Radon Transforme para Java

Você pode ler a teoria dessa transformação neste link da Wikipédia.

Descrição

Ouvi pela primeira vez o nome dessa transformação enquanto lia o artigo que comprei do IEEE para obter uma grade de tabuleiro de xadrez para programar uma função no aplicativo ChessPdfBrowser.

Artigo IEEE .


Esta é uma biblioteca com a minha implementação dessa transformação para Java.


O código da biblioteca também é compartilhado no GitHub. Link para o GitHub .

Descrição do código

Como o processamento é demorado, a biblioteca fornece um executor que retorna um futuro, para evitar bloquear a execução do chamador enquanto o processamento está em andamento.

Cálculos paralelos são facilmente suportados para o uso de vários threads.


A classe RadonTransformCalculator calcula os valores de transformação e os armazena em uma matriz bidimensional.


Após o processamento, os valores de transformação podem ser analisados usando os índices de matriz para acessá-los.

Estes índices podem ser facilmente traduzidos para um elemento (Rho, Theta) (, ) chamando a função no objeto de resultado, que é do tipo RadonTransformResult.


Também é possível obter os valores máximos N, dando a opção de descartar duplicatas (diferentes (, ) que são muito próximas) através de uma tolerância, e um filtro também pode ser aplicado ao mesmo tempo em (, ) para descartar antecipadamente aqueles que não atendem às nossas condições.

Por exemplo, se você está procurando linhas quase horizontais ou verticais, e há uma diagonal com um valor muito alto, então esse valor pode ser descartado.

Windows

Radon Transforme para Java (2026)

Download

Exemplos

image
image

Um exemplo está incluído no arquivo zip contendo o código da biblioteca, que explicaremos abaixo.

Este exemplo visa obter os lados da praça que define o tabuleiro de xadrez na imagem de destino.

A imagem de entrada para o cálculo da transformação de Radon é uma detecção de borda (tipo Canny) da imagem de destino.


A transformação é calculada para esta imagem do tipo Canny e, em seguida, as quatro linhas principais são obtidas.

Isso é alcançado chamando a função para obter os valores mais altos da transformação, passando-a quatro como o número de elementos a serem pesquisados.

Além disso, uma tolerância apropriada de (, ) também é passada para descartar duplicatas e um filtro para descartar valores que não são quase horizontais ou verticais.


No exemplo, essas quatro linhas que definem os lados do tabuleiro de xadrez são obtidas com sucesso com essas ferramentas.

Com a biblioteca, as interseções dessas linhas podem ser calculadas, obtendo-se assim os vértices.

Um classificador de vértices também é invocado para que, quando as linhas são desenhadas sequencialmente, o "efeito gravata" não ocorra.


Este pedido de vértice é feito através da iteração através das permutações da ordem do vértice até que o primeiro que atenda ao critério de adequação seja encontrado.

O critério escolhido é que os vértices nessa ordem definam um polígono convexo (como o quadrado que queremos detectar).

Para fazer isso, é necessário verificar se a rotação dos vértices está sempre na mesma direção (no sentido horário ou no sentido anti-horário).

Para obter a direção de rotação de três vértices consecutivos, basta calcular o sinal do produto cruzado dos dois vetores definidos por esses três vértices.

Portanto, a condição necessária e suficiente para que os vértices definam um polígono convexo é que todos os subconjuntos ordenados de três vértices consecutivos (assumindo a lista circular) tenham o mesmo sinal no produto cruzado calculado dessa maneira.


Após esses cálculos, desenhamos as bordas que conectam os vértices e obtemos a imagem final.

Missão cumprida!


image
image

Downloads