Tabla de contenido:

Diagnóstico automatizado de la retinopatía diabética a través de MATLAB: 33 pasos
Diagnóstico automatizado de la retinopatía diabética a través de MATLAB: 33 pasos

Video: Diagnóstico automatizado de la retinopatía diabética a través de MATLAB: 33 pasos

Video: Diagnóstico automatizado de la retinopatía diabética a través de MATLAB: 33 pasos
Video: Tamizaje De Glaucoma Mediante Deep Learning. 2024, Noviembre
Anonim
Diagnóstico automatizado de retinopatía diabética a través de MATLAB
Diagnóstico automatizado de retinopatía diabética a través de MATLAB
Diagnóstico automatizado de la retinopatía diabética a través de MATLAB
Diagnóstico automatizado de la retinopatía diabética a través de MATLAB

(Ver esquema de código arriba)

La retinopatía diabética es una enfermedad ocular relacionada con la diabetes causada por niveles altos de azúcar en sangre. Los niveles altos de azúcar en sangre hacen que los vasos sanguíneos de las retinas se hinchen, lo que conduce a vasos sanguíneos agrandados e incluso fugas de vasos, lo que conduce a manchas oscuras en las imágenes de la retina. Con este código, nuestro objetivo es utilizar la aparición de manchas de fugas en los vasos sanguíneos como un indicador de retinopatía diabética de fondo, aunque se requerirían más técnicas de diagnóstico en el mundo real. El objetivo de este código es automatizar el procesamiento de imágenes y el diagnóstico de imágenes retinianas para identificar signos de retinopatía diabética que se muestran a través de manchas oscuras en las imágenes retinianas.

Se procesaron 10 imágenes retinianas normales y 10 imágenes retinianas diagnosticadas a través de un código que primero lee y filtra las imágenes y luego cuantifica las manchas oscuras para determinar si los síntomas de la retinopatía diabética están presentes, según un umbral determinado. Luego, los resultados se imprimen en la ventana de comandos para que el espectador los interprete.

Paso 1: requisitos previos

Prerrequisitos
Prerrequisitos

1. Asegúrese de haber descargado el programa MATLAB en su computadora.

2. Descargue el archivo txt que se encuentra en el enlace. (Presione 'ctrl + s' para guardar en el mismo directorio que el código MATLAB)

Paso 2: requisitos previos (continuación)

Requisitos previos (cont.)
Requisitos previos (cont.)
Requisitos previos (cont.)
Requisitos previos (cont.)

4. Abra MATLAB y escriba "uiimport" en la ventana de comandos.

5. Seleccione el archivo officialdiagnoses.txt e impórtelo a MATLAB como una matriz de celda.

6. Asegúrese de ver "diagnósticos oficiales" como una variable en el espacio de trabajo.

Paso 3: requisitos previos (continuación)

Requisitos previos (cont.)
Requisitos previos (cont.)

7. Descargue la función ModWald.m, que puede obtener del código anterior o descárguela de Canvas.

(Código proporcionado por el profesor King y el profesor Choi)

Paso 4: requisitos previos (continuación)

Requisitos previos (cont.)
Requisitos previos (cont.)

8. Descargue las 400 imágenes sin procesar de la sección de datos de The STARE Project.

Paso 5: Limpiar Matlab para preparar el código en ejecución

Limpiar Matlab para prepararse para ejecutar código
Limpiar Matlab para prepararse para ejecutar código

Agregar al código:

1. cerrar todo (cierra todas las imágenes abiertas anteriormente)

2. clearvars - excepto los diagnósticos oficiales (borra todas las variables excepto el archivo txt de diagnósticos oficiales importado previamente)

3. cclc (borra la ventana de comandos)

Paso 6: seleccione 10 imágenes de ojos normales y 10 imágenes con síntomas de retinopatía diabética

Seleccione 10 imágenes de ojos normales y 10 imágenes con síntomas de retinopatía diabética
Seleccione 10 imágenes de ojos normales y 10 imágenes con síntomas de retinopatía diabética
Seleccione 10 imágenes de ojos normales y 10 imágenes con síntomas de retinopatía diabética
Seleccione 10 imágenes de ojos normales y 10 imágenes con síntomas de retinopatía diabética

1. Tome el archivo de texto de diagnóstico y extraiga los nombres de las imágenes. Estos nombres están contenidos en la primera columna del archivo de texto, por lo que para extraerlos escriba 'officialdiagnoses (:, 1)'. La matriz de nombres de imágenes se asignó a una variable, "all_image_numbers"

2. Convierta la variable all_image_numbers de una matriz de celdas a una matriz de matriz utilizando la función cell2mat

Paso 7: seleccione 10 imágenes de ojos normales y 10 imágenes con síntomas de retinopatía diabética (cont.)

