Python OpenCV: detección de bordes de Roberts

La detección de bordes se refiere a un conjunto de técnicas matemáticas para reconocer puntos en una imagen digital donde el brillo de la imagen cambia abruptamente o, más formalmente, donde hay discontinuidades. Las fluctuaciones bruscas en el brillo de la imagen generalmente se agrupan en una colección de segmentos de líneas curvas llamados bordes. 

Detección de bordes de Roberts

El operador de Roberts mide un gradiente espacial 2D en una imagen de una manera sencilla y rápida de calcular. Como resultado, se resaltan zonas de fuerte gradiente espacial, que con frecuencia corresponden a bordes. La entrada y la salida del operador son imágenes en escala de grises en su configuración más típica. La magnitud absoluta estimada del gradiente espacial de la imagen de entrada en esa posición está representada por valores de píxeles en cada lugar de la salida.  

Operador cruzado de Roberts

El operador cruzado de Roberts se utiliza en el procesamiento de imágenes y la visión artificial para la detección de bordes. Lawrence Roberts lo propuso en 1963 y fue uno de los primeros detectores de bordes. El operador cruzado de Roberts es un operador diferencial que aproxima el gradiente de una imagen a través de una diferenciación discreta, que se logra calculando la suma de los cuadrados de las diferencias entre los píxeles diagonalmente adyacentes.  

Acercarse:

El operador se compone de un par de máscaras de convolución de 2×2, como se muestra. Una máscara es simplemente la otra girada 90 grados. Esto es muy parecido al operador de Sobel. 

0 1
-1 0
1 0
0 -1

Estas máscaras, una para cada una de las dos orientaciones perpendiculares, están diseñadas para responder al máximo a los bordes que se extienden a 45° de la cuadrícula de píxeles. Las máscaras se pueden aplicar a la imagen de entrada de forma independiente para producir mediciones de componentes de degradado separadas en cada orientación (llámelas  G_x   y  G_y  ). Estos pueden luego combinarse para determinar la magnitud absoluta y la orientación del gradiente en cada sitio. La magnitud del gradiente viene dada por 

G = \sqrt{G_x^2+G_y^2}

El ángulo de orientación del borde que da lugar al gradiente espacial (en relación con la orientación de la cuadrícula de píxeles) viene dado por:

\theta = \arctan(\frac{G_x}{G_y})-\frac{3\pi}{4}

En este caso, la orientación 0 significa que la dirección de máximo contraste de negro a blanco se extiende de izquierda a derecha en la imagen, y los demás ángulos se miden en sentido antihorario a partir de ahí.

Pasos: 

  • Importe todas las bibliotecas necesarias.
  • Lea la imagen y conviértala a escala de grises.

Sintaxis:

img = cv2.imread(“ruta”,0).astype(‘float64’)

img/=255.0

  • Inicialice un par de operadores cruzados de Roberts:

Sintaxis:

roberts_cross_v = np.arreglo( [[1, 0 ], [0,-1 ]] )

roberts_cross_h = np.arreglo( [[ 0, 1 ], [ -1, 0 ]] )

  • Calcular  G_x   y G_y

Sintaxis:

vertical = ndimage.convolve(img, roberts_cross_v)

horizontal = ndimage.convolve(img, roberts_cross_h)

  • Calcule G (magnitud del gradiente).

Sintaxis:

edged_img = np.sqrt( np.cuadrado(horizontal) + np.cuadrado(vertical))

Imagen de entrada:

A continuación se muestra la implementación:

Python3

import cv2 
import numpy as np
from scipy import ndimage
  
roberts_cross_v = np.array( [[1, 0 ],
                             [0,-1 ]] )
  
roberts_cross_h = np.array( [[ 0, 1 ],
                             [ -1, 0 ]] )
  
img = cv2.imread("input.webp",0).astype('float64')
img/=255.0
vertical = ndimage.convolve( img, roberts_cross_v )
horizontal = ndimage.convolve( img, roberts_cross_h )
  
edged_img = np.sqrt( np.square(horizontal) + np.square(vertical))
edged_img*=255
cv2.imwrite("output.jpg",edged_img)

Imagen de salida:

 

ventajas:

  • La detección de bordes y la orientación son fáciles.
  • Se conservan los puntos de dirección diagonal.

Desventajas:

  • Muy sensible al ruido.
  • no es muy preciso en la detección de bordes.

Aplicaciones:

  • Procesamiento de imágenes
  • Computer Vision: extracción de características y detección de características

Publicación traducida automáticamente

Artículo escrito por bhavyajain4641 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 *