¿Qué significa "frecuencia" en una imagen?

29

No entiendo cómo se definen las frecuencias en imágenes / fotografías. Por lo que yo entiendo ahora, las frecuencias altas son como cosas nítidas en las imágenes, como bordes o algo así, y las frecuencias bajas son todo lo contrario.

También me gustaría entender el resultado de las transformaciones discretas de Fourier, como cómo leerlas correctamente.

Sería genial si alguien pudiera explicarme lo siguiente:

  1. ¿Qué son las frecuencias en las imágenes y cómo se definen?

  2. ¿Cómo se lee el resultado de una transformación discreta de Fourier?

Jakob Abfalter
fuente
gracias, ya leí esto, me ayudó, pero todavía estoy un poco despistado.
Jakob Abfalter

Respuestas:

44

Solo responderé la primera pregunta: ¿Qué son las frecuencias en las imágenes?

La Transformada de Fourier es una técnica matemática en la que se representa la misma información de imagen no para cada píxel por separado, sino para cada frecuencia. Piensa en ello de esta manera. El mar tiene olas, algunas de las cuales se mueven muy lentamente (como las mareas), otras son de tamaño mediano y otras son pequeñas como las ondas formadas por una ráfaga. Puedes pensar en ellas como tres olas separadas, pero en cada punto de la superficie del mar y en un momento en el tiempo, obtienes solo una altura de agua.

Lo mismo se aplica a las imágenes. Puedes pensar en la imagen compuesta de varias ondas o frecuencias. Para crear su imagen, comience con el color promedio (en realidad, pensar en imágenes en escala de grises es más fácil). Luego agregue olas de diferentes longitudes de onda y fuerza para construir lentamente detalles en la imagen.

Imagen de origen:

Imagen de origen

Primera frecuencia (promedio):

Promedio

La segunda frecuencia a lo largo de la dimensión vertical es una onda que comienza en cero en la parte inferior de la imagen, subiendo, volviendo a cero a lo largo del horizonte centrado y cayendo por debajo de cero para finalmente convertirse en cero en la parte superior de la imagen. (Describí una serie de Fourier sin cambio de fase, pero la analogía aún se mantiene).

Aquí puede ver la segunda frecuencia a lo largo de la horizontal y vertical. Tenga en cuenta que puede distinguir dónde estará la montaña (oscura) y dónde estará el cielo y el lago (más clara).

Segunda frecuencia:

Primer componente

Cada onda o frecuencia adicional trae consigo más ondas y, como tal, más detalles. Para obtener diferentes imágenes, se puede cambiar la altura / amplitud de la onda, así como el punto de partida de la onda, también llamada Fase.

Tercera frecuencia:

Tercero

Curiosamente, la cantidad de información es la misma en esta representación y uno puede ir y venir entre imágenes normales (dominio espacial) e imágenes transformadas de Fourier (dominio de frecuencia). En el dominio de la frecuencia necesitamos mantener información de todas las frecuencias junto con la información de amplitud y fase.

Aquí está utilizando el 50% de las frecuencias:

50%

Hay variantes de todo esto, con distinciones que deben hacerse entre la Serie Fourier, Transformada de Fourier y Transformada de Fourier discreta y Transformada de coseno discreta (DCT).

Una aplicación interesante es el uso de algoritmos de compresión como JPEG. Aquí, el DCT se usa para guardar más partes importantes de la imagen (las frecuencias bajas) y menos de las frecuencias altas.

Escribí esto con la esperanza de que los lectores novatos puedan obtener una comprensión básica de la idea de las transformadas de Fourier. Por eso hice algunas simplificaciones que espero que los lectores más avanzados me perdonen.

Animado

El video generado por Thomas Devoogdt se puede ver en Vimeo .

animado


Frecuencias en el posprocesamiento

Existen numerosos métodos que dependen de las frecuencias para el procesamiento posterior, principalmente porque nunca observamos píxeles individuales individualmente. Muchos algoritmos funcionan en frecuencia porque es más natural pensar en ellos de esta manera. ¡Pero también porque la Transformada de Fourier contiene la misma información que podemos expresar cualquier operación matemática (o paso de procesamiento posterior) en la frecuencia y los dominios espaciales! A veces, la descripción en píxeles es mejor, pero a menudo la descripción de frecuencia es mejor. (Mejor significa principalmente más rápido en este contexto).

Una técnica que me gustaría señalar sin ninguna razón en particular, excepto que son los artistas que trabajan directamente con las frecuencias y es la * separación de frecuencias *. No voy a describirlo, pero puedes ver cómo funciona en YouTube para Photoshop y GIMP.

