Filtro de BandPass de imagem aplicada FFT. (Como o algoritmo de filtro de band passa de imagem)

StackOverflow https://stackoverflow.com/questions/2579444

Pergunta

Há uma boa função que eu preciso, que é implementada no programa Java: ImageJ. Eu preciso entender o algoritmo usado lá. A função tem vários parâmetros:Texto do link

E antes de usar o FFT, ele converte a imagem em um especial: o filtro passa -banda usa um algoritmo especial para reduzir os artefatos de borda (antes da transformação de Fourier, a imagem é estendida em tamanho, anexando cópias espelhadas de peças de imagem fora da imagem original, portanto, sem saltos ocorrer nas bordas)

Você pode me contar mais sobre esta transformação especial? Na verdade, a imagem espelhada de ladrilhos.

Estou escrevendo sobre C ++ e desejo reescrever essa parte do programa no C ++.

EDIT1: Preciso entender como é a operação de imagem espelhada em ladrilhos, pode ser especial. Na verdade, a princípio, converte a imagem em uma imagem de novo tamanho; portanto, para minhas imagens, será: Converção de 600x480 para 1024x1024 Imagem de tamanho. Como o ladrilho é usado aqui?

EDIT2: Também é difícil entender esta descrição da função tilemirorada:

Coloca o ImageProcessor (ROI) em um novo Processador Image da largura do tamanho x altura y na posição (x, y). A imagem é refletida em torno de suas bordas para evitar envolver os efeitos da FFT. O que se entende por "... de largura de tamanho x altura y na posição (x, y)."?

Edit3: Implementei esse filtro BandPass e ele fornece os mesmos resultados que o programa original. Porém, o algoritmo em si no programa original (também no meu programa) é muito lento. Quero usar esse filtro não no meu programa, mas calcula aproximadamente 0,5 a 2 segundos cada chamada (dependendo do valor do parâmetro). Há uma transformação de FHT (não FFT), é mais rapidamente que a FFT? Eu acho que o filtro em si não é otimizado, consulte FilterLargesMall Function Implementation:Código fonte

Foi útil?

Solução

Não sei exatamente como essa função funciona, mas aqui está o algoritmo básico para uma função semelhante:

  1. Determine o menor poder de dois (chame de notícias) maior que o maior das duas dimensões da imagem (chame -as de XSIZE & YSIZE).

  2. Crie uma nova imagem quadrada do tamanho Nwsize by Newsize e copie o conteúdo da imagem para o centro da nova imagem (por exemplo, a parte superior esquerda da imagem deve começar em (newSize / 2 - xSize / 2, newSize / 2 - ySize / 2)).

  3. Preencha os pixels restantes da seguinte forma, para cada pixel em (x, y):

    • E se x < (newSize / 2 - xSize / 2), copie o pixel na coluna (newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x e linha y.
    • E se y < (newSize / 2 - ySize / 2), copie o pixel na linha (newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y e coluna x.
    • Se ambos os itens acima forem verdadeiros, copie o pixel na coluna (newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x, fileira (newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y.
    • E se x > (newSize / 2 + xSize / 2), copie o pixel na coluna (newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x e linha y.
    • E se y > (newSize / 2 + ySize / 2), copie o pixel na linha (newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y e coluna x.
    • Se ambos os itens acima forem verdadeiros, copie o pixel na coluna (newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x e linha (newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y.

Provavelmente existem bibliotecas que facilitarão isso (ou seja, lançar e copiar dados da imagem), mas não estou familiarizado com o C ++, e isso deve ser muito fácil de codificar, desde que o desempenho não seja um problema enorme. Cuidado com os problemas de arredondamento para imagens com dimensões estranhas: verifique se elas são consistentes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top