Filtre passe-bande de FFT appliquée image. (Comme ImageJ algorithme de filtre passe-bande)

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

Question

Il y a une bonne fonction que j'ai besoin, qui est mis en œuvre dans le programme Java: ImageJ. Je dois comprendre l'algorithme utilisé là-bas. La fonction a plusieurs paramètres: texte lien

Et avant d'utiliser FFT convertit l'image à un spécial: Le filtre passe-bande utilise un algorithme spécial pour réduire les artefacts de bord (avant la transformée de Fourier, l'image est agrandie en taille en attachant des copies en miroir de parties d'image en dehors de l'image originale, pas de sauts se produisent donc sur les bords)

Pouvez-vous me dire plus sur cette transformation spéciale? carrelage fait l'image en miroir.

Je suis écrit sur C ++ et souhaite réécrire cette partie du programme sur C ++.

EDIT1: Je dois comprendre comment il fait cette opération d'image en miroir de carrelage, peut-être il est spécial. En fait, au début, il convertit l'image à une nouvelle image de taille, donc pour mes images, il sera: convertion de 600x480 à 1024x1024 image de taille. Comment le carrelage est utilisé ici?

EDIT2: En outre, il est difficile de comprendre cette description de la fonction tileMirrored:

Met ImageProcessor (ROI) dans une nouvelle ImageProcessor de la largeur de taille x hauteur y à la position (x, y). L'image se reflète sur ses bords pour éviter l'enroulement autour des effets de la FFT. Qu'est-ce que l'on entend par "... d'une largeur de taille x hauteur y à la position (x, y)."?

EDIT3: Je mis en œuvre que le filtre passe-bande, et il donne les mêmes résultats que le programme original. Mais, l'algorithme lui-même dans le programme original (également dans mon programme) est très lent Je veux utiliser ce filtre pas une fois dans mon programme, mais il calcule environ 0,5 à 2 secondes à chaque appel (en fonction de la valeur du paramètre). On utilise une transformée FHT (non FFT), est-il plus rapidement que FFT? Je pense que le filtre lui-même est pas optimisé, s'il vous plaît voir la mise en œuvre de la fonction filterLargeSmall:

Était-ce utile?

La solution

Je ne sais pas exactement comment fonctionne cette fonction, mais voici l'algorithme de base pour une fonction similaire:

  1. Déterminer la plus petite puissance de deux (appeler newSize) qui est plus grande que la plus grande des deux dimensions de l'image (les appeler XSIZE & YSize).

  2. Créer une nouvelle image carrée de la taille newSize par newSize et copier le contenu de l'image au centre de la nouvelle image (ie. En haut à gauche de l'image devrait commencer à (newSize / 2 - xSize / 2, newSize / 2 - ySize / 2)).

  3. Remplir les pixels restants comme suit, pour chaque pixel à (x, y):

    • si x < (newSize / 2 - xSize / 2), copier le pixel de la colonne et de la ligne (newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x y.
    • si y < (newSize / 2 - ySize / 2), copier le pixel à la ligne (newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y et colonne x.
    • si les deux conditions ci-dessus sont vraies, copier le pixel à la colonne (newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x, ligne (newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y.
    • si x > (newSize / 2 + xSize / 2), copier le pixel de la colonne et de la ligne (newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x y.
    • si y > (newSize / 2 + ySize / 2), copier le pixel à la ligne (newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y et colonne x.
    • si les deux conditions ci-dessus sont vraies, copier le pixel de la colonne et de la ligne (newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x (newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y.

Il y a probablement des bibliothèques qui rendent cela plus facile (ie. Flipping et copie les données d'image), mais je ne suis pas familier avec le C ++, et cela devrait être assez facile à vous coder aussi longtemps que les performances ne sont pas un énorme problème. Méfiez-vous des problèmes d'arrondis pour les images avec les dimensions impaires:. Assurez-vous qu'ils sont cohérents

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top