Deteccion de Bordes con Canny en OpenCV y Java

Deteccion de Bordes con Canny en OpenCV y Java

En este Articulo veremos una demostracion de la deteccion de bordes con canny en Opencv y Java, el algoritmo canny fue desarrollado por John Canny en 1986 y detecta una amplia cantidad de tipos de bordes en imagenes. La deteccion de bordes es un proceso en el analisis de imagenes en el que se detectan los cambios en la intensidad de luz, y ayuda a detectar tamaños, orientacion, profundidad y otras caracteristicas de los objetos que se representan en las imagenes. El reconocimiento y deteccion de bordes se utiliza para aplicaciones de medicion de objetos, control de calidad, robotica, etc. asi que veamos como realizar deteccion de bordes con canny en opencv y Java, comencemos…

Requerimientos

Desarrollo

La libreria opencv tiene dentro de sus metodos uno en especial capaz de realizar deteccion de bordes con canny a una imagen, hablamos de el metodo canny. El metodo canny se encuentra dentro de org.opencv.imgproc y es capaz de encontrar bordes utilizando el algoritmo Canny que mencionamos en la introduccion de este articulo, la sintaxis es la siguiente:


Canny(imagen,bordes,threshold1,threshold2,tamañoApertura,L2Gradiente);

Donde:
Imagen -> Imagen de entrada en la cual quieres encontrar los bordes
bordes -> Imagen de salida donde se guardara la imagen procesada con solo bordes, puede ser la misma que la imagen de entrada
threshold1 -> Numero que representa el primer valor de umbral para el procedimiento de histeresis
threshold2 -> Numero que representa el segundo valor de umbral para el procedimiento de histeresis
tamañoApertura -> Tamaño de apertura para el opearador sobel (No sera visto en este Articulo)
L2Gradiente -> Flag para indicar si se calculara el gradiente (No sera visto en este Articulo)

[note]Los ultimos 2 parametros de Canny son opcionales, es decir, existen dos «versiones» de este metodo, una con los primeros 4 parametros y otra con 6 parametros.
[/note]
  • Como saber que valor darle a Threshold1 y Threshold2?

Las variables threshold1 y threshold2 representan el umbral minimo (threshold1) y maximo(threshold2) con el cual trabajar, pero veamos el funcionamiento primero. El algoritmo canny utiliza un procedimiento llamado Umbralizacion con histeresis, el cual requiere de estos dos valores, minimo y maximo, de umbral para trabajar. La umbralizacion consiste en sobreponer un umbral en la imagen, si los pixeles superan ese umbral entonces seran considerados como bordes. Esta tecnica tiene un problema que talvez ya hayas identificado, si se pone un umbral muy alto se perderian parte de los bordes, y al contrario, si pones un umbral muy bajo aparecera mucho «ruido» en la imagen, es por esto que se utiliza la umbralizacion con 2 valores que se piden, el umbral minimo y el umbral maximo.

En respuesta a la pregunta, los valores de estas variables variaran depende de los resultados que querramos, aunque se sugiere que siempre exista una proporcion entre el minimo valor de umbral y el maximo valor de umbral de 2:1 o 3:1.


¿Sabías que?

¿Necesitas aprender algo nuevo ? Ve a Udemy, busca el tema del que quieres aprender, selecciona el curso para ti y continua con tu aprendizaje.

Udemy

 

  • Preparaciones

Antes de realizar la deteccion de bordes con canny en opencv es aconsejable que, para tener optimos resultados, la imagen que llega a canny tenga cierto procedimiento recorrido:
-Que sea una Imagen GrayScale
-Aplicar cierto blur o desenfoque a la imagen grayscale
Para convertir una imagen a Grayscale o Blur puedes ver el siguiente articulo.

  • Ejemplo

Mat gris=new Mat(imagen_original_mat.width(),imagen_original_mat.height(),imagen_original_mat.type());
Mat blur=new Mat(imagen_original_mat.width(),imagen_original_mat.height(),imagen_original_mat.type());
Mat canny = new Mat(imagen_original_mat.width(),imagen_original_mat.height(),imagen_original_mat.type());
Imgproc.cvtColor(imagen_original_mat, gris, Imgproc.COLOR_RGB2GRAY);
Size s = new Size(3,3);
int min_threshold=50;
int ratio = 3;
Imgproc.blur(gris, blur,s);
Imgproc.Canny(blur, canny, min_threshold,min_threshold*ratio);

y como resultado obtendremos una imagen con unicamente los bordes en la imagen canny.

Deteccion de Bordes con Canny en OpenCV y Java 1

Video

Clic para valorar esta información
[Total: 0 Promedio: 0]