algorithm - ¿Cómo contar la cantidad de puntos en esta imagen?
image-processing computer-vision (5)
Acabo de probar esta solución usando ImageJ, y dio un buen resultado preliminar:
- En la imagen original, para cada canal
- Cierre pequeño (radio 1 o 2) para eliminar los pelos (parte negra en el medio del blanco)
- Top-hat blanco de radio 5 para detectar la parte blanca alrededor de cada pelo negro.
- Pequeño cierre / apertura para limpiar un poco la imagen (también puede usar un filtro mediano)
- Ultimate erosiona para contar el número de blobs blancos restantes. También puedes usar un LoG (laplaciano de Gaussian) o un mapa de distancia.
[EDITAR] No se detectan todos los puntos blancos con la función máxima, porque después del cierre, algunas zonas son planas, por lo que el máximo no es un punto sino una zona. En este punto, creo que una apertura definitiva o una erosión definitiva le daría el centro o cada punto blanco. Pero no estoy seguro de que haya una función / pluggin haciéndolo en ImageJ. Puedes echarle un vistazo a Mamba o SMIL.
Un H-maxima (después del sombrero de copa blanco) también puede limpiar un poco más tus resultados y mejorar el contraste entre los puntos blancos.
Estoy tratando de contar la cantidad de pelos trasplantados en la siguiente imagen. Prácticamente, tengo que contar la cantidad de lugares que puedo encontrar en el centro de la imagen. (He subido la imagen invertida de un cuero cabelludo calvo en el que se han trasplantado pelos nuevos porque la imagen original es sangrienta y absolutamente repugnante. Para ver la imagen original no invertida, haga clic here . Para ver la versión más grande de la imagen invertida solo Haz click en eso). ¿Hay algún algoritmo de procesamiento de imágenes conocido para detectar estos puntos? Descubrí que el algoritmo Circle Hough Transform se puede usar para buscar círculos en una imagen, aunque no estoy seguro si es el mejor algoritmo que se puede aplicar para encontrar los puntos pequeños en la siguiente imagen.
PD: De acuerdo con una de las respuestas, traté de extraer los puntos usando ImageJ , pero el resultado no fue lo suficientemente satisfactorio:
- Abrí la imagen here no invertida (¡ Cuidado , es sangriento y repugnante de ver!).
- Se han dividido los canales (Imagen> Color> Canales divididos). Y seleccionó el canal azul para continuar.
- Filtro de
Closing
Aplicado (Complementos> Morfología Rápida> Filtros Morfológicos) con estos valores: Operación: Cierre, Elemento: Cuadrado, Radio: 2px - Filtro
White Top Hat
aplicado (Complementos> Morfología rápida> Filtros morfológicos) con estos valores: Operación: Sombrero de copa blanco, Elemento: Cuadrado, Radio: 17 píxeles
Sin embargo, no sé qué hacer exactamente después de este paso para contar los puntos trasplantados con la mayor precisión posible. Intenté usar (Proceso> Buscar máximos), pero el resultado no me parece lo suficientemente preciso (con estas configuraciones: Tolerancia al ruido: 10, Salida: puntos individuales, excluyendo el límite máximo, fondo claro):
Como puede ver, se han ignorado algunos puntos blancos y se han marcado algunas áreas blancas que no son realmente puntos de trasplante capilar.
¿Qué conjunto de filtros aconsejas para encontrar los puntos con precisión? Usar ImageJ
parece una buena opción ya que proporciona la mayoría de los filtros que necesitamos. No obstante, siéntase libre de aconsejar qué hacer con otras herramientas, bibliotecas (como OpenCV), etc. ¡Cualquier ayuda sería muy apreciada!
Como mencionó Renat, no debes esperar que los algoritmos te hagan magia, sin embargo, tengo la esperanza de llegar a una estimación razonable de la cantidad de puntos. Aquí, voy a darle algunos consejos y recursos, compruébelos y llámeme si necesita más información.
En primer lugar, estoy un poco esperanzado por las operaciones morfológicas, pero creo que un paso perfecto de preprocesamiento puede impulsar la precisión que producen de manera espectacular. Quiero que pongas el dedo en el paso de preprocesamiento. Por lo tanto, voy a trabajar con esta imagen:
Esa es la idea:
Recolecta y concentra la masa alrededor de las ubicaciones de los puntos. ¿Qué quiero decir con mi concentración de las masas? Vamos a abrir el libro desde el otro lado: como puede ver, la imagen proporcionada contiene algunos puntos destacados rodeados de algunos puntos de nivel de gris .
Por puntos, me refiero a los píxeles que no son parte de un punto, pero su valor de gris es mayor que cero (negro puro), que están disponibles alrededor de las manchas. Está claro que si elimina estos puntos ruidosos, seguramente obtendrá una buena estimación de los puntos utilizando otras herramientas de procesamiento, como las operaciones morfológicas.
Ahora, ¿cómo hacer que la imagen sea más nítida? ¿Qué pasaría si pudiéramos hacer que los puntos avanzaran hacia sus puntos más cercanos? Esto es lo que quiero decir concentrando las masas en las manchas. Al hacerlo, solo los puntos prominentes estarán presentes en la imagen y, por lo tanto, hemos dado un paso significativo hacia el recuento de los puntos prominentes.
¿Cómo hacer la cosa de concentración? Bueno, la idea que acabo de explicar está disponible en this documento, cuyo código afortunadamente está disponible. Ver la sección 2.2. La idea principal es usar un andador aleatorio para caminar sobre la imagen para siempre. Las formulaciones se establecen de tal manera que el caminante visitará los puntos prominentes muchas veces más y eso puede llevar a identificar los puntos prominentes. El algoritmo está modelado por la cadena de Markov y el Equilibrio de los tiempos de golpe de la cadena ergódica de Markov tiene la clave para identificar los puntos más destacados.
Lo que describí anteriormente es solo una pista y deberías leer ese breve artículo para obtener la versión detallada de la idea. Avíseme si necesita más información o recursos.
Es un placer pensar en problemas tan interesantes. Espero eso ayude.
Creo que estás tratando de resolver el problema de una manera un poco equivocada. Puede parecer infundado, así que será mejor que mostre mis resultados primero.
Debajo tengo una imagen tuya a la izquierda y descubrí los trasplantes a la derecha. El color verde se usa para resaltar áreas con más de un trasplante.
El enfoque general es muy básico (lo describiremos más adelante), pero aún proporciona resultados cercanos y precisos. Tenga en cuenta que fue un primer intento, por lo que hay mucho espacio para mejoras.
De todos modos, volvamos a la declaración inicial que dice que te acercas está mal. Hay varios problemas principales:
- la calidad de tu imagen es horrible
- dices que quieres encontrar manchas, pero en realidad estás buscando
objects
para trasplante de cabello - ignoras por completo el hecho de que la cabeza media está lejos de ser plana
- parece que crees que los filtros agregarán algunos detalles importantes a tu imagen inicial
- esperas que los algoritmos hagan magia para ti
Repasemos todos estos elementos uno por uno.
1. Calidad de imagen
Puede ser una declaración muy obvia, pero antes del procesamiento real necesita asegurarse de tener los mejores datos iniciales posibles. Puede pasar semanas tratando de encontrar una manera de procesar las fotos que tiene sin ningún logro significativo. Estas son algunas áreas problemáticas:
Apuesto a que es difícil para ti "leer" esos cultivos, a pesar de que tienes los algoritmos de reconocimiento de objetos más avanzados en tu cerebro.
Además, su tiempo es costoso y aún necesita la mejor precisión y estabilidad posibles. Por lo tanto, por cualquier precio razonable intente obtener: contraste adecuado, bordes afilados, mejores colores y separación de colores.
2. Mejor comprensión de los objetos a identificar
En términos generales, tiene un objeto 3D para ser identificado. Entonces puedes analizar las sombras para mejorar la precisión. Por cierto, es casi como un análisis de superficie de Marte :)
3. La forma de la cabeza no debe ser ignorada
Debido a la forma de la cabeza, tienes distorsiones. De nuevo, para obtener la precisión adecuada, esas distorsiones deben corregirse antes del análisis real. Básicamente, debe aplanar el área analizada.
4. Los filtros podrían no ayudar
Los filtros no agregan información, pero pueden eliminar fácilmente algunos detalles importantes. Has mencionado la transformación Hough, así que aquí hay una pregunta interesante: encontrar líneas en forma
Usaré esta pregunta como un ejemplo. Básicamente, necesitas extraer una geometría de una imagen dada. Las líneas en forma se ven un poco complejas, por lo que puedes decidir usar la skeletonization
Todos entristecidos, tienen una geometría más compleja de la que ocuparse y prácticamente no tienen posibilidades de comprender lo que realmente estaba en la imagen original.
5. Lo siento, no hay magia aquí
Tenga en cuenta lo siguiente:
Debe tratar de obtener mejores datos para lograr una mayor precisión y estabilidad. El modelo en sí mismo también es muy importante.
Resultados explicados
Como dije, mi enfoque es muy simple: la imagen fue posterizada y luego usé un algoritmo muy básico para identificar áreas con un color específico.
La posterización se puede hacer de una manera más inteligente, la detección de áreas puede mejorarse, etc. Para este PoC, solo tengo una regla simple para resaltar áreas con más de un implante. Al tener áreas identificadas, se puede realizar un análisis un poco más avanzado.
De todos modos, una mejor calidad de imagen te permitirá usar incluso un método simple y obtener los resultados adecuados.
Finalmente
¿Cómo logró la clínica conseguir a Yondu como cliente? :)
Actualización (herramientas y técnicas)
- Posterización - GIMP (configuración predeterminada, colores mínimos)
- Identificación y visualización de trasplantes - Programa Java, sin bibliotecas u otras dependencias
- Tener áreas identificadas es fácil de encontrar tamaño promedio, luego comparar con otras áreas y marcar áreas significativamente más grandes como trasplantes múltiples.
Básicamente, todo se hace "a mano". Escaneo horizontal y vertical, las intersecciones dan áreas. Las líneas verticales se ordenan y utilizan para restaurar una forma real. La solución es interna, el código es un poco feo, así que no quiero compartirlo, lo siento.
La idea es bastante obvia y está bien explicada (al menos eso creo). Aquí hay un ejemplo adicional con diferentes pasos de escaneo utilizados:
Esto es lo que obtiene después de aplicar el radio no afilado 22, cantidad 5, umbral 2 a su imagen.
Esto aumenta el contraste entre los puntos y las áreas circundantes. Utilicé la suposición del estadio de béisbol de que los puntos tienen entre 18 y 25 píxeles de diámetro.
Ahora puede tomar los máximos locales de blanco como un "punto" y rellenarlos con un círculo negro hasta que la vecindad circular del punto (un círculo de radio 10-12) borre el punto. Esto debería permitirle "quitar" los puntos unidos entre sí en grupos de más de 2. Luego, busque los máximos locales de nuevo. Enjuague y repita.
Las áreas reales de "puntos" están en marcado contraste con las áreas circundantes, por lo tanto, esto debería permitirle seleccionarlas tan bien como lo haría al mirarlas.
Usted podría hacer lo siguiente:
- Umbral de la imagen usando cv :: umbral
- Encuentra componentes conectados usando cv :: findcontour
- Rechace los componentes conectados de mayor tamaño que un tamaño determinado, ya que parece estar preocupado solo por las pequeñas regiones circulares.
- Cuente todos los componentes conectados válidos.
- Con suerte, tiene una aproximación de descenso de la cantidad real de puntos.
- Para ser estadísticamente más preciso, puede repetir 1-4 para un rango de umbrales y tomar el promedio.