Extracción de región específica basada en OpenCV
En el artículo anterior, realizamos la extracción de bordes de imágenes, como extraer los bordes de una mesa de billar. Usamos funciones OpenCV simples para realizar esta tarea, como inRange, findContours,boundingRect, minAreaRect, minEnclosingCircle, círculo, HoughLines, línea, etc.
Hoy, nuestra tarea es extraer los segmentos necesarios de imágenes que contienen instantáneas de la actividad cerebral del paciente. Luego, el proceso de extracción se puede aplicar a otros programas, como modelos de aprendizaje automático que diagnostican la salud.
Miremos primero la imagen de entrada. Este es un informe típico generado por instrumentos médicos en el campo de la neurociencia, que utilizan sensores para detectar señales del cerebro de un paciente y mostrarlas como mapas codificados por colores. Normalmente, hay cuatro imágenes, todas las cuales representan una característica específica, y se analizan juntas con fines de diagnóstico.
La imagen objetivo de este ejercicio contiene cuatro mapas cerebrales
De la imagen de arriba, solo queremos extraer las áreas correspondientes a las cuatro imágenes (escaneos de cabeza), y no queremos para extraer otra Cualquier área. Así que comencemos.
El primer paso es detectar los bordes del fragmento que queremos extraer. Este es un proceso de varios pasos, como se describe a continuación:
1. Convierta la imagen RGB a escala de grises usando "cvtColor()"
2. Aplique la función de desenfoque "GaussianBlur()" para eliminar el ruido de las imágenes en escala de grises
3. Finalmente, aplique la función "Canny()" a la imagen borrosa para obtener los bordes
El resultado del proceso de detección de bordes es el siguiente:
Salida de la detección de bordes usando el algoritmo Canny
Tenga en cuenta que, aunque se han identificado los fragmentos de la imagen del cerebro, todavía hay fragmentos de la imagen del cerebro, todavía hay muchos bordes no deseados que deben eliminarse y los espacios entre algunos bordes deben cerrarse.
Un método común para resolver este problema es la transformación morfológica, que es una serie de dilataciones y erosión de la imagen para eliminar bordes no deseados y eliminar espacios.
Utilizamos las funciones OpenCV "dilate() " y "erode() " para múltiples iteraciones para obtener el siguiente resultado.
Algunas mejoras en los bordes usando OpenCV
Como podemos ver, los bordes ahora están completos y mucho más suaves que antes.
Ahora, podemos usar la función OpenCV "findContours()" para extraer los contornos de la imagen y seleccionar solo los contornos con las siguientes propiedades:
1. circular o elipse
2. El área es mayor que un cierto umbral (el umbral en este ejemplo es 7000).
Para la primera parte, usaremos "boundingRect()" de OpenCV para detectar el rectángulo delimitador de cada contorno y verificar si la relación de aspecto es cercana a 1.
Ahora que nuestro trabajo está completo, necesitamos hacer algunos ajustes.
A menudo, detectamos múltiples contornos superpuestos en un solo segmento de línea y solo nos interesa uno de ellos.
Este problema se puede resolver usando supresión no máxima, es decir, observamos todos los contornos superpuestos y luego seleccionamos el que tiene el área más grande como contorno candidato final. La lógica es muy simple, por lo que no necesitamos ninguna función integrada de OpenCV o Python.
Otra lógica importante es identificar cuatro partes, a saber, superior izquierda, superior derecha, inferior izquierda e inferior derecha.
Esto también es muy sencillo, basta con identificar las coordenadas del centro de la imagen y el centro de masa de cada fragmento detectado.
La detección del centro de masa para contornos de segmentos de línea implica aplicar la función " momentos() " de OpenCV al contorno y luego calcular las coordenadas X, Y del centro usando la siguiente fórmula:
center_x, center_y = (int (M [" m10 "] / M [" m00"]), int(M [" m01"] / M [" m00"]))
Colocando las coordenadas del centro de masa del segmento de recta y las coordenadas del centro de la imagen juntas, puede colocar los cuatro segmentos de línea en sus respectivas posiciones.
Ahora que hemos identificado los cuatro segmentos de línea, necesitamos construir una máscara de imagen para extraer las características requeridas de la imagen original.
Usaremos la función OpenCV "drawContours()" para dibujar los cuatro fragmentos sobre un fondo negro usando un contorno de espesor blanco (R, G, B = 255, 2555, 255) y LLENADO (-1). . El resultado es este:
Máscara utilizada para extraer ROI
Aplicando esta máscara sobre la imagen original, podemos obtenerla sobre el fondo que elijamos (como blanco o negro) fragmento requerido.
Para un fondo negro, creamos un lienzo negro y dibujamos sobre él usando la función OpenCV "bitwise_and()" y la máscara obtenida antes.
Extraer ROI en fondo negro
Para fondo blanco, primero creamos un lienzo blanco y luego usamos la función OpenCV "drawContours()" para dibujar contornos negros (R, G, B = 0, 0, 0) y establezca el grosor del contorno en LLENADO como se muestra a continuación para crear una máscara de inversión de color (-1).
Otra máscara de inversión utilizada para extraer ROI (fuente de la imagen: autor)
Luego, usamos la función "add()" de OpenCV para agregar la máscara de inversión con el fondo negro obtenido antes. , se obtiene el mismo resultado, pero con fondo blanco.
Extracción de regiones de interés sobre fondos blancos
Hasta ahora, hemos resumido varios métodos para extraer fácilmente regiones de interés de imágenes.
Cabe señalar que el método anterior se puede modificar en otras imágenes de diversa complejidad.