Que signifie «fréquence» dans une image?

29

Je ne comprends pas comment les fréquences sont définies dans les images / photographies. Pour autant que je le comprends maintenant, les hautes fréquences sont comme des choses nettes dans les images, comme des bords ou plus, et les basses fréquences sont un peu l'inverse?

J'aimerais également comprendre le résultat des transformations de Fourier discrètes, comme comment les lire correctement.

Ce serait cool si quelqu'un pouvait m'expliquer ce qui suit:

  1. Quelles sont les fréquences dans les images et comment sont-elles définies?

  2. Comment lisez-vous le résultat d'une transformation de Fourier discrète?

Jakob Abfalter
la source
merci, j'ai déjà lu ça, ça m'a aidé, mais je suis encore un peu désemparé.
Jakob Abfalter

Réponses:

44

Je ne répondrai qu'à la première question: quelles sont les fréquences dans les images?

La transformée de Fourier est une technique mathématique où les mêmes informations d'image sont représentées non pas pour chaque pixel séparément mais plutôt pour chaque fréquence. Pensez-y de cette façon. La mer a des vagues dont certaines sont très lentes (comme les marées), d'autres sont de taille moyenne et d'autres encore sont minuscules comme les ondulations formées d'une rafale. Vous pouvez les considérer comme trois vagues distinctes, mais à chaque point de la surface de la mer et à un moment donné, vous obtenez une seule hauteur d'eau.

Il en va de même pour les images. Vous pouvez penser à l'image composée de différentes ondes ou fréquences. Pour créer votre image, commencez par la couleur moyenne (en fait, penser aux images en niveaux de gris est plus facile). Ajoutez ensuite des vagues de longueurs d'ondes et de force différentes pour augmenter lentement les détails de l'image.

Image source:

Image source

Première fréquence (moyenne):

Moyenne

La deuxième fréquence le long de la dimension verticale est une onde commençant à zéro en bas de l'image, montant, redevenant nulle le long de l'horizon centré et tombant en dessous de zéro pour finalement devenir nulle en haut de l'image. (J'ai décrit une série de Fourier sans déphasage, mais l'analogie est toujours valable.)

Ici, vous pouvez voir la deuxième fréquence le long de l'horizontale et de la verticale. Notez que vous pouvez distinguer où la montagne sera (sombre) et où le ciel et le lac seront (plus clairs).

Deuxième fréquence:

Premier composant

Chaque vague ou fréquence supplémentaire apporte plus d'ondulations et, en tant que telle, plus de détails. Pour obtenir des images différentes, la hauteur / amplitude de l'onde peut être modifiée ainsi que le point de départ de l'onde, également appelé phase.

Troisième fréquence:

Troisième

Fait intéressant, la quantité d'informations est la même dans cette représentation et on peut aller et venir entre les images normales (domaine spatial) et les images transformées de Fourier (domaine fréquentiel). Dans le domaine des fréquences, nous devons conserver les informations de toutes les fréquences ainsi que les informations d'amplitude et de phase.

Ici, il utilise 50% des fréquences:

50%

Il existe des variantes de tout cela, avec des distinctions à faire entre la série de Fourier, la transformée de Fourier et la transformée de Fourier discrète et la transformée en cosinus discrète (DCT).

Une application intéressante est l'utilisation d'algorithmes de compression comme JPEG. Ici, le DCT est utilisé pour enregistrer davantage de parties importantes de l'image (les basses fréquences) et moins de hautes fréquences.

J'ai écrit ceci dans l'espoir que les lecteurs novices puissent acquérir une compréhension de base de l'idée des transformées de Fourier. Pour cela j'ai fait quelques simplifications que j'espère que les lecteurs les plus avancés me pardonneront.

Animé

La vidéo générée par Thomas Devoogdt peut être visionnée sur Vimeo .

Animé


Fréquences de post-traitement

Il existe de nombreuses méthodes qui s'appuient sur les fréquences pour le post-traitement, principalement parce que nous ne regardons jamais les pixels individuellement. De nombreux algorithmes fonctionnent sur la fréquence car il est plus naturel de penser à eux de cette façon. Mais aussi parce que la transformée de Fourier contient les mêmes informations, nous pouvons exprimer n'importe quelle opération mathématique (ou étape de post-traitement) dans la fréquence et les domaines spatiaux! Parfois, la description au niveau des pixels est meilleure, mais souvent la description de la fréquence est meilleure. (Mieux signifie principalement plus rapide dans ce contexte.)