Seleccione 10 imágenes de ojos normales y 10 imágenes con síntomas de retinopatía diabética (cont.)
Seleccione 10 imágenes de ojos normales y 10 imágenes con síntomas de retinopatía diabética (cont.)
Seleccione 10 imágenes de ojos normales y 10 imágenes con síntomas de retinopatía diabética (cont.)
Seleccione 10 imágenes de ojos normales y 10 imágenes con síntomas de retinopatía diabética (cont.)

3. Seleccione 10 imágenes de ojos normales para ejecutar el código. Las imágenes seleccionadas en este caso fueron 278, 199, 241, 235, 35, 77, 82, 164, 239, 170.

Coloque estos números en una matriz y asígnelos a una variable que se llamará al cargar las imágenes.

4. Repita el paso 3 para las imágenes de retina que hayan sido diagnosticadas con retinopatía diabética. Las imágenes seleccionadas en este caso fueron 139, 137, 136, 135, 133, 140, 141, 116, 157, 188.

Paso 8: Cree 2 variables (normales y diagnosticadas) y configúrelas como 0

Cree 2 variables (normales y diagnosticadas) y configúrelas como 0
Cree 2 variables (normales y diagnosticadas) y configúrelas como 0

Cree estas variables antes del ciclo for para inicializar los números de ciclo.

Paso 9: cree un bucle for para cargar automáticamente imágenes normales

Cree un bucle for para cargar automáticamente imágenes normales
Cree un bucle for para cargar automáticamente imágenes normales

1. Crea un bucle for

2. Establezca una variable de conteo (i, en este caso) en una matriz de valores 1-10. Esta variable de recuento se utilizará para llamar a cada imagen individualmente

3. Tome el elemento i en la matriz de imágenes para extraer y convertir el nombre de la imagen de una cadena a un número usando la función num2str.

Encuentre el número de dígitos presentes en el nombre de la imagen usando la función numérica. Asigne este valor a una variable, digits_normal. Este número debe ser 1 para números de un solo dígito, 2 para números de dos dígitos y 3 para números de tres dígitos. Esta información se utilizará para llamar automáticamente a las imágenes.

Paso 10: Cree un bucle for para cargar automáticamente imágenes normales (cont.)

Cree un bucle for para cargar automáticamente imágenes normales (cont.)
Cree un bucle for para cargar automáticamente imágenes normales (cont.)

3. Cree una declaración if que contenga las tres posibilidades de los pasos anteriores. Si el nombre de la imagen tiene 1 dígito, la imagen se llamará “im000”, si tiene 2 dígitos, la imagen se llamará “im00”, y si tiene 3 la imagen se llamará “im0”.

4. Debajo de cada instrucción if, asigne una variable para leer "im" debajo de la instrucción if correspondiente con el número apropiado de ceros (como se describe arriba), seguido de la i.

Paso 11: Recorta los bordes de la imagen

Recortar los bordes de la imagen
Recortar los bordes de la imagen

Tome la imagen original y aplique un filtro imcrop para eliminar los bordes negros y asigne una variable I_crop. El rectángulo de recorte se especifica mediante una matriz [95, 95, 500, 410].

Paso 12: cree una imagen en escala de grises

Crear una imagen en escala de grises
Crear una imagen en escala de grises

Tome la imagen recortada y aplique el filtro rbg2gray para cambiar la imagen a escala de grises. Asigne esta imagen a la variable I2.

Paso 13: crea una imagen contrastada

Crear una imagen contrastada
Crear una imagen contrastada

Tome la imagen I2 y use imadjust para cambiar la escala de los valores de intensidad.

Tome valores que se encuentren dentro del rango [0,2, 0,7] y cambie la escala a [0, 1]. La gamma se establece en 0.8 para hacer que la imagen sea más brillante. Asigne la nueva imagen a I_adjusted.

Paso 14: mejora la imagen de contraste

Mejora la imagen de contraste
Mejora la imagen de contraste

Tome la imagen I_adjusted y use la función adapthisteq para mejorar el contraste.

La sintaxis de Adapthisteq requiere el nombre de la imagen, I_adjusted, "numTiles", el tamaño de numTiles, "nBins" y el número de bins. El tamaño de numTiles se establece en [8 8], dividiendo la imagen en mosaicos de 8x8 y el número de contenedores se establece en 28. Asigne la imagen a I_constrast.

Paso 15: cree un filtro promedio

Crear un filtro promedio
Crear un filtro promedio

Cree una variable llamada 'meanfilt' usando la función fspecial. Ingrese "función promedio" para crear el filtro promedio e inserte [90 90] para el tamaño de la ventana deslizante.

Paso 16: combine el filtro de promediado con la imagen contrastada

