Saltar al contenido

Filtro de paso alto para procesamiento de imágenes en python usando scipy/numpy

Ya no tienes que buscar más en otras webs porque llegaste al sitio exacto, poseemos la respuesta que buscas y sin complicarte.

“Filtro de paso alto” es un término muy genérico. Hay un número infinito de diferentes “filtros de paso alto” que hacen cosas muy diferentes (por ejemplo, un filtro de detección de bordes, como se mencionó anteriormente, es técnicamente un filtro de paso alto (la mayoría son en realidad un filtro de paso de banda), pero tiene un efecto muy diferente de lo que probablemente tenía en mente.)

En cualquier caso, según la mayoría de las preguntas que ha estado haciendo, probablemente debería investigar scipy.ndimage en vez de scipy.filter, especialmente si va a trabajar con imágenes grandes (ndimage puede realizar operaciones en el lugar, conservando la memoria).

Como ejemplo básico, que muestra algunas formas diferentes de hacer las cosas:

import matplotlib.pyplot as plt
import numpy as np
from scipy import ndimage
import Image

def plot(data, title):
    plot.i += 1
    plt.subplot(2,2,plot.i)
    plt.imshow(data)
    plt.gray()
    plt.title(title)
plot.i = 0

# Load the data...
im = Image.open('lena.png')
data = np.array(im, dtype=float)
plot(data, 'Original')

# A very simple and very narrow highpass filter
kernel = np.array([[-1, -1, -1],
                   [-1,  8, -1],
                   [-1, -1, -1]])
highpass_3x3 = ndimage.convolve(data, kernel)
plot(highpass_3x3, 'Simple 3x3 Highpass')

# A slightly "wider", but sill very simple highpass filter 
kernel = np.array([[-1, -1, -1, -1, -1],
                   [-1,  1,  2,  1, -1],
                   [-1,  2,  4,  2, -1],
                   [-1,  1,  2,  1, -1],
                   [-1, -1, -1, -1, -1]])
highpass_5x5 = ndimage.convolve(data, kernel)
plot(highpass_5x5, 'Simple 5x5 Highpass')

# Another way of making a highpass filter is to simply subtract a lowpass
# filtered image from the original. Here, we'll use a simple gaussian filter
# to "blur" (i.e. a lowpass filter) the original.
lowpass = ndimage.gaussian_filter(data, 3)
gauss_highpass = data - lowpass
plot(gauss_highpass, r'Gaussian Highpass, $sigma = 3 pixels$')

plt.show()

ingrese la descripción de la imagen aquí

Un filtro de paso alto simple es:

-1 -1 -1
-1  8 -1
-1 -1 -1

El operador Sobel es otro ejemplo simple.

En el procesamiento de imágenes, este tipo de filtros a menudo se denominan “detectores de bordes”: la página de Wikipedia estaba bien la última vez que lo verifiqué.

Así es como podemos diseñar un HPF con scipy fftpack

from skimage.io import imread
import matplotlib.pyplot as plt
import scipy.fftpack as fp

im = np.mean(imread('../images/lena.jpg'), axis=2) # assuming an RGB image
plt.figure(figsize=(10,10))
plt.imshow(im, cmap=plt.cm.gray)
plt.axis('off')
plt.show()

Imagen original

ingrese la descripción de la imagen aquí

F1 = fftpack.fft2((im).astype(float))
F2 = fftpack.fftshift(F1)
plt.figure(figsize=(10,10))
plt.imshow( (20*np.log10( 0.1 + F2)).astype(int), cmap=plt.cm.gray)
plt.show()

Espectro de frecuencia con FFT

ingrese la descripción de la imagen aquí

(w, h) = im.shape
half_w, half_h = int(w/2), int(h/2)

# high pass filter
n = 25
F2[half_w-n:half_w+n+1,half_h-n:half_h+n+1] = 0 # select all but the first 50x50 (low) frequencies
plt.figure(figsize=(10,10))
plt.imshow( (20*np.log10( 0.1 + F2)).astype(int))
plt.show()

Bloquear frecuencias bajas en el espectro

ingrese la descripción de la imagen aquí

im1 = fp.ifft2(fftpack.ifftshift(F2)).real
plt.figure(figsize=(10,10))
plt.imshow(im1, cmap='gray')
plt.axis('off')
plt.show()

Imagen de salida después de aplicar el HPF

ingrese la descripción de la imagen aquí

valoraciones y comentarios

Eres capaz de añadir valor a nuestro contenido cooperando tu experiencia en las observaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *