¿La mejor forma de segmentar las venas en las hojas?

47

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

ingrese la descripción de la imagen aquí

Después de umbral

ingrese la descripción de la imagen aquí

Como sugiere la respuesta, probé la siguiente detección de bordes

  1. Astuto

Demasiado ruido y disturbios no deseados.

ingrese la descripción de la imagen aquí

  1. Sobel

ingrese la descripción de la imagen aquí

  1. Roberts

ingrese la descripción de la imagen aquí

EDITAR: Intenté una operación más, obtengo el siguiente resultado, es mejor que lo que probé con canny y adaptativo ¿Qué sientes?

ingrese la descripción de la imagen aquí

vini
fuente
¿Podrías mostrarnos algunas imágenes?
Jonas
He agregado imágenes
vini
@vini ¿Está haciendo esto actualmente como un paso de preprocesamiento para obtener una buena coincidencia de plantilla más adelante? Además, ¿cómo obtuviste la segunda imagen, a través de un umbral simple?
Spacey
Mi objetivo es obtener el mejor resultado posible en la segmentación de las venas para que mi salida no contenga artefactos extraviados, he utilizado el umbral adaptativo para obtener la segunda imagen
vini
De las imágenes que ha proporcionado, parece que está utilizando (varios) filtros en una imagen con umbral. Esto dará resultados extremadamente pobres. Debe usar los filtros en la imagen original y luego limitar su salida.
Benjohn

Respuestas:

56

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:

filtrar muestras

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:

ingrese la descripción de la imagen aquí

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:

ingrese la descripción de la imagen aquí

Eso también explica el "patrón de doble línea" en los resultados del detector de bordes Canny:

ingrese la descripción de la imagen aquí

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 :gxy

g(x,y)12x22gx2+xy2gxy+12y22gy2+xgx+ygy+g(0,0)

o, en forma de matriz:

g(x,y)12(xy).(2gx22gxy2gxy2gy2).(xy)+(xy).(gxgy)+g(0,0)

La matriz derivada de segundo orden se llama " Matriz Hessiana". Describe la estructura de segundo orden que nos interesa.(2gx22gxy2gxy2gy2)

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:

ingrese la descripción de la imagen aquí

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:

filtro de cresta

Como puede ver, solo hay un pico para cada línea oscura delgada. Rendimientos binarizantes y esqueletizantes:

ingrese la descripción de la imagen aquí

Después de podar el esqueleto y eliminar pequeños componentes (ruido) de la imagen, obtengo este esqueleto final:

ingrese la descripción de la imagen aquí

Código completo de Mathematica:

ridges = RidgeFilter[ColorNegate@src];
skeleton = SkeletonTransform[Binarize[ridges, 0.007]];
DeleteSmallComponents[Pruning[skeleton, 50], 50]

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:

eigenvalue=Last[Eigenvalues[(HxxHxyHxyHyy)]]

=>12(Hxx+Hyy+Hxx2+4Hxy22HxxHyy+Hyy2)

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 yyHxxHxyHyy

Niki Estner
fuente
Sí, eso es exactamente lo que quiero, sin embargo, lo estoy haciendo en matlab y encontrar un equivalente del filtro de cresta se ha vuelto difícil
vini
1
@nikie Muy buena respuesta, pregunta, ¿podría explicarnos la diferencia entre un detector de bordes y un detector de crestas para nosotros, las personas que no procesan imágenes? Gracias de nuevo
Spacey
@Mohammad: Lo he intentado, espero haberlo aclarado un poco ahora, a pesar de las matemáticas
Niki Estner
Intenté el filtro de cresta no da resultados satisfactorios
vini
2
@vini: "no da resultados satisfactorios" realmente no me dice mucho. ¿Obtiene la misma imagen de resultado que la que publiqué? ¿Qué es "no satisfactorio"?
Niki Estner
6

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:

Hoja de detección de bordes caninos

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 :

  • Elija imagen I9Pxl.png
  • Sigma 1.2
  • T-bajo 0.04
  • T-alto 0.07
  • Otras configuraciones predeterminadas
  • Haga clic en la vista de actualización para ver el resultado
Geerten
fuente
Gracias :) Supongo que Canny es el mejor;) Por cierto, aplicar Canny en su resultado podría producir resultados aún mejores ...
Geerten
Por cierto: si no lo has notado: ¿Cuáles son las limitaciones de un detector de borde Canny? ¡Puedes dar tu opinión aquí!
Dipan Mehta
Si me está diciendo: ya di mi opinión sobre su pregunta ... Si está dando un comentario en general: eliminaré este comentario.
Geerten
Oh sí, ¡no me di cuenta de esto!
Dipan Mehta
Gracias por su respuesta duerma sin embargo Canny conservan detalles finos de las venas en las hojas que no son detectados como apareciste ...
vini
6

Siguiendo con la excelente respuesta anterior, aquí es cómo hacerlo en python usando las funciones scikit.

from skimage.feature import hessian_matrix, hessian_matrix_eigvals

#assume you have an image img

hxx, hxy, hyy = hessian_matrix(img, sigma=3)
i1, i2 = hessian_matrix_eigvals(hxx, hxy, hyy)

#i2 is the variable you want.

#Visualise the result
import matplotlib.pyplot as plt
plt.imshow(i2)
Matthew Shun-Shin
fuente
¿Qué imgdebería ser? Tengo un pngarchivo y no funciona.
Sigur
img debería ser una matriz numpy en 2d.
Matthew Shun-Shin
En realidad, i1es el mayor de los valores propios, por lo que debe usar ese.
Rob
¡Esta es la explicación más clara que he visto!
Eureka
3

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.

ingrese la descripción de la imagen aquí

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?

Dipan Mehta
fuente
GIMP? ¿Cuál es el detector de borde?
vini
1
No, es un paquete de edición de imágenes. Fue una verificación rápida, solo para poner un punto adelante, use la detección de bordes en lugar de la umbralización.
Dipan Mehta
¿Qué detector de borde usa GIMP? lo siento tener muy poco conocimiento de ello
vini
@vini agregó referencia.
Dipan Mehta
3

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í: ingrese la descripción de la imagen aquí y aquí con una configuración de parámetros diferente, y sin colores de conexión: ingrese la descripción de la imagen aquí para obtener detalles y referencias adecuadas, consulte las publicaciones de intercambio de pila a las que me he referido.

Tolga Birdal
fuente
0

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:

  • Contornos geodésicos activos
  • Sobre la implementación de métodos de marcha rápida para redes 3D
  • Multistencils FMM: una solución altamente precisa para la ecuación eikonal en dominios cartesianos

Enlaces útiles: - Propagación frontal en 2D y 3D

Espero que esto ayude un poco, aunque no es exactamente el estado del arte.

Nomaru
fuente