He investigado mucho y descubrí métodos como el umbral adaptativo, la cuenca hidrográfica, etc., que pueden usarse para detectar venas en las hojas. Sin embargo, el umbral no es bueno ya que introduce mucho ruido
Todas mis imágenes son imágenes grises, por favor, ¿alguien podría sugerir qué enfoques adoptar mientras se considera este problema que necesita ayuda urgentemente?
EDITAR: Mi imagen original
Después de umbral
Como sugiere la respuesta, probé la siguiente detección de bordes
- Astuto
Demasiado ruido y disturbios no deseados.
- Sobel
- Roberts
EDITAR: Intenté una operación más, obtengo el siguiente resultado, es mejor que lo que probé con canny y adaptativo ¿Qué sientes?
Respuestas:
No está buscando bordes (= bordes entre áreas extendidas de alto y bajo valor de gris), está buscando aristas (líneas finas más oscuras o más brillantes que su vecindario), por lo que los filtros de borde pueden no ser ideales: un filtro de borde será darle dos flancos (uno a cada lado de la línea) y una respuesta baja en el medio de la línea:
AGREGAR : Si se le ha pedido que explique la diferencia entre un detector de borde y un detector de cresta más claramente. Pido disculpas de antemano si esta respuesta es muy larga.
Un detector de bordes es (generalmente) un primer operador derivado: si imagina la imagen de entrada como un paisaje 3D, un detector de bordes mide la inclinación de la pendiente en cada punto de ese paisaje:
Si desea detectar el borde de una región brillante u oscura extendida, esto está bien. Pero para las venas en la imagen del OP, le dará lo mismo: los contornos a la izquierda y a la derecha de cada vena:
Eso también explica el "patrón de doble línea" en los resultados del detector de bordes Canny:
Entonces, ¿cómo se detectan estas líneas finas (es decir, crestas)? La idea es que los valores de píxel se puedan aproximar (localmente) por un polinomio de segundo orden, es decir, si la función de imagen es , entonces para valores pequeños de e :g x y
o, en forma de matriz:
La matriz derivada de segundo orden se llama " Matriz Hessiana". Describe la estructura de segundo orden que nos interesa.⎛⎝⎜∂2g∂x2∂2g∂x∂y∂2g∂x∂y∂2g∂y2⎞⎠⎟
La parte de segundo orden de esta función se puede transformar en la suma de dos parábolas rotadas por algún ángulo, descomponiendo la matriz de Hesse en una rotación multiplicada por una matriz diagonal de sus valores propios ( Descomposición matricial ). No nos importa la rotación (queremos detectar crestas en cualquier orientación), por lo que solo estamos interesados en yλ1x2+λ2y2 λ1 λ2
¿Qué tipo de formas puede tener esta aproximación de función? En realidad, no tantos:
Para detectar crestas, queremos encontrar áreas en la imagen que se vean como la última de las parcelas de arriba, por lo que estamos buscando áreas donde el valor propio mayor del Hessian sea grande (en comparación con el valor propio menor). La forma más sencilla de detectar eso es simplemente calcular el valor propio principal en cada píxel, y eso es lo que hace el filtro de cresta a continuación.
Un filtro de cresta probablemente dará mejores resultados. He intentado con Mathematica incorporado
RidgeFilter
(que calcula el valor propio principal de la matriz de Hesse en cada píxel) en su imagen:Como puede ver, solo hay un pico para cada línea oscura delgada. Rendimientos binarizantes y esqueletizantes:
Después de podar el esqueleto y eliminar pequeños componentes (ruido) de la imagen, obtengo este esqueleto final:
Código completo de Mathematica:
AÑADIR:
No soy un experto en Matlab, no sé si tiene un filtro de cresta incorporado, pero puedo mostrarle cómo implementarlo "a mano" (nuevamente, usando Matematica). Como dije, el filtro de cresta es el principal valor propio de la matriz de Hesse. Puedo calcular ese valor propio simbólicamente en Mathematica:
=>12(Hxx+Hyy+H2xx+4H2xy−2HxxHyy+H2yy−−−−−−−−−−−−−−−−−−−−−−−√)
Entonces, lo que tiene que hacer es calcular las segundas derivadas , , (usando un sobel o derivado del filtro gaussiano) e insertarlas en la expresión anterior, y tienes tu filtro de cresta. H xy H yyHxx Hxy Hyy
fuente
Cuando uso la detección de bordes Canny (en Halcon), con alfa siendo 1, y el umbral bajo 8 y el umbral alto 13 (en una escala de 1-255), obtengo el siguiente resultado:
Con ajustes de los parámetros, el resultado que obtuvo de Canny se puede mejorar mucho más. Con esta imagen, puede omitir los bordes cortos para eliminar el ruido y conectar los bordes largos para obtener el resultado final.
Por cierto: un color diferente indica un borde diferente.
Puedo obtener un resultado bastante similar usando este detector de bordes Canny en línea :
fuente
Siguiendo con la excelente respuesta anterior, aquí es cómo hacerlo en python usando las funciones scikit.
fuente
img
debería ser? Tengo unpng
archivo y no funciona.i1
es el mayor de los valores propios, por lo que debe usar ese.En lugar de umbral, he aplicado una detección de borde simple.
GIMP usado con diferencia de Gaussian - Radious Outer: 3.0 e Inner: 1.0.
Aquí es cómo se ve.
Además, puede aplicar un filtro mediano o erosión / dilatación para que pueda eliminar parte del ruido granulado.
Aquí está la página que explica la implementación de gimp.
Debe consultar diferentes técnicas como Laplaciano de Gauss o Diferencia de Gaussin, etc. Consulte esto: http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm#7
Y esta respuesta ¿Cómo se usa el laplaciano para la máscara de enfoque?
fuente
Este tema siempre ha atraído mucho interés y, sin embargo, no existe un consenso real sobre el tema. Por lo tanto, decidí dejar caer algunas palabras.
Mis respuestas a preguntas similares previamente hechas sobre stackexchange ( Q1 y Q2 ) involucraron un algoritmo de extracción de estructura curvilínea de subpixel por Steger. Este método funcionó razonablemente bien en muchos casos y afortunadamente, incluido este. Por lo tanto, publico la imagen de salida aquí: y aquí con una configuración de parámetros diferente, y sin colores de conexión: para obtener detalles y referencias adecuadas, consulte las publicaciones de intercambio de pila a las que me he referido.
fuente
Como parte de mi último año de asignación de estudios de ingeniería, tuve que estudiar métodos de segmentación para vasos sanguíneos en imágenes de fondo de ojo. Encontré este método de reconstrucción de árboles (por Cohen, Laurent D. y Mille, Julien particularmente interesante de usar junto con los métodos de marcha rápida).
Otros documentos que puede considerar:
Enlaces útiles: - Propagación frontal en 2D y 3D
Espero que esto ayude un poco, aunque no es exactamente el estado del arte.
fuente