Spectre de puissance d'une image
J'ai commencé (un petit projet) afin de calculer le spectre de puissance d'une image dans le domaine fréquentiel.
Donc, ce que j'ai jusqu'à maintenant est la suivante:
%//close all; clear all; %//not generally appreciated
img = imread('ajw_pic.jpg','jpg'); % it is a color image
img = rgb2gray(img); %//change to gray
psd = 10*log10(abs(fftshift(fft2(img))).^2 );
figure(2); clf
mesh(psd)
Jusqu'à présent, il semble bon; je obtenir le tracé de maillage qui ressemble à des spectres, je vois dans divers travaux académiques.
Cependant, ce que je cherche, c'est un graphique de l'intrigue de ce spectre de puissance en fonction de leur fréquence, et je ne suis pas entièrement sûr de savoir comment obtenir cette fréquence de vecteur. Je pourrais faire par exemple:
N=400; %//the image is 400 x 400
f=-N/2:N/2-1; %//possible frequencies?
mais je ne suis pas convaincu que c'est tout à fait correct que cela donne lieu à des fréquences négatives.
Je serais vraiment reconnaissant si quelqu'un pouvait me diriger dans la bonne direction pour le tracé de la fréquence journal contre le spectre de puissance.
OriginalL'auteur AJW | 2013-12-09
Vous devez vous connecter pour publier un commentaire.
fft
"grand écart" un signal en fréquence "poubelles", où la fréquence maximale que vous pouvez observer est la fréquence de Nyquist ou la moitié de votre fréquence d'échantillonnage. Cela signifie que pour:les fréquences correspondant à la fft valeurs dans
Y(1:N/2+1)
sera:L'autre moitié de Y est juste en miroir et vient de la intrinsèques de la transformée de Fourier. Si vous ne voulez pas le comprendre pleinement, je dirais qu'il n'y a pas besoin de s'embêter avec d'autres que ce que vous pouvez trouver sur wikipédia. Mais pour le bien de la curiosité, vous pouvez consulter une belle intuitive illustration de l'origine de la positif et négatif de fréquences: https://dsp.stackexchange.com/questions/431/what-is-the-physical-significance-of-negative-frequencies/449#449.
Quelques différences clés pour votre 2D-image de cas:
À l'aide de fftshift vous avez déplacé le 0-fréquences au centre de la matrice, plutôt que de les faire sur les bords, comme ci-dessus 1D exemple. Donc, vous obtenez en fait
f = fs/2 * linspace(-1,1,N)
(une fois de plus, n'ayez pas l'esprit de la des fréquences négatives)La prochaine étape est d'obtenir la fréquence d'échantillonnage. Les fréquences spatiales sont généralement mesurée en [mm^-1], de sorte que, pour l'obtenir vous avez réellement besoin de savoir la distance entre les centres des pixels (pixel). Mais vous pouvez bien sûr considérer les fréquences spatiales dans [pixels^-1] dans ce cas, vous êtes prêt à aller.
1/400
(donnée 400is mon px), mais je n'ai pas defs
puisque c'est une image? Aussi, quand je fft mon 400x400 de l'image, et de calculer la puissance, le résultat est également un 400 x 400 matrice - mais, je suppose que ce que je veux, c'est quelque chose de la taille 1x400 - afin que je puisse tracer la fréquence et le spectre de puissance. Ou suis-je stupide?Bien votre fs est en fait 1, en pixels ou 1/(pixel de hauteur) en mm. Si vous n'avez pas le pas des pixel vous pouvez toujours utiliser fs=1 (juste l'esprit de l'unité - votre fréquence de nyquist est d'une demi-inversé pixel). Vous devriez également considérer que vous pouvez avoir des fréquences différentes dans les directions x et y (par exemple, la non-quadratique pixels) - c'est pourquoi vous avez un 400x400 de la matrice. Afin de créer un fx et fy de fréquence de vecteur (ils sont les mêmes depuis NX=NY=400, et la taille des pixels est inconnu). Comment visualiser c'est une autre question (que je n'ai pas de bonne réponse pour les autres que l'étiquetage de l'axe fx et fy que les tics)
Je suis en train de faire ce que vous avez suggéré: Donc, je n':
fs=1;
f = fs/2 * linspace(-1,1,N); %where N is 400
- cela fonctionne à-0.5 to +0.5
- est-il logique? Est-ce un Hz valeur ou en radians/sec? 🙁Juste une autre petite idée: je suis aussi à l'aide de cette ressource:
http://redwood.berkeley.edu/bruno/npb261b/lab2/lab2.html
et la freq semble être ici0:N/2
Ils semblent en quelque sorte à calculer unrotavg
- mais la fonction est sûr, c'est pas de Matlab. Vous vous demandez si vous aviez des idées. Merci.Jetez un oeil ici pour obtenir des commentaires sur de rotation moyennes: sbirc.ed.ac.royaume-uni/cyril/download/DTP_Fourier_analyses.pdf. La freq de la gamme que vous mentionnez est compatible avec ma réponse ci-dessus (i.e. fs=1 et freqs allant de 0:N/2 * fs, plus miroir négatif freqs)
OriginalL'auteur kamjagin
De tracer les spectres de puissance par rapport à la fréquence de l'image, on peut utiliser un processus appelé "radiale moyenne'. Ce calcule la valeur moyenne des pixels qui sont à une certaine distance radiale à partir du centre de l'image. En appliquant cela à une densité spectrale de puissance de la matrice de résultats dans une ligne de la parcelle de la puissance par rapport à la fréquence.
Pour plus d'informations et un exemple de code MATLAB: http://www.mathworks.com/matlabcentral/fileexchange/46468-radialavg-zip/content/radialavg.m
OriginalL'auteur M. Bedross
Si votre spatiales de l'intervalle est de 1 pixel, vous pouvez simplement utiliser fs =1. Ensuite, votre gamme de fréquence est
(-N/2:N/2-1)/N
, où N est la taille de votre image (nombre de pixels sur l'axe x ou l'axe des y). Notez que la fréquence de l'intervalle est de 1/N, ce qui est plus petit que 1/2 pixel à condition N>2, de sorte que l'aliasing peut être évité dans votre traitement de l'image.-0.5 to +0.5
(cela ne peut pas être Hz!). Aussi, lorsque j'ai complot contre le spectre de puissance (tel que défini parpsd
dans ma question), je reçois environ 400 parcelles sur le graphique de la psd. Juste ne pas regarder à droite! 🙂AJW, Notez que la gamme de fréquence dépend de qu'est-ce que le taux d'échantillonnage (combien de temps il faut pour générer deux pixels (x,y) et (x+1,y)) qui produisent de vous cette image, elle est où fs en venir. La fréquence fs*(-0.5,0.5), l'unité Hz si vous supposez votre fréquence d'échantillonnage est de 1 Hz.
OriginalL'auteur lennon310