Crea dos capas, una con las frecuencias bajas y otra con las frecuencias altas. Para los retratos, puede suavizar la piel en las frecuencias altas sin afectar los tonos de la piel en las frecuencias bajas.

Código

Este es un código para generar los ejemplos anteriores. Se puede ejecutar como un simple programa de 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
fuente
Debería aclararse que, aunque en teoría podríamos, suponiendo que tuviéramos un conocimiento infinito de la imagen en cuestión, descomponerla en frecuencias componentes y recomponerla sin pérdida ... en el mundo real no podemos. La convolución de una imagen del mundo real, que ocurre en todas y cada una de las "interfaces" a lo largo de la tubería óptica, es efectivamente un proceso irreversible. Nunca podemos conocer todos los factores de convolución, y por lo tanto la reconstrucción de una FFT en una imagen es difícil, y las modificaciones extremas generalmente resultan en artefactos y pérdida de datos.
jrista
@jrista Creo que el punto que Unapiedra estaba haciendo sobre la reversibilidad era que una vez que trabajas con una imagen digital (una matriz de píxeles en una computadora), puedes ir al espacio de frecuencia y viceversa, y obtener la misma imagen con la que comenzaste. Estás viendo una imagen más grande del sistema de imágenes físicas (lentes y demás), donde se introducen limitaciones del mundo real.
coneslayer
3
El comentario de Jrista es engañoso, ya que se culpa a FT por la pérdida de información. Por supuesto, la fotografía es un proceso con pérdida y también lo es el procesamiento posterior. Si convierto una imagen discreta a Fourier Space, hago un procesamiento con pérdida allí y luego la vuelvo a convertir, por supuesto, pierdo información. Pero sucede en el paso de procesamiento y no en el paso de conversión. Es cierto que, debido a la precisión de la máquina, cada operación matemática pierde información, pero si hablamos de imágenes de 8 bits por canal, no notaremos errores de precisión de la máquina.
Unapiedra
1
@Turkeyphant, no recuerdo por qué menciono diagonal en ese contexto. Puede ver que la dirección principal de la segunda frecuencia parece ser esa diagonal particular. Tal vez por eso. Para responder a su pregunta, solo necesita dos ejes para representar una imagen 2D. Es importante que los dos ejes sean ortogonales. Los ejes horizontal y vertical cumplen ese criterio. (También son prácticas). Con imágenes discretas (es decir, compuestas de píxeles), el alias empeorará todos los demás ángulos.
Unapiedra
1
@Turkeyphant corrección, Unapiedra describió la segunda frecuencia , no la primera, como 0, -1, 0, +1, 0. Los párrafos que describen la segunda frecuencia son inmediatamente posteriores a la imagen de la primera frecuencia (la imagen gris uniforme), y puedo vea cómo puede ser tentador leer ese párrafo como una descripción de la imagen anterior (los artículos a menudo muestran una imagen y luego la describen en el texto que sigue a la imagen), pero no en este caso. =)
scottbb
8

Trataré de explicar con los términos matemáticos más simples posibles. Si quieres saltarte las matemáticas, salta a la parte II, si quieres obtener la respuesta corta salta a la Parte III

Parte 1

La frecuencia de una señal significa el número de ocurrencias de un evento repetitivo por unidad de tiempo. Entonces, si la unidad de tiempo es segundos, la frecuencia se mide con Herz: 1Hz = 1 / s. Entonces, una señal con 100Hz tiene un patrón que se repite 100 veces por segundo.

La señal más básica (desde el punto de vista del procesamiento de señales) es una señal sinusal.

y (t) = sin (2πft)

donde f es la frecuencia de esta señal sinusal yt es el tiempo. Si esta señal era sólida y f era de alrededor de 50 Hz, escuchará un tono de graves muy bajo. con una frecuencia más alta como 15kHz será un tono más alto.

Ahora, para generalizar el concepto, la señal podría ser una señal espacial, en lugar de una señal temporal ... como si dibujara la onda sinusal en un trozo de papel, con un eje llamado x apuntando hacia la derecha, y el eje y perpendicular al eje x.

y (x) = sin (2πfx)

donde f es la frecuencia de la señal yx es la variable espacial. f aquí ya no se mide con 1 / s, sino con 1 / (unidad de espacio).

Fourier, un matemático francés, demostró que puede generar cualquier señal agregando una serie de señales seno y coseno con diferentes amplitudes y frecuencias. Eso se llama Análisis de Fourier.

