FFT pour la détection de ligne


8

J'essaie d'utiliser la FFT d'une manière différente de celle que la plupart des gens demandent. Je veux pouvoir prendre une photo d'un graphique avec des lignes verticales répétitives régulières et traiter l'image pour déterminer la distance moyenne en pixels entre les lignes. J'ai essayé la détection des bords et la détection des lignes difficiles et je ne pense pas pouvoir optimiser suffisamment les images pour détecter avec précision uniquement les lignes qui m'intéressent.

Donc, ma tentative est de numériser 10 lignes de l'image et d'accumuler les valeurs de pixels dans des bacs correspondant à la colonne de pixels. Ce qui en résulte lorsque vous tracez un graphique est une forme d'onde qui apparaît très bien. Lorsque j'effectue une DFT ou une FFT à ce sujet, je peux trouver un pic qui, selon moi, devrait être la fréquence de répétition de la ligne. (Cela peut être une hypothèse erronée)

Ma question est, à quoi correspond ce numéro? c'est-à-dire que je pense que je suis confus avec ce que serait mon taux d'échantillonnage car il est en pixels. Je pense que c'est une utilisation valide de la FFT, mais je tombe ici au point où je pense que je devrais réussir.

Par exemple. J'ai créé une image d'une largeur de 300 pixels. Il y a des lignes d'une largeur de 1 pixel tracées à des intervalles d'exactement 30 pixels. J'ai trouvé 2 pics, un à 75 et un à 225 (qui semblent symétriques) pour la composante réelle. (Je ne crois pas que le composant imaginaire devrait jouer dans ??) Je sais que les lignes sont espacées de 30 pixels. Quel est le rapport entre le 75 et le 225?

J'essaie vraiment de l'obtenir, et je suis reconnaissant pour toute aide que vous pourriez recommander. À ce stade, j'abandonne la détection des bords et je veux essayer cette approche.

Merci d'avance.

image  opencv  fft  dft 

Merci à tous pour vos réponses! La FFT ne semble tout simplement pas fonctionner. Comment ajouter du composant imaginaire? Le programme que j'utilise (stat plus) crache juste une colonne de nombres réels et imaginaires. J'avais tracé le réel sur l'axe des x, mais je suis sûr qu'il existe une meilleure façon d'inclure des nombres imaginaires. De plus, j'ai emprunté la voie de l'autocorrélation et j'ai obtenu un résultat! doux !, mais cela soulève toujours plus de questions. Le résultat que j'obtiens est le double de la taille de l'image d'origine (ce qui est compréhensible), ce qui oscille beaucoup plus net près du centre. Y a-t-il une rime ou une raison de

Réponses:


6

Vous pourriez envisager d'essayer l' autocorrélation pour cela. Voici une réponse SO décrivant comment effectuer une autocorrélation avec Matlab en utilisant des FFT. Cela pourrait être étendu à deux dimensions.

J'ai implémenté votre cas de test dans numpy comme suit:

a = np.zeros(300)
a[::30] = 1
plt.acorr(a, maxlags=50)

Cela donne le tracé suivant:

entrez la description de l'image ici

Comme vous pouvez le voir, les pics apparaissent à +/- 30.


4

S'il y a 10 lignes verticales dans votre image, alors une FFT d'une ligne de balayage horizontal complet (300 pixels) devrait montrer un certain contenu d'amplitude autour du bac 10 ou du bac 11. Le bac 75 sur 300 indiquerait que quelque chose se passe tous les 4 pixels, ou donc.

Vous devez vraiment regarder l'ampleur du résultat FFT, pas seulement le "vrai" composant (vraiment le composant pair) car, si vos lignes de grille sont décentrées, le contenu spectral pourrait apparaître comme impair (donc "imaginaire" dans le résultat FFT).

Étant donné une entrée réelle dans une FFT, les bacs de résultats supérieurs à N / 2 (supérieurs à 150 dans votre cas) contiennent simplement des répétitions des mêmes données, sauf la conjugaison complexe. Vous pouvez donc les ignorer.


0

Je n'ai pas beaucoup d'idée, mais pour faire le FFT visuellement intuitif, vous pouvez essayer de centrer FFT (en multipliant chaque valeur dans le FFT par (-1)(X+y)). Une fois que vous avez fait cela, votre composant DC apparaît au centre, avec l'ensembleFFT étant symétrique autour d'elle.

Je ne suis pas très sûr de cela, mais quelque chose me dit que la distance (en pixels) entre le pic et le centre indiquerait alors la périodicité. Une fois que vous avez la périodicité, vous pouvez facilement arriver à la distance entre chaque objet.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.