una recorrer reconocimiento procesamiento pixeles para librerias imagenes imagen con como python opencv image-processing edge-detection image-segmentation

recorrer - reconocimiento de imagenes python



Segmentación de imágenes basada en el mapa de píxeles de borde (3)

Al ver la imagen de los bordes / los bordes del pixel en el clasificador, podemos ver que la imagen de gradiente de tu entrada ya básicamente da el resultado del clasificador que has aprendido. Pero el mapa de confianza muestra una buena solución, excepto que: 1. son conjuntos de niveles conectados, con tamaños variables. 2. tiene puntos brillantes ruidosos en las celdas que causan salidas falsas del clasificador. (tal vez se podría considerar un suavizado) 3. Supongo que probablemente sería más fácil caracterizar el interno de cada celda: las variaciones en escala de grises, el tamaño promedio. Aprender estas distribuciones probablemente te dará mejores resultados de detección. Topológicamente, tenemos un conjunto de valores bajos de escala de grises anidados en grandes valores de escala de grises. Para realizar esto uno podría usar Graphcuts con el modelo GMM para los costos unitarios y una distribución de gradiente aprendido para el término pairwise

He entrenado un clasificador en Python para clasificar píxeles en una imagen de celdas como borde o sin borde. Lo he usado con éxito en algunos conjuntos de datos de imágenes, pero tengo problemas con este conjunto de datos en particular, que parece bastante ambiguo incluso para el ojo humano. No conozco ninguna técnica automatizada existente que pueda segmentarla con precisión.

Después de la predicción, obtengo la siguiente imagen:

Soy relativamente nuevo en el procesamiento de imágenes y no estoy seguro de cómo proceder para obtener realmente las segmentaciones finales de las células. He intentado brevemente algunas técnicas diferentes, a saber, la transformación circular de Hough, los conjuntos de niveles, la esqueletización, el hallazgo de contornos, pero ninguno realmente ha funcionado. ¿Acaso no estoy ajustando los parámetros correctamente o hay una mejor técnica por ahí?

Estos son los contornos correctos, por cierto, para referencia.

Y la imagen original:

Y el mapa de probabilidad continuo:


Creo que tu transformación de Hough es una buena idea. Una cosa que debes probar (si no lo hiciste aún) es threshold el threshold tu imagen antes de ejecutarla a través de tu transformación, aunque el artículo que acabo de vincular parece ser solo un umbral binario. Lo que esto podría hacer es exagerar las diferencias entre el borde y el fondo, por lo que podría ser más fácil de detectar. Básicamente, aplique una función (en forma de filtro que opera en el valor del píxel) a cada píxel.

Otra cosa que puedes probar es contornos activos . Básicamente, colocas algunos círculos y se mueven a través de la imagen hasta que encuentran lo que estás buscando.

Mi última idea es quizás intentar una transformación wavelet . Estos parecen funcionar bastante bien para elegir los límites y las fronteras en las imágenes. Espero que estas ideas te puedan ayudar a empezar.


Muy buen trabajo en la detección de límites. Solía ​​trabajar en problemas de segmentación similares.

Teoría:

Una vez que haya obtenido su mapa de borde, donde e(i,j) indica el grado de "borde en" grado de píxel i,j , le gustaría una segmentación de la imagen que respete el mapa de borde como sea posible.
Con el fin de formular este "respetar el mapa de borde" de una manera más formal, le sugiero que consulte el funcional de agrupamiento de correlación (CC) :
La función CC evalúa la calidad de una segmentación basada en relaciones por pares entre píxeles vecinos, ya sea que estén en el mismo clúster (sin borde entre ellos) o en diferentes clústeres (hay un borde entre ellos).
Eche un vistazo al ejemplo en la sección 7.1 del documento antes mencionado .
CC también se usa para problemas de segmentación similares en imágenes médicas (neuronales), ver, por ejemplo, here .

Práctica

Una vez que se convenza a sí mismo de que CC es de hecho una formulación adecuada para su problema, todavía existe la pregunta de cómo exactamente convertir su mapa de bordes binarios en una matriz de afinidad que CC puede procesar. Tenga en cuenta que CC necesita como entrada una matriz de adyacencia (normalmente dispersa) con entradas positivas para pares de píxeles que suponen pertenecer al mismo segmento, y entradas negativas para pares de píxeles que se supone pertenecen en segmentos diferentes.

Aquí está mi sugerencia:

  1. Los bordes en su mapa de borde se ven bastante gruesos y no bien localizados. Sugiero una supresión no máxima, o morfina morfológica como una etapa de procesamiento previo.

  2. Una vez que tenga bordes mejor localizados, ignorará los píxeles "de borde" y solo trabajará con los píxeles "sin borde", los llamaremos "activos".
    Dos píxeles activos que están uno al lado del otro: no hay un píxel de "borde" entre ellos; deben estar juntos. Entonces, la matriz de adjecencia para los nieghbors inmediatos debería tener beneficios positivos.
    Considere tres píxeles en una línea, con los dos puntos finales como píxeles "activos": si el medio es un borde, los dos píxeles activos no deberían pertenecer al mismo grupo: las entradas correspondientes en la matriz de adjetivos deberían ser negativas. Si el píxel del medio también está activo, las entradas correspondientes en la matriz de adjetivos deben ser positivas.

  3. Considere todos los posibles pares y trillizos vecinos (induciendo un gráfico de cuadrícula conectado a 24) que le permite construir una matriz de afinidad con entradas positivas y negativas adecuadas para CC.

  4. Dada una matriz, debe buscar la segmentación con la mejor puntuación CC (etapa de optimización). Tengo el código de Matlab here . También puede usar el excelente paquete openGM .

  5. La optimización se obtendrá solo con una partición de los píxeles activos, puede volver a asignarla al dominio de la imagen de entrada, dejando los píxeles del borde como no asignados a ningún segmento.