Combine el filtro de promediado con la imagen contrastada
Combine el filtro de promediado con la imagen contrastada

Cree una nueva variable llamada mask_mean y use la función imfilter para tomar la imagen I_contrast y aplicar el filtro de media creado previamente.

Paso 17: crea una nueva máscara media restando píxeles

Haga una nueva máscara media restando píxeles
Haga una nueva máscara media restando píxeles

Cree una variable denominada mask_mean2 y utilice la función imsubtract para restar el valor de cada píxel en I_contrast del píxel correspondiente en mask_mean.

Paso 18: Cree una imagen filtrada binaria

Crear una imagen filtrada binaria
Crear una imagen filtrada binaria

Convierta las imágenes en escala de grises a blanco y negro usando imbinarize. Introduzca mask_mean2, "adaptable", "ForegroundPolarity", "oscuro", "Sensibilidad", 0,6. Asigne esta nueva imagen a mask_binarize.

Paso 19: eliminar las manchas más pequeñas que se encuentran en las imágenes filtradas

Eliminar manchas más pequeñas encontradas en las imágenes filtradas
Eliminar manchas más pequeñas encontradas en las imágenes filtradas

Elimine los objetos con conectividad de menos de 100 píxeles utilizando la función bwareaopen en mask_binarize y establezca el valor de umbral en 100. Asigne la variable como bw.

Paso 20: Cree un elemento de estructuración de disco

Crear un elemento de estructuración de disco
Crear un elemento de estructuración de disco

Cree un elemento de estructura de disco (con un radio de 2) usando la función strel. Asignarlo a se.

Paso 21: Realizar operaciones de cierre morfológico

Realizar operaciones de cierre morfológico
Realizar operaciones de cierre morfológico

Tome bw y aplique la función imclose al elemento estructural para realizar una operación morfológica de cierre en el objeto.

Paso 22: Encuentre los objetos con conectividad de al menos 8

Encuentre los objetos con conectividad de al menos 8
Encuentre los objetos con conectividad de al menos 8

Tome bw y use bwconncomp para encontrar los objetos con conectividad de al menos 8 en la imagen. Asigne la salida numérica a cc_1.

Paso 23: Encuentre el número máximo de píxeles conectados

Encuentre el número máximo de píxeles conectados
Encuentre el número máximo de píxeles conectados
Encuentre el número máximo de píxeles conectados
Encuentre el número máximo de píxeles conectados

Utilice la función cellfun para realizar la función "numel" en cada celda de CC. Esto encuentra el número de elementos en la celda PixelIdxList. Asignar valor a "numPixels".

Encuentre los valores máximos en numPIxels. Asigne el máximo más grande a "más grande" y el índice del valor máximo a "idx".

Paso 24: establezca los valores máximos de píxeles en 0 y busque píxeles con> = 26 píxeles de conectividad

Eliminar vasos sanguíneos en la imagen
Eliminar vasos sanguíneos en la imagen

= Conectividad de 26 píxeles "src =" https://content.instructables.com/ORIG/FXY/DTW3/JEOIIEL4/FXYDTW3JEOIIEL4-p.webp

Pantalla de figura
Pantalla de figura

= Conectividad de 26 píxeles "src =" https://content.instructables.com/ORIG/FXO/GBX1/JEOIIELB/FXOGBX1JEOIIELB-p.webp

Retire los vasos y cuente las gotas de sangre
Retire los vasos y cuente las gotas de sangre

