Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Filtros de Paso Bajo y Paso Alto | Procesamiento de Imágenes con OpenCV
Fundamentos de Visión por Computadora

bookFiltros de Paso Bajo y Paso Alto

Uno de los principales beneficios de la Transformada de Fourier es que permite realizar filtrado pasa-altas y pasa-bajas.

Después de aplicar la Transformada de Fourier:

dft = np.fft.fft2(image)
dft_shift = np.fft.fftshift(dft)

es necesario crear una máscara de filtrado

Filtrado Pasa-Bajas (Desenfoque)

Un filtro pasa-bajas elimina los componentes de alta frecuencia, lo que da como resultado una imagen desenfocada. Máscara pasa-bajas:

rows, cols = image.shape 
crow, ccol = rows // 2, cols // 2 

mask = np.zeros((rows, cols), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1
  • rows, cols = image.shape: obtiene el número de filas y columnas de la imagen en escala de grises;
  • crow, ccol = rows // 2, cols // 2: calcula las coordenadas centrales de la imagen;
  • mask = np.zeros((rows, cols), np.uint8): crea una máscara de ceros con las mismas dimensiones que la imagen;
  • mask[crow-30:crow+30, ccol-30:ccol+30] = 1: establece una región cuadrada de 60×60 en el centro de la máscara en 1, permitiendo que solo los componentes de baja frecuencia (cerca del centro del dominio de frecuencia) pasen, mientras filtra los detalles de alta frecuencia.

Filtrado de alta frecuencia (Detección de bordes)

Un filtro de alta frecuencia elimina los componentes de baja frecuencia y realza los bordes. Máscara de alta frecuencia:

highpass_mask = np.ones((rows, cols), np.uint8)
highpass_mask[crow-5:crow+5, ccol-5:ccol+5] = 0
  • highpass_mask = np.ones((rows, cols), np.uint8): inicializa una máscara de unos con las mismas dimensiones que la imagen, lo que significa que inicialmente se permiten pasar todas las frecuencias;
  • highpass_mask[crow-5:crow+5, ccol-5:ccol+5] = 0: establece un pequeño cuadrado de 10×10 en el centro (región de baja frecuencia) en cero, bloqueando efectivamente esas frecuencias.

Aplicación del filtro

Después de crear la máscara, se debe aplicar un filtro y transformar la imagen de nuevo al dominio espacial:

dft_filtered = dft_shift * mask

dft_inverse = np.fft.ifftshift(dft_filtered) # Inverse shifting
image_filtered = np.fft.ifft2(dft_inverse) # Inverse transformation
image_filtered = np.abs(image_filtered) # Remove negative values
  • dft_filtered = dft_shift * mask: aplica la máscara en el dominio de la frecuencia (por ejemplo, pasa bajos o pasa altos) mediante la multiplicación elemento a elemento con la DFT desplazada de la imagen;
  • dft_inverse = np.fft.ifftshift(dft_filtered): revierte el desplazamiento aplicado anteriormente para devolver los componentes de frecuencia a sus posiciones originales;
  • image_filtered = np.fft.ifft2(dft_inverse): calcula la Transformada Inversa de Fourier para convertir los datos de frecuencia filtrados nuevamente al dominio espacial;
  • image_filtered = np.abs(image_filtered): toma el valor absoluto para eliminar cualquier componente imaginario residual, resultando en una imagen filtrada de valores reales.
Tarea

Swipe to start coding

Se proporciona una imagen de una oveja en la variable image y una imagen en el dominio de la frecuencia en la variable dft_shift:

  • Obtener la forma de la matriz image y almacenarla en las variables rows y cols;
  • Calcular el punto central y almacenarlo en crow y ccol;
  • Definir low_mask como un arreglo de ceros con forma (rows, cols) y tipo np.uint8;
  • Seleccionar la región central de 20x20 de low_mask y rellenarla con 1.
  • Definir high_mask como un arreglo de unos con forma (rows, cols) y tipo np.uint8;
  • Seleccionar la región central de 20x20 de high_mask y rellenarla con 0;
  • Aplicar low_mask y high_mask a dft_shift y almacenar las frecuencias filtradas en lowpass_dft_filtered y highpass_dft_filtered respectivamente;
  • Realizar la transformación inversa para lowpass_dft_filtered:
    • Realizar el desplazamiento inverso y almacenar en lowpass_dft_inverse;
    • Realizar la transformación inversa y almacenar la imagen en image_lowpass;
    • Eliminar los valores negativos de image_lowpass.
  • Realizar la transformación inversa para highpass_dft_inverse:
    • Realizar el desplazamiento inverso y almacenar en lowpass_dft_inverse;
    • Realizar la transformación inversa y almacenar la imagen en image_highpass;
    • Eliminar los valores negativos de image_highpass.

Solución

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 2. Capítulo 3
single

single

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Suggested prompts:

Can you explain the difference between high-pass and low-pass filtering in more detail?

How do I choose the size of the mask for filtering?

What are some practical applications of these filters in image processing?

close

Awesome!

Completion rate improved to 3.45

bookFiltros de Paso Bajo y Paso Alto

Desliza para mostrar el menú

Uno de los principales beneficios de la Transformada de Fourier es que permite realizar filtrado pasa-altas y pasa-bajas.

Después de aplicar la Transformada de Fourier:

dft = np.fft.fft2(image)
dft_shift = np.fft.fftshift(dft)

es necesario crear una máscara de filtrado

Filtrado Pasa-Bajas (Desenfoque)

Un filtro pasa-bajas elimina los componentes de alta frecuencia, lo que da como resultado una imagen desenfocada. Máscara pasa-bajas:

rows, cols = image.shape 
crow, ccol = rows // 2, cols // 2 

mask = np.zeros((rows, cols), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1
  • rows, cols = image.shape: obtiene el número de filas y columnas de la imagen en escala de grises;
  • crow, ccol = rows // 2, cols // 2: calcula las coordenadas centrales de la imagen;
  • mask = np.zeros((rows, cols), np.uint8): crea una máscara de ceros con las mismas dimensiones que la imagen;
  • mask[crow-30:crow+30, ccol-30:ccol+30] = 1: establece una región cuadrada de 60×60 en el centro de la máscara en 1, permitiendo que solo los componentes de baja frecuencia (cerca del centro del dominio de frecuencia) pasen, mientras filtra los detalles de alta frecuencia.

Filtrado de alta frecuencia (Detección de bordes)

Un filtro de alta frecuencia elimina los componentes de baja frecuencia y realza los bordes. Máscara de alta frecuencia:

highpass_mask = np.ones((rows, cols), np.uint8)
highpass_mask[crow-5:crow+5, ccol-5:ccol+5] = 0
  • highpass_mask = np.ones((rows, cols), np.uint8): inicializa una máscara de unos con las mismas dimensiones que la imagen, lo que significa que inicialmente se permiten pasar todas las frecuencias;
  • highpass_mask[crow-5:crow+5, ccol-5:ccol+5] = 0: establece un pequeño cuadrado de 10×10 en el centro (región de baja frecuencia) en cero, bloqueando efectivamente esas frecuencias.

Aplicación del filtro

Después de crear la máscara, se debe aplicar un filtro y transformar la imagen de nuevo al dominio espacial:

dft_filtered = dft_shift * mask

dft_inverse = np.fft.ifftshift(dft_filtered) # Inverse shifting
image_filtered = np.fft.ifft2(dft_inverse) # Inverse transformation
image_filtered = np.abs(image_filtered) # Remove negative values
  • dft_filtered = dft_shift * mask: aplica la máscara en el dominio de la frecuencia (por ejemplo, pasa bajos o pasa altos) mediante la multiplicación elemento a elemento con la DFT desplazada de la imagen;
  • dft_inverse = np.fft.ifftshift(dft_filtered): revierte el desplazamiento aplicado anteriormente para devolver los componentes de frecuencia a sus posiciones originales;
  • image_filtered = np.fft.ifft2(dft_inverse): calcula la Transformada Inversa de Fourier para convertir los datos de frecuencia filtrados nuevamente al dominio espacial;
  • image_filtered = np.abs(image_filtered): toma el valor absoluto para eliminar cualquier componente imaginario residual, resultando en una imagen filtrada de valores reales.
Tarea

Swipe to start coding

Se proporciona una imagen de una oveja en la variable image y una imagen en el dominio de la frecuencia en la variable dft_shift:

  • Obtener la forma de la matriz image y almacenarla en las variables rows y cols;
  • Calcular el punto central y almacenarlo en crow y ccol;
  • Definir low_mask como un arreglo de ceros con forma (rows, cols) y tipo np.uint8;
  • Seleccionar la región central de 20x20 de low_mask y rellenarla con 1.
  • Definir high_mask como un arreglo de unos con forma (rows, cols) y tipo np.uint8;
  • Seleccionar la región central de 20x20 de high_mask y rellenarla con 0;
  • Aplicar low_mask y high_mask a dft_shift y almacenar las frecuencias filtradas en lowpass_dft_filtered y highpass_dft_filtered respectivamente;
  • Realizar la transformación inversa para lowpass_dft_filtered:
    • Realizar el desplazamiento inverso y almacenar en lowpass_dft_inverse;
    • Realizar la transformación inversa y almacenar la imagen en image_lowpass;
    • Eliminar los valores negativos de image_lowpass.
  • Realizar la transformación inversa para highpass_dft_inverse:
    • Realizar el desplazamiento inverso y almacenar en lowpass_dft_inverse;
    • Realizar la transformación inversa y almacenar la imagen en image_highpass;
    • Eliminar los valores negativos de image_highpass.

Solución

Switch to desktopCambia al escritorio para practicar en el mundo realContinúe desde donde se encuentra utilizando una de las siguientes opciones
¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 2. Capítulo 3
single

single

some-alt