Je voudrais souligner une technique sans raison particulière, sauf que ce sont les artistes qui travaillent directement avec les fréquences et c'est la * séparation des fréquences *. Je ne vais pas le décrire, mais vous pouvez voir comment cela fonctionne sur YouTube pour Photoshop et GIMP.

Vous créez deux couches, l'une avec les basses fréquences et l'autre avec les hautes fréquences. Pour les portraits, vous pouvez effectuer un lissage de la peau sur les hautes fréquences sans affecter les tons chair dans les basses fréquences.

Code

Ceci est du code pour générer les exemples ci-dessus. Il peut être exécuté comme un simple programme Python.

from PIL import Image
from numpy.fft import rfft2, irfft2
import numpy as np

def save_dims(ft, low, high, name):
    ft2 = np.zeros_like(ft)
    # copy the frequencies from low to high but all others stay zero.
    ft2[low:high, low:high] = ft[low:high, low:high]
    save(ft2, name)

def save(ft, name):
    rft = irfft2(ft)
    img = Image.fromarray(rft)
    img = img.convert('L')
    img.save(name)

def main():
    # Convert input into grayscale and save.
    img = Image.open("input.jpg")
    img = img.convert('L')
    img.save('input_gray.png')
    # Do Fourier Transform on image.
    ft = rfft2(img)
    # Take only zeroth frequency and do Inverse FT and save.
    save_dims(ft, 0, 1, 'output_0.png')
    # Take first two frequencies in both directions.
    save_dims(ft, 0, 2, 'output_1.png')
    save_dims(ft, 0, 3, 'output_2.png')
    # Take first 50% of frequencies.
    x = min(ft.shape)
    save_dims(ft, 0, x/2, 'output_50p.png')

def generateGif():
    ''' Generates images to be later converted to a gif.
    This requires ImageMagick:
    convert -delay 100 -loop 0 output_*.png animation.gif
    '''
    # Requires images2gif from code.google.com/p/visvis/source/browse/vvmovie/images2gif.py 
    # from images2gif import writeGif

    img = Image.open('input.jpg')
    img = img.convert('L')
    # Resize image before any calculation.
    size = (640,480)
    img.thumbnail(size, Image.ANTIALIAS)
    ft = rfft2(img)

    images = []
    for x in range(0, max(ft.shape)):
        ft2 = np.zeros_like(ft)
        ft2[0:x, 0:x] = ft[0:x,0:x]
        rft = irfft2(ft2)
        img_out = Image.fromarray(rft).convert('L')
        fname = 'animation/output_%05d.jpg' %(x, )
        img_out.save(fname, quality=60, optimize=True)

    #writeGif('animation.gif', images, duration=0.2)


if __name__=='__main__':
    main()
    #generateGif()