Usando el análisis de Fourier es posible escribir cualquier función y (x) como una suma de señales seno y coseno con diferentes frecuencias, por lo que una función y (x) puede reescribirse en términos de varias funciones relacionadas con la frecuencia Y (f). Se puede decir que y (x) = Some_Function (Y (f)). o Y (f) = Reverse_of_Some_Function (y (x))

La transformación de Fourier es la función F que transforma una señal del dominio x al dominio de frecuencia.

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

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

F es una función analógica, la transformación discreta de Fourier DFT es la aproximación numérica de F. La transformación rápida de Fourier FFT es una forma de hacer DFT optimizado para la velocidad.

Okay...

Parte II

Ahora las imágenes de computadora están compuestas de píxeles, y cada píxel tiene un valor de intensidad para los valores Rojo, Verde, Azul, también conocido como RGB. En imágenes en escala de grises, la intensidad para R, G, B de cualquier píxel es igual, R = G = B = I, por lo que podemos hablar de I para imágenes en escala de grises.

La imagen en escala de grises de 800px X 100px a continuación se generó usando I (x) = sin (2πfx) donde f = 1 repetición / 800px = 0.00125 repetición / px

ingrese la descripción de la imagen aquí

Puede generarlo usted mismo con 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()

La imagen de escala de grises 800px X 100px a continuación se generó usando I (x) = sin (2πfx) donde f = 10repeticiones / 800px = 0.0125 repeticiones / px

ingrese la descripción de la imagen aquí

Ahora es fácil ver que esta imagen tiene una frecuencia horizontal de 10. Aumentemos la frecuencia en un factor de 10, de modo que n = 100. f = 100/800 = 1/8 = 0.125 repeticiones / px:

ingrese la descripción de la imagen aquí

Como se mencionó anteriormente, puede representar cualquier señal (imagen en escala de grises 1D) como una serie de suma de señales sinusoidales (imágenes sinusoidales en escala de grises 1D) con diferentes frecuencias.

Parte III

Entonces, una imagen 1D en escala de grises A tiene frecuencias más altas que otra imagen B en escala de grises si A tiene detalles "más finos".

Puede generalizar ese principio a imágenes coloreadas en 2D e incluso en 3D. Cuanto más finos sean los "detalles" de una imagen, mayor será el contenido de frecuencia de esa imagen.

Entonces, un cielo azul es de baja frecuencia en comparación con la imagen de una flor.

Puede obtener más información al respecto leyendo sobre Análisis de Fourier y sobre Procesamiento de imagen digital.

Ouss
fuente
4

Brevemente, la frecuencia se refiere a la tasa de cambio. Más precisamente, la frecuencia es la inversa del período del cambio, es decir, la cantidad de tiempo que lleva pasar de un brillo (o lo que sea) a un brillo diferente y viceversa. Cuanto más rápido cambie (por ejemplo, de claro a oscuro), mayor será la "frecuencia" visual requerida para representar esa parte de la imagen.

En otras palabras, puede pensar en la frecuencia en una imagen como la tasa de cambio. Las partes de la imagen que cambian rápidamente de un color a otro (por ejemplo, bordes afilados) contienen frecuencias altas, y las partes que cambian gradualmente (por ejemplo, superficies grandes con colores sólidos) contienen solo frecuencias bajas.

Cuando hablamos de DCT y FFT y otras transformaciones similares, generalmente las hacemos en una parte de una imagen (por ejemplo, para compresión JPEG, detección de bordes, etc.). Tiene más sentido hablar sobre las transformaciones, entonces, en el contexto de un bloque de transformación de un tamaño dado.

Imagine, si lo desea, un bloque de datos de imagen de 32 píxeles x 32 píxeles. (Este número es arbitrario). Suponga que la imagen es un gradiente simple que es blanco en el lado izquierdo, negro en el medio y blanco en el lado derecho. Diríamos que esta señal tiene un período que es aproximadamente una longitud de onda por cada 32 píxeles de ancho, porque pasa por un ciclo completo de blanco a negro a blanco nuevamente cada 32 píxeles.

Podríamos llamar arbitrariamente a esta frecuencia "1" - 1 ciclo por 32 píxeles, es decir. Recuerdo vagamente que esto se llama comúnmente θ en los libros de texto de transformación, o tal vez θ / 2, pero podría estar recordando mal. De cualquier manera, lo llamaremos 1 por ahora, porque esto es verdaderamente arbitrario en un sentido absoluto; lo que importa es la relación entre frecuencias en un sentido relativo. :-)

Suponga que tiene una segunda imagen que es blanca en un borde, luego se desvaneció el doble de rápido para pasar del blanco al negro, al blanco, al negro y al blanco nuevamente en el otro borde. Entonces llamaríamos a esa frecuencia "2" porque cambia el doble de veces en el ancho de ese bloque de 32 píxeles.

