¿Alguien sabe por qué MatLab Canny (MLC) es tan diferente en comparación con OpenCV Canny (OCC)? ML-C ofrece bordes precisos y más conectados que el OCC, pero ¿cómo es eso posible? La razón por la que pregunto es que necesito implementar mi prototipo de código ML en C ++ y quería usar OpenCV. Exportar código de ML no es realmente posible por lo que he intentado.
Saludos cordiales,
image-processing
matlab
opencv
edge-detection
mchlfchr
fuente
fuente
edit edge
Matlab y ver el caso relevante. Todo es de código abierto, no hay incorporados hasta donde yo sé.Respuestas:
Como se sugirió anteriormente, el detector de bordes Matlab Canny calcula el gradiente utilizando una "derivada de un filtro gaussiano" (como se indica en la documentación). En otras palabras, Matlab hace un desenfoque gaussiano de la imagen y luego encuentra el gradiente de esa imagen suavizada ... todo utilizando un único filtro elegante. [Si desea conocer los detalles, simplemente escriba
edit edge
como sugirió Andrey, y luego desplácese hacia abajo hasta lasmoothGradient()
función.]La operación de desenfoque reduce significativamente la cantidad de ruido presente en la imagen, elimina muchos bordes espurios y deja atrás lo bueno.
Desafortunadamente, la función OpenCV Canny no le permite cambiar el núcleo del filtro que usa a través de los parámetros de la función. Sin embargo. Puede generar los mismos resultados desenfocando primero la imagen de entrada y luego pasando esta imagen borrosa a la función Canny.
Esto limpia significativamente el mapa de borde resultante. Para desenfocar la imagen de entrada, yo personalmente uso la
GaussianBlur()
función de OpenCV consigmaX=2
. Esto imita la sigma predeterminada en Matlab. El mejor tamaño de kernel borroso puede variar de un caso a otro, pero en Matlab se calcula utilizandofilterLength = 8*ceil(sigma);
, por lo que para un sigma de 2 eso significaría un tamaño de kernel de(16,16)
Dado que los filtros Gaussian Blur y Sobel son lineales, pasar una imagen de entrada borrosa a la
Canny()
función OpenCV es matemáticamente equivalente a lo que hace Matlab debido al principio de superposición, como se demuestra en este pseudocódigo (nota:*
es el operador de convolución):Aquí hay un tutorial de OpenCV Canny que muestra cómo hacer esto usando C ++. Soy un tipo de pitón, así que esto es lo que hago:
fuente