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 pillow
biblioteca. 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: –
IMAGEN DE MUESTRA:-
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):
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_EDGES
argumento, 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):
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 1
argumento (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. los0
El 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_EDGE
utiliza 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.