Aplicar un filtro de Gauss a una imagen con Python

Un filtro gaussiano es un filtro de paso bajo que se utiliza para reducir el ruido (componentes de alta frecuencia) y las regiones borrosas de una imagen. El filtro se implementa como un núcleo simétrico de tamaño impar (versión DIP de una array) que se pasa a través de cada píxel de la región de interés para obtener el efecto deseado. El kernel no es difícil de cambiar drásticamente de color (bordes) debido a que los píxeles hacia el centro del kernel tienen más peso hacia el valor final que la periferia. Un Filtro Gaussiano podría considerarse como una aproximación de la Función Gaussiana (matemáticas). En este artículo, aprenderemos métodos para utilizar el filtro gaussiano para reducir el ruido en las imágenes utilizando el lenguaje de programación Python.

Estaríamos usando la siguiente imagen para la demostración:

Una captura de pantalla de un segmento del explorador de Windows

Proceso para aplicar un filtro de Gauss

En el proceso de usar el filtro gaussiano en una imagen, primero definimos el tamaño del núcleo/array que se usaría para eliminar la imagen. Los tamaños son generalmente números impares, es decir, los resultados generales se pueden calcular en el píxel central. Además, los núcleos son simétricos y, por lo tanto, tienen el mismo número de filas y columnas. Los valores dentro del kernel se calculan mediante la función gaussiana, que es la siguiente:

Función gaussiana bidimensional

Dónde,

x → valor de la coordenada X

y → valor de la coordenada Y

???? → Constante Matemática PI (valor = 3.13)

σ → Desviación estándar

Usando la función anterior, se puede calcular un kernel gaussiano de cualquier tamaño, proporcionándole los valores apropiados. Una aproximación kernel gaussiana de 3 × 3 (bidimensional) con desviación estándar = 1, aparece de la siguiente manera

Implementando el kernel gaussiano en Python

Estaríamos usando la función PIL (Python Imaging Library) llamada filter() para pasar toda nuestra imagen a través de un núcleo gaussiano predefinido. La página de ayuda de la función es la siguiente:

Sintaxis: filtro (núcleo) 

Toma un núcleo (predefinido o personalizado) y cada píxel de la imagen a través de él (Convolución del núcleo). 

Parámetro: Núcleo de filtro

Retorno: Objeto de imagen

En el siguiente ejemplo, estaríamos desenfocando la imagen antes mencionada. 

Python3

# ImageFilter for using filter() function
from PIL import Image, ImageFilter
  
# Opening the image 
# (R prefixed to string in order to deal with '\' in paths)
image = Image.open(r"IMAGE_PATH")
  
# Blurring image by sending the ImageFilter.
# GaussianBlur predefined kernel argument
image = image.filter(ImageFilter.GaussianBlur)
  
# Displaying the image
image.show()

Producción:

Imagen borrosa

Explicación:

En primer lugar, importamos los módulos Image e ImageFilter (para usar filter() ) de la biblioteca PIL. Luego creamos un objeto de imagen abriendo la imagen en la ruta IMAGE_PATH (definida por el usuario). Después de lo cual, filtramos la imagen a través de la función de filtro y proporcionamos ImageFilter.GaussianBlur (predefinido en el módulo ImageFilter) como argumento. Las dimensiones del kernel de ImageFilter.GaussianBlur son 5×5. Al final mostramos la imagen. 

Nota: El tamaño del kernel podría manipularse pasando como parámetro (opcional) el radio del kernel. Esto cambia la siguiente línea de.

imagen = imagen.filtro(ImageFilter.GaussianBlur)

a

imagen = imagen.filtro(ImageFilter.GaussianBlur(radio=x))

donde x => radio de desenfoque (tamaño del kernel en una dirección, desde el píxel central)

Desenfocando una pequeña región en una imagen:

En lugar de la imagen completa, ciertas secciones de la misma también podrían desenfocarse selectivamente. Esto podría realizarse recortando primero la región deseada de la imagen y luego pasándola a través de la función filter(). La salida de la cual (la imagen secundaria borrosa) se pegaría encima de la imagen original. Esto nos daría la salida deseada. 

cuyo código es el siguiente:

Python3

from PIL import Image, ImageFilter
  
image = Image.open(r"FILE_PATH")
  
# Cropping the image 
smol_image = image.crop((0, 0, 150, 150))
  
# Blurring on the cropped image
blurred_image = smol_image.filter(ImageFilter.GaussianBlur)
  
# Pasting the blurred image on the original image
image.paste(blurred_image, (0,0))
  
# Displaying the image
image.save('output.png')

Producción:

Solo la región superior izquierda de la imagen está borrosa

Publicación traducida automáticamente

Artículo escrito por VasuDev4 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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