Unapiedra
la source
Il convient de préciser que, bien que théoriquement, nous puissions, en supposant que nous ayons une connaissance infinie de l'image à portée de main, la décomposer en fréquences composantes et la recomposer sans perte ... dans le monde réel, nous ne pouvons pas. La convolution d'une image du monde réel, qui se produit à chaque "interface" le long du pipeline optique, est effectivement un processus irréversible. Nous ne pouvons jamais connaître tous les facteurs de convolution, et la reconstruction d'une FFT dans une image est donc difficile, et des modifications extrêmes entraînent généralement des artefacts et une perte de données.
jrista
@jrista Je pense que le point de vue d'Unapiedra sur la réversibilité était qu'une fois que vous travaillez avec une image numérique (un tableau de pixels sur un ordinateur), vous pouvez aller dans l'espace des fréquences et inversement, et obtenir la même image avec laquelle vous avez commencé. Vous regardez une image plus grande du système d'imagerie physique (lentilles et autres), où les limites du monde réel s'immiscent.
coneslayer
3
Le commentaire de jrista est trompeur en ce que FT est blâmé pour la perte d'informations. Bien sûr, la photographie est un processus avec perte, tout comme le post-traitement. Si je convertis une image discrète en espace Fourier, y fais un traitement avec perte, puis reconvertis, bien sûr, je perds des informations. Mais cela se produit dans l'étape de traitement et non dans l'étape de conversion. Certes, en raison de la précision de la machine, chaque opération mathématique perd des informations, mais si nous parlons d'images de 8 bits par canal, nous ne remarquerons pas d'erreurs de précision de la machine.
Unapiedra
1
@Turkeyphant, je ne me souviens pas pourquoi je mentionne la diagonale dans ce contexte. Vous pouvez voir que la direction principale de la deuxième fréquence semble être cette diagonale particulière. C'est peut-être pour ça. Pour répondre à votre question, vous n'avez besoin que de deux axes pour représenter une image 2D. Il est important que les deux axes soient orthogonaux. Les axes horizontal et vertical remplissent ce critère. (Ils sont également pratiques.) Avec des images discrètes (c'est-à-dire composées de pixels), l'aliasing aggravera tous les autres angles.
Unapiedra
1
@Turkeyphant correction, Unapiedra a décrit la deuxième fréquence , pas la première, comme 0, -1, 0, +1, 0. Les paragraphes décrivant la 2e fréquence se trouvent immédiatement après la première image de fréquence (l'image grise uniforme), et je peux voyez comment il pourrait être tentant de lire ce paragraphe comme une description de l'image précédente (les articles montrent souvent une image, puis la décrivent dans le texte suivant l'image), mais pas dans ce cas. =)
scottbb
8

Je vais essayer d'expliquer avec les termes mathématiques les plus simples possibles. Si vous voulez sauter le calcul, passez à la partie II, si vous voulez obtenir la réponse courte, passez à la partie III

Partie I

La fréquence d'un signal signifie le nombre d'occurrences d'un événement répétitif par unité de temps. Donc, si l'unité de temps est la seconde, la fréquence est mesurée avec Herz: 1Hz = 1 / s. Ainsi, un signal à 100 Hz a un motif qui se répète 100 fois par seconde.

Le signal le plus élémentaire (du point de vue du traitement du signal) est un signal sinusal.

y (t) = sin (2πft)

où f est la fréquence de ce signal sinusal, et t est le temps. Si ce signal était sain et que f était autour de 50 Hz, vous entendrez un son de basse très bas. avec une fréquence plus élevée comme 15 kHz, ce sera une tonalité plus élevée.

Maintenant, pour généraliser le concept, le signal pourrait être un signal spatial, au lieu d'un signal temporel ... comme si vous dessiniez l'onde sinusale sur une feuille de papier, avec un axe appelé x pointant vers la droite et l'axe y perpendiculaire à l'axe x.

y (x) = sin (2πfx)

où f est la fréquence du signal et x est la variable spatiale. f n'est plus mesuré ici avec 1 / s, mais 1 / (unité d'espace).

Fourier, un mathématicien français a montré que vous pouvez générer n'importe quel signal en ajoutant un certain nombre de signaux sinus et cosinus avec différentes amplitudes et fréquences. C'est ce qu'on appelle l'analyse de Fourier.

En utilisant l'analyse de Fourier, il est possible d'écrire n'importe quelle fonction y (x) comme une somme de signaux sinus et cosinus de fréquences différentes, de sorte qu'une fonction y (x) peut être réécrite en termes de plusieurs fonctions liées à la fréquence Y (f). On peut dire que y (x) = Some_Function (Y (f)). ou Y (f) = Reverse_of_Some_Function (y (x))

La transformation de Fourier est la fonction F qui transforme un signal du domaine x au domaine fréquentiel.

Y(f) = F( y(x) )

y(x) = F_inv(Y(f))

F est une fonction analogique, la DFT à transformation de Fourier discrète est l'approximation numérique de F. La FFT à transformation de Fourier rapide est un moyen de faire de la DFT optimisée pour la vitesse.

D'accord...

Partie II

Maintenant, les images d'ordinateur sont composées de pixels, et chaque pixel a une valeur d'intensité pour les valeurs RVB rouge, vert, bleu. Dans les images en niveaux de gris, l'intensité pour R, G, B de tout pixel est égale, R = G = B = I afin que nous puissions parler de I pour les images en niveaux de gris.

L'image en niveaux de gris 800px X 100px ci-dessous a été générée en utilisant I (x) = sin (2πfx) où f = 1 répétition / 800px = 0,00125 répétition / px

entrez la description de l'image ici

Vous pouvez le générer vous-même avec Python3

from PIL import Image, ImageDraw
from math import sin, pi

img = Image.new('RGB', (800,100), color='black')
draw = ImageDraw.draw(img)

#cacluate the frequency
n = 10 #repetitions
f = n/img.width #

#iterate of the width pixels
for x in range(img.width):
 #calculate the intensity i in that pixel x
 y = sin(2*pi*f*x - pi/2) #this will generate values between -1 and +1, -pi/2 is to make sure that i starts with value 0 in the next line.
 i = (255+255*y)/2 #shifting and scaling y so that the values are between 0 and 255
 draw.line((i,0,i,img.height), fill=(int(i),int(i),int(i)))

img.show()

L'image en niveaux de gris 800px X 100px ci-dessous a été générée en utilisant I (x) = sin (2πfx) où f = 10 répétitions / 800px = 0,0125 répétitions / px

entrez la description de l'image ici

Maintenant, il est facile de voir que cette image a une fréquence horizontale de 10. Augmentons la fréquence d'un facteur 10, de sorte que n = 100. f = 100/800 = 1/8 = 0,125 répétitions / px:

entrez la description de l'image ici

Comme mentionné précédemment, vous pouvez représenter n'importe quel signal (image en niveaux de gris 1D) comme une série de signaux sinusoïdaux (images sinus en niveaux de gris 1D) avec différentes fréquences.

Partie III

Ainsi, une image en niveaux de gris 1D A a des fréquences plus élevées qu'une autre image en niveaux de gris B si A a des détails "plus fins".

Vous pouvez généraliser ce principe aux images 2D et même 3D colorées. Plus les "détails" d'une image sont fins, plus le contenu en fréquence de cette image est élevé.

Un ciel bleu est donc de basse fréquence par rapport à une image de fleur.

Vous pouvez en savoir plus à ce sujet en lisant l'analyse de Fourier et le traitement d'image numérique.

Ouss
la source
4

En bref, la fréquence fait référence au taux de changement. Plus précisément, la fréquence est l'inverse de la période du changement, c'est-à-dire le temps qu'il faut pour passer d'une luminosité (ou autre) à une luminosité différente et inversement. Plus le changement est rapide (par exemple, du clair au foncé), plus la "fréquence" visuelle requise pour représenter cette partie de l'image est élevée.

En d'autres termes, vous pouvez considérer la fréquence dans une image comme le taux de changement. Les parties de l'image qui changent rapidement d'une couleur à une autre (par exemple, les bords nets) contiennent des fréquences élevées et les parties qui changent progressivement (par exemple, de grandes surfaces avec des couleurs unies) ne contiennent que des basses fréquences.

Lorsque nous parlons de DCT et de FFT et d'autres transformations similaires, nous les faisons généralement sur une partie d'une image (par exemple pour la compression JPEG, la détection des contours, etc.). Il est donc plus logique de parler des transformations, alors, dans le contexte d'un bloc de transformation d'une taille donnée.

Imaginez, si vous voulez, un bloc de 32 pixels x 32 pixels de données d'image. (Ce nombre est arbitraire.) Supposons que l'image soit un simple dégradé blanc sur le côté gauche, noir au milieu et blanc sur le côté droit. Nous dirions que ce signal a une période qui est à peu près une longueur d'onde par 32 pixels de largeur, car il passe à nouveau par un cycle complet du blanc au noir au blanc tous les 32 pixels.

Nous pourrions arbitrairement appeler cette fréquence "1" - 1 cycle par 32 pixels, c'est-à-dire. Je me souviens vaguement que cela est communément appelé θ dans les manuels de transformation, ou peut-être θ / 2, mais je me souviens peut-être mal. Quoi qu'il en soit, nous l'appellerons 1 pour l'instant, car c'est vraiment arbitraire dans un sens absolu; ce qui compte, c'est la relation entre les fréquences dans un sens relatif. :-)

Supposons que vous ayez une deuxième image qui est blanche à un bord, puis s'estompe deux fois plus rapidement pour qu'elle passe du blanc au noir, au blanc, au noir et au blanc à nouveau à l'autre bord. Nous appellerions alors cette fréquence "2" car elle change deux fois plus souvent sur la largeur de ce bloc de 32 pixels.

Si nous voulions reproduire ces images simples, nous pourrions littéralement dire que chaque ligne se compose d'un signal avec une fréquence de 1 ou 2, et vous sauriez à quoi ressemblent les images. Si les images passaient du noir à 50% de gris, vous pourriez faire la même chose, mais il faudrait dire qu'elles avaient une fréquence de 1 ou 2 à une intensité de 50%.

Les images du monde réel, bien sûr, ne sont pas seulement un simple dégradé. L'image change fréquemment et pas périodiquement lorsque vous numérisez de gauche à droite. Cependant, dans un bloc suffisamment petit (par exemple, 8 pixels, 16 pixels), vous pouvez approximer cette ligne de pixels comme la somme d'une série de signaux, en commençant par la moyenne des valeurs de pixels de la ligne, suivie de la quantité de " fréquence 0,5 "signal (noir d'un côté, passant au blanc) pour se fondre (ou avec une quantité négative, la quantité de ce signal à soustraire), suivie de la quantité de fréquence 1, fréquence 2, fréquence 4, etc. .

Maintenant, une image est unique en ce qu'elle a une fréquence dans les deux sens; il peut devenir plus clair et plus sombre en se déplaçant à la fois horizontalement et verticalement. Pour cette raison, nous utilisons des transformations 2D DCT ou FFT au lieu de 1D. Mais le principe est toujours fondamentalement le même. Vous pouvez représenter précisément une image 8x8 avec une grille 8x8 de godets de taille similaire.

Les images sont également plus complexes en raison des couleurs, mais nous l'ignorerons pour l'instant et supposerons que nous ne regardons qu'une seule image en niveaux de gris comme vous pourriez l'obtenir en regardant le canal rouge d'une photographie de manière isolée.

Quant à la façon de lire les résultats d'une transformation, cela dépend si vous regardez une transformation 1D ou une transformation 2D. Pour une transformation 1D, vous disposez d'une série de bacs. Le premier est la moyenne de toutes les valeurs d'entrée. La seconde est la quantité de signal de fréquence 1 à ajouter, la troisième est la quantité de signal de fréquence 2 à ajouter, etc.

Pour une transformation 2D, vous avez une grille de valeurs n x n . La partie supérieure gauche est généralement cette moyenne, et lorsque vous allez dans le sens horizontal, chaque bucket contient la quantité de signal à mélanger avec une fréquence horizontale de 1, 2, 4, etc. et lorsque vous allez dans le sens vertical, il est la quantité de signal à mélanger avec une fréquence verticale de 1, 2, 4, etc.

C'est, bien sûr, l'histoire complète si vous parlez d'un DCT; en revanche, chaque bac d'une FFT contient des parties réelles et imaginaires. La FFT est toujours basée sur la même idée de base (en quelque sorte), sauf que la façon dont les fréquences sont mappées sur les bacs est différente et les mathématiques sont plus épineuses. :-)

Bien sûr, la raison la plus courante pour générer ce type de transformation est d'aller encore plus loin et de jeter certaines des données. Par exemple, le DCT est utilisé dans la compression JPEG. En lisant les valeurs en zigzag en commençant par le coin supérieur gauche (la moyenne) et en se déplaçant vers le coin inférieur droit, les données les plus importantes (les informations moyenne et basse fréquence) sont enregistrées en premier, suivies par les données de fréquence progressivement plus élevées. À un moment donné, vous dites essentiellement "c'est assez bon" et jetez les données les plus hautes fréquences. Cela lisse essentiellement l'image en jetant ses détails fins, mais vous donne toujours approximativement l'image correcte.

Et l'IIRC, les FFT sont également parfois utilisés pour la détection des contours, où vous jetez toutes les composantes sauf les hautes fréquences pour détecter les zones de contraste élevé sur les contours nets.

National Instruments a un bel article qui explique cela avec des images. :-)

dgatwood
la source
0

Imaginez numériser l'image ligne par ligne avec une cellule photoélectrique et envoyer les résultats à un traceur (ces machines plates qui font des vagues noires sur papier), un oscilloscope (ces boîtes qui font des vagues vertes scintillantes sur un écran) ou un analyseur de spectre (de plus grandes boîtes qui faire des clôtures vertes ou multicolores). Ou même un haut-parleur. Plus les structures d'une image sont fines, plus les fréquences (la hauteur du haut-parleur) du signal montré / entendu seront élevées. Plus il y a de contraste dans les structures fines, plus l'amplitude des parties haute fréquence du signal sera élevée.

rackandboneman
la source