Filtro de paso de banda de la imagen aplicada FFT. (Como el algoritmo de filtro de paso de banda ImageJ)

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

Pregunta

Hay una buena función que necesito, que se implementa en el programa Java: ImageJ. Necesito entender el algoritmo utilizado allí. La función tiene varios parámetros:Texto del enlace

Y antes de usar FFT convierte la imagen en uno especial: el filtro de paso de banda utiliza un algoritmo especial para reducir los artefactos de borde (antes de la transformación de Fourier, la imagen se extiende en tamaño al conectar copias reflejadas de piezas de imagen fuera de la imagen original, por lo tanto, no salta. ocurrir en los bordes)

¿Puedes contarme más sobre esta transformación especial? En realidad imagen de mosaico.

Estoy escribiendo en C ++ y deseo reescribir esa parte del programa en C ++.

EDIT1: Necesito entender cómo lo hace esa operación de imagen reflejada de mosaico, puede ser especial. En realidad, al principio convierte la imagen en una imagen de nuevo tamaño, por lo que para mis imágenes será: Converción de 600x480 a 1024x1024 Imagen de tamaño. ¿Cómo se usa el mosaico aquí?

Edit2: también es difícil entender esta descripción de la función Tilemirred:

Pone ImageProcessor (ROI) en un nuevo procesador de imágenes de ancho de tamaño x altura y en la posición (x, y). La imagen se refleja alrededor de sus bordes para evitar los efectos envolventes de la FFT. ¿Qué se entiende por "... de ancho de tamaño x altura y en la posición (x, y)"?

Edit3: Implementé ese filtro de paso de banda, y ofrece los mismos resultados que el programa original. Pero, el algoritmo en sí en el programa original (también en mi programa) es muy lento. Quiero usar ese filtro ni una sola vez en mi programa, pero calcula aproximadamente 0.5 a 2 segundos cada llamada (dependiendo del valor del parámetro). Se usa una transformación FHT (no FFT), ¿es más rápido que FFT? Creo que el filtro en sí no está optimizado, consulte la implementación de la función FilterLargesMall:código fuente

¿Fue útil?

Solución

No sé exactamente cómo funciona esa función, pero aquí está el algoritmo básico para una función similar:

  1. Determine la potencia más pequeña de dos (llámalo Newsize) que es más grande que las dos dimensiones de la imagen (llámalas XSize & YSize).

  2. Cree una nueva imagen cuadrada de tamaño Newsize por Newsize y copie el contenido de la imagen en el centro de la nueva imagen (es decir, la parte superior izquierda de la imagen debe comenzar en (newSize / 2 - xSize / 2, newSize / 2 - ySize / 2)).

  3. Complete los píxeles restantes de la siguiente manera, para cada píxel en (x, y):

    • si x < (newSize / 2 - xSize / 2), copia el píxel en la columna (newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x y fila y.
    • si y < (newSize / 2 - ySize / 2), copia el píxel en la fila (newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y y columna x.
    • Si ambos son verdaderos, copie el píxel en la columna (newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x, fila (newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y.
    • si x > (newSize / 2 + xSize / 2), copia el píxel en la columna (newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x y fila y.
    • si y > (newSize / 2 + ySize / 2), copia el píxel en la fila (newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y y columna x.
    • Si ambos son verdaderos, copie el píxel en la columna (newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x y fila (newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y.

Probablemente hay bibliotecas que lo harán más fácil (es decir, voltear y copiar datos de imagen), pero no estoy familiarizado con C ++, y esto debería ser bastante fácil codificarlo, siempre que el rendimiento no sea un gran problema. Tenga cuidado de redondear problemas para imágenes con dimensiones extrañas: asegúrese de ser consistentes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top