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()
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
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
(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
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
valoraciones y comentarios
Eres capaz de añadir valor a nuestro contenido cooperando tu experiencia en las observaciones.