2011-05-23 50 views

Respuesta

34

"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 dectección de borde, como se mencionó anteriormente, es técnicamente un filtro de paso alto (la mayoría son un paso de banda), pero tiene un efecto muy diferente de lo que probablemente tenido en cuenta.)

en todo caso, sobre la base de la mayor parte de las preguntas que hemos estado pidiendo, probablemente debería mirar en lugar de scipy.ndimagescipy.filter, especialmente si usted va a estar trabajando con imágenes grandes (ndimage puede operaciones de preforma en el lugar, conservando la memoria).

Como un ejemplo básico, que muestra algunas maneras 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() 

enter image description here

+0

Gracias por un gran guión! Aprendí mucho sobre convolve() y matplotlib * y * incluso Python. (No tenía idea de que algo como "plot.i" podría funcionar.) –

+0

no es un filtro gaussiano, ¿es un filtro de paso bajo? –

+0

@ A.H. - Sí, pero si restas el paso bajo gaussiano de la imagen original, obtienes un filtro de paso alto equivalente. Eso es lo que se conoce como un "pase alto gaussiano". (Eche un vistazo a los comentarios sobre el código para esa parte). –

1

scipy.filter contiene un gran número de filtros genéricos. Algo así como la clase iirfilter se puede configurar para producir los filtros de paso alto Chebyshev o Buttworth digitales o analógicos típicos.

4

Un filtro de paso alto simple es:

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

El Sobel operator es otro ejemplo simple.

En el procesamiento de imágenes, este tipo de filtros a menudo se denominan "detectores de bordes" - the Wikipedia page estaba bien en esta última vez que lo verifiqué.

Cuestiones relacionadas