Python: detección de bordes con Pillow

La detección de bordes es una disciplina de procesamiento de imágenes que incorpora métodos matemáticos para encontrar bordes en una imagen digital. La detección de bordes funciona internamente al ejecutar un filtro/Kernel sobre una imagen digital, que detecta discontinuidades en las regiones de la imagen, como cambios marcados en el valor de brillo/intensidad de los píxeles.

Hay dos formas de detección de bordes:

  • Detección de bordes basada en búsqueda (derivada de primer orden)
  • Detección de borde basada en cruce por cero (derivada de segundo orden)

Algunos de los métodos de detección de bordes comúnmente conocidos son:

  • Operador laplaciano o detección de bordes basada en laplaciano (derivada de segundo orden)
  • Canny edge detector (derivada de primer orden)
  • Operador de Prewitt (derivada de primer orden)
  • Operador Sobel (derivada de primer orden)

Estaríamos implementando un Operador Laplaciano para incorporar la detección de bordes en uno de nuestros ejemplos posteriores. Para este propósito, usaremos la pillowbiblioteca. Para instalar la biblioteca, ejecute el siguiente comando en la línea de comandos:

pip install pillow

NOTA: varias distribuciones de Linux tienden a tener Python y Pillow preinstalados.

Hay dos formas en las que implementaríamos la detección de bordes en nuestras imágenes. En el primer método estaríamos usando un método incorporado proporcionado en la biblioteca de Pillows ( ImageFilter.FIND_EDGES) para la detección de bordes. En el segundo, estaríamos creando un filtro laplaciano usando PIL.ImageFilter.Kernel()y luego usaríamos ese filtro para la detección de bordes.

NÚCLEO LAPLACIANO: –

Laplacian Kernel (diagonals included)


IMAGEN DE MUESTRA:-

Sample Image

Método 1:

Python3

from PIL import Image, ImageFilter
  
  
# Opening the image (R prefixed to string
# in order to deal with '\' in paths)
image = Image.open(r"Sample.png")
  
# Converting the image to grayscale, as edge detection 
# requires input image to be of mode = Grayscale (L)
image = image.convert("L")
  
# Detecting Edges on the Image using the argument ImageFilter.FIND_EDGES
image = image.filter(ImageFilter.FIND_EDGES)
  
# Saving the Image Under the name Edge_Sample.png
image.save(r"Edge_Sample.png")

Salida (Edge_Sample.png):

Output of the inbuilt function

Explicación:-

En primer lugar, creamos un objeto de imagen de nuestra imagen usando Image.open(). Luego convertimos el modo de color de la imagen a escala de grises, ya que la entrada al operador laplaciano está en modo de escala de grises (en general). Luego, pasamos la imagen a la Image.filter()función especificando un ImageFilter.FIND_EDGESargumento, que a su vez ejecuta un kernel de detección de bordes sobre la imagen. La salida de la función anterior da como resultado una imagen con cambios de alta intensidad (bordes) en tonos de blanco y el resto de la imagen en color negro.

Método 2:

Python3

from PIL import Image, ImageFilter
  
img = Image.open(r"sample.png")
  
# Converting the image to grayscale, as Sobel Operator requires
# input image to be of mode Grayscale (L)
img = img.convert("L")
  
# Calculating Edges using the passed laplican Kernel
final = img.filter(ImageFilter.Kernel((3, 3), (-1, -1, -1, -1, 8,
                                          -1, -1, -1, -1), 1, 0))
  
final.save("EDGE_sample.png")

Salida (EDGE_muestra.png):

Image after convolution with laplacian operator for edge detection

Explicación:-

En primer lugar, creamos un objeto de imagen de nuestra imagen usando Image.open(). Luego convertimos el modo de color de la imagen a escala de grises, ya que la entrada al operador laplaciano está en modo de escala de grises (en general). Luego pasamos la imagen a la Image.filter()función especificando nuestro operador/Kernel dentro de la función como argumento. El Kernel se especifica mediante ImageFilter.Kernel((3, 3), (-1, -1, -1, -1, 8, -1, -1, -1, -1), 1, 0))el cual se crea un Kernel de 3 X 3 (3 píxeles de ancho y 3 píxeles de largo) con los valores (-1, -1, -1, -1, 8, -1, -1, -1, – 1) (como se indica en la imagen de Laplacian Kernel). El 1argumento (después del kernel) representa el valor Scale, que divide el valor final después de cada operación del kernel, por lo tanto, establecemos ese valor en 1 porque no queremos ninguna división en nuestro valor final. los0El argumento (después del valor de escala) es el desplazamiento que se agrega después de la división por el valor de escala. Hemos establecido ese valor en 0 porque no queremos ningún incremento en el valor de intensidad final después de la convolución del kernel. La salida de la función anterior da como resultado una imagen con cambios de alta intensidad (bordes) en tonos de blanco y el resto de la imagen en color negro.

Apéndice –

Ambos programas arrojaron el mismo resultado. La razón por la cual es el hecho de que la función incorporada ImageFilter.FIND_EDGEutiliza un Kernel/Operador Laplaciano de tamaño 3 X 3 internamente. Debido a lo cual terminamos con resultados idénticos. El beneficio de usar un Kernel en lugar de depender de funciones integradas es que podemos definir kernels de acuerdo con nuestras necesidades, que pueden o no estar en la biblioteca. Por ejemplo, podemos crear un kernel para desenfoque, nitidez, detección de bordes (usando otros kernels), etc. Además, elegí intencionalmente el laplaciano para que podamos mantener la coherencia en los resultados.

Beneficios de usar Laplacian: –
Resultados rápidos y decentes. Otros detectores de bordes comunes como Sobel (derivada de primer orden) son más costosos en el cálculo, ya que requieren encontrar gradientes en dos direcciones y luego normalizar los resultados. 

Inconvenientes de usar laplacian: –
La convolución con Laplacian Kernel genera mucho ruido en la salida. Este problema se resuelve con otros métodos de detección de bordes, como Sobel, Operador Perwitt, etc., ya que tienen un kernel de desenfoque gaussiano incorporado. Lo que reduce el ruido obtenido de la imagen de entrada. También conducen a una detección de bordes más precisa, debido a la mayor computación involucrada para encontrarlos.

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 *