Si quisiéramos reproducir esas imágenes simples, literalmente podríamos decir que cada fila consiste en una señal con una frecuencia de 1 o 2, y usted sabría cómo son las imágenes. Si las imágenes pasaron del negro al 50% de gris, podría hacer lo mismo, pero tendría que decir que tenían una frecuencia de 1 o 2 a una intensidad del 50%.

Las imágenes del mundo real, por supuesto, no son solo un simple gradiente. La imagen cambia con frecuencia y no periódicamente a medida que escanea de izquierda a derecha. Sin embargo, dentro de un bloque lo suficientemente pequeño (por ejemplo, 8 píxeles, 16 píxeles) puede aproximar esa fila de píxeles como la suma de una serie de señales, comenzando con el promedio de los valores de píxeles en la fila, seguido de la cantidad de " señal de frecuencia 0.5 "(negra en un lado, desvaneciéndose a blanco) para mezclar (o con una cantidad negativa, la cantidad de esa señal para restar), seguida de la cantidad de frecuencia 1, frecuencia 2, frecuencia 4, y así sucesivamente .

Ahora una imagen es única porque tiene frecuencia en ambas direcciones; puede volverse más claro y más oscuro cuando se mueve tanto horizontal como verticalmente. Por esta razón, usamos transformaciones 2D DCT o FFT en lugar de 1D. Pero el principio sigue siendo básicamente el mismo. Puede representar con precisión una imagen de 8x8 con una cuadrícula de 8x8 de cubos de tamaño similar.

Las imágenes también son más complejas debido a los colores, pero lo ignoraremos por ahora, y supondremos que solo estamos viendo una sola imagen en escala de grises como se podría ver mirando el canal rojo de una fotografía de forma aislada.

En cuanto a cómo leer los resultados de una transformación, eso depende de si está viendo una transformación 1D o una transformación 2D. Para una transformación 1D, tiene una serie de contenedores. El primero es el promedio de todos los valores de entrada. El segundo es la cantidad de la señal de frecuencia 1 para agregar, el tercero es la cantidad de la señal de frecuencia 2 para agregar, etc.

Para una transformación 2D, tiene una cuadrícula de valores n x n . La parte superior izquierda es típicamente ese promedio, y a medida que avanza en dirección horizontal, cada segmento contiene la cantidad de señal para mezclar con una frecuencia horizontal de 1, 2, 4, etc. y a medida que avanza en dirección vertical, es la cantidad de señal para mezclar con una frecuencia vertical de 1, 2, 4, etc.

Esa es, por supuesto, la historia completa si estás hablando de un DCT; por el contrario, cada contenedor para una FFT contiene partes reales e imaginarias. El FFT todavía se basa en la misma idea básica (más o menos), excepto que la forma en que las frecuencias se asignan a los contenedores es diferente y las matemáticas son más complicadas. :-)

Por supuesto, la razón más común para generar este tipo de transformaciones es ir un paso más allá y descartar algunos de los datos. Por ejemplo, el DCT se usa en compresión JPEG. Al leer los valores en un patrón de zig-zag que comienza con la esquina superior izquierda (el promedio) y se mueve hacia la esquina inferior derecha, los datos más importantes (la información de frecuencia media y baja) se registran primero, seguidos de los datos de frecuencia progresivamente más alta. En algún momento, básicamente dices "esto es lo suficientemente bueno" y descartas los datos de mayor frecuencia. Esto esencialmente suaviza la imagen al desechar sus detalles finos, pero aún le da aproximadamente la imagen correcta.

Y IIRC, las FFT también se utilizan a veces para la detección de bordes, donde se descartan todos los componentes, excepto los de alta frecuencia, como un medio de detectar las áreas de alto contraste en los bordes afilados.

National Instruments tiene un buen artículo que explica esto con imágenes. :-)

dgatwood
fuente
0

Imagine escanear la imagen línea por línea con una fotocélula y enviar los resultados a un trazador (estas máquinas planas que producen ondas negras en el papel), un osciloscopio (estas cajas que producen ondas verdes parpadeantes en una pantalla) o un analizador de espectro (cajas más grandes que hacer cercas verdes o multicolores). O incluso un altavoz. Cuanto más finas sean las estructuras en una imagen, más altas serán las frecuencias (el tono en el altavoz) de la señal mostrada / escuchada. Cuanto más contraste haya en las estructuras finas, mayor será la amplitud de las partes de alta frecuencia de la señal.

rackandboneman
fuente