= 26 Pixel Connectivity "src =" {{file.large_url | add: 'auto = webp & frame = 1 & height = 300'%} ">

Diagnostique la imagen de la retina según la cantidad de coágulos de sangre identificados
Diagnostique la imagen de la retina según la cantidad de coágulos de sangre identificados

= 26 Pixel Connectivity "src =" {{file.large_url | add: 'auto = webp & frame = 1 & height = 300'%} ">

Establezca los píxeles con los valores más grandes en la imagen "bw" en 0, haciendo que los píxeles sean negros.

Encuentre los objetos con una conectividad de al menos 26 píxeles en la imagen usando bwconncomp. Asignar a la variable cc_1.

Paso 25: eliminar los vasos sanguíneos de la imagen

Retire los vasos sanguíneos aún presentes en la imagen utilizando la función bwpropfilt con un rango de [0, 0,9].

[0.9, 1] se excluye porque los valores cercanos a 1 indican una línea. Asignar a "RemoveVessels".

Paso 26: Visualización de la figura

Muestra cada imagen filtrada en una subtrama. Imshow. con entradas de "borde" y "ajustado", muestra cada imagen en una estructura de subtrama. Agregue un título a cada imagen para distinguir qué filtro se utilizó.

Paso 27: Retire los vasos y cuente las gotas de sangre

1. Tome "RemoveVessels" y aplique la función "Centroide" en los accesorios regionales para identificar los centroides de los objetos en la imagen. Estos objetos deben corresponder a los coágulos de sangre presentes en la imagen.

2. Cuente el número de coágulos de sangre identificados tomando la longitud de la matriz del centroide.

Paso 28: diagnostique la imagen de la retina según la cantidad de coágulos de sangre identificados

Utilice las declaraciones if para diagnosticar la imagen según la cantidad de coágulos de sangre identificados.

Si el número de centroides identificados fue menor o igual a 5, la imagen se identificó como normal.

Si el número de centroides era superior a 5, la imagen se diagnosticaba con retinopatía diabética.

El resultado se imprime en la ventana de comandos usando fprintf.

Paso 29: si hay más de 5 manchas …

Si hay más de 5 manchas …
Si hay más de 5 manchas …

Repita las instrucciones anteriores para imágenes diagnosticadas como una declaración else. Esta parte se ejecutará si el número de blobs es superior a 5.

Termine la declaración if.

Paso 30: Repita el proceso de filtrado para imágenes normales con valores de dígitos de imagen como 2 y 3

Repita el proceso de filtrado para imágenes normales con valores de dígitos de imagen como 2 y 3
Repita el proceso de filtrado para imágenes normales con valores de dígitos de imagen como 2 y 3
Repita el proceso de filtrado para imágenes normales con valores de dígitos de imagen como 2 y 3
Repita el proceso de filtrado para imágenes normales con valores de dígitos de imagen como 2 y 3

Repita el proceso para el resto de las declaraciones if originales cuando numel (el número de dígitos en el número de la imagen) es igual a 2 y 3. Esto completa el ciclo for para las imágenes normales.

Finaliza el ciclo for.

Paso 31: Repita todo el proceso para las imágenes diagnosticadas

Repita todo el proceso para las imágenes diagnosticadas
Repita todo el proceso para las imágenes diagnosticadas

Repita todo el proceso utilizando las imágenes diagnosticadas enumeradas por la matriz "números_para_extraer_diagnosticados".

Asegúrese de revisar cada figura (i) y cámbiela por la figura (i + 10) para que las cifras diagnosticadas aparezcan como imágenes 11 a 20.

Paso 32: Análisis estadístico

Análisis estadístico
Análisis estadístico

1. 'Actual_Diagnosis_Matrix' se utiliza para comparar los resultados con el diagnóstico oficial que se encuentra en el archivo txt. Los primeros 10 ceros indican que las primeras 10 imágenes deberían ser normales. Las últimas 10 indican que las últimas 10 imágenes deben clasificarse como retinopatía diabética.

2. El doble signo igual utilizado para crear 'number_correct' crea una matriz lógica comparando el valor de los elementos correspondientes de 'Actual_Diagnosis_Matrix' con 'Diagnosis_Matrix' creado a partir del bucle for.

Para cada elemento que coincida con el diagnóstico se agregará un 1, lo que significa que el código diagnosticó correctamente esa imagen. Si es incorrecto, agregará un 0 a la matriz.

Luego, tomando la suma de eso, se suman todos los unos. En otras palabras, encuentra la suma de imágenes correctamente diagnosticadas.

3. 'Final_percentage_correct' es el porcentaje calculado de la precisión con la que el código diagnosticó retinopatía diabética. La cantidad de imágenes diagnosticadas correctamente se divide por 20 (la cantidad total de imágenes) y se multiplica por 100 para encontrar el porcentaje de diagnósticos exitosos.

Paso 33: Encontrar el intervalo de confianza

Encontrar el intervalo de confianza
Encontrar el intervalo de confianza

1. Asegúrese de haber descargado ModWald.m para llamarlo como función. Sin la función, tendría que calcular usted mismo el intervalo de confianza utilizando el método de Wald modificado.

2. La función ModWald tiene 2 entradas donde la primera es el número de imágenes correctamente identificadas y la segunda es la cantidad total de imágenes.

3. La función ModWald generará los límites inferior y superior del intervalo de confianza de proporciones para la precisión de los datos muestreados. En otras palabras, le dará un intervalo de porcentajes donde estará el porcentaje real de precisión del código.

4. Utilice fprintf a continuación para generar las estadísticas y el intervalo de confianza en la ventana de comandos.

> fprintf ('%. 0f por ciento de las imágenes de la retina se diagnosticaron correctamente según el diagnóstico oficial. / n / n', Final_percentage_correct)

> fprintf ('El porcentaje real en el que nuestro código diagnosticará correctamente la retinopatía diabética / n caerá en el rango de [%.3f,%.3f], basado en 20 imágenes de muestra / n', lower_bound, upper_bound)

Recomendado: