Taula de continguts:

Diagnòstic automatitzat de retinopatia diabètica mitjançant MATLAB: 33 passos
Diagnòstic automatitzat de retinopatia diabètica mitjançant MATLAB: 33 passos

Vídeo: Diagnòstic automatitzat de retinopatia diabètica mitjançant MATLAB: 33 passos

Vídeo: Diagnòstic automatitzat de retinopatia diabètica mitjançant MATLAB: 33 passos
Vídeo: L’ICS Catalunya Central inicia un projecte de recerca perquè la retinopatia diabètica 2024, De novembre
Anonim
Diagnòstic automatitzat de retinopatia diabètica mitjançant MATLAB
Diagnòstic automatitzat de retinopatia diabètica mitjançant MATLAB
Diagnòstic automatitzat de retinopatia diabètica mitjançant MATLAB
Diagnòstic automatitzat de retinopatia diabètica mitjançant MATLAB

(Vegeu l'esquema del codi anterior)

La retinopatia diabètica és una malaltia ocular relacionada amb la diabetis causada per nivells elevats de sucre en sang. Els nivells elevats de sucre en la sang fan que els vasos sanguinis de la retina s’inflin, cosa que provoca l’augment dels vasos sanguinis i fins i tot les fuites dels vasos, que condueixen a taques fosques en les imatges de la retina. Amb aquest codi, pretenem utilitzar l'aparició de taques de fuites de vasos sanguinis com a indicador de la retinopatia diabètica de fons, tot i que es necessitarien tècniques de diagnòstic addicionals al món real. L'objectiu d'aquest codi és automatitzar el processament d'imatges i el diagnòstic d'imatges retinianes per identificar els signes de retinopatia diabètica que es mostren a través de taques fosques a les imatges retinianes.

Es van processar 10 imatges de retina normals i 10 imatges de retina diagnosticades mitjançant un codi que primer llegeix i filtra les imatges i, a continuació, quantifica les taques fosques per determinar si hi ha símptomes de retinopatia diabètica, basant-se en un llindar determinat. Els resultats s'imprimeixen a la finestra d'ordres per a la interpretació del visor.

Pas 1: requisits previs

Requisits previs
Requisits previs

1. Assegureu-vos que teniu el programa MATLAB descarregat a l'ordinador.

2. Baixeu el fitxer txt que trobareu a l'enllaç. (Premeu 'Ctrl + s' per desar-lo al mateix directori que el codi MATLAB)

Pas 2: requisits previs (no)

Requisits previs (no)
Requisits previs (no)
Requisits previs (no)
Requisits previs (no)

4. Obriu MATLAB i escriviu "uiimport" a la finestra d'ordres.

5. Seleccioneu el fitxer officialdiagnoses.txt i importeu-lo a MATLAB com a matriu de cel·les.

6. Assegureu-vos de veure "diagnòstics oficials" com a variable a l'espai de treball.

Pas 3: requisits previs (no)

Requisits previs (no)
Requisits previs (no)

7. Descarregueu la funció ModWald.m, que es pot obtenir a partir del codi anterior o descarregueu-la des de Canvas.

(Codi proporcionat pel professor King i el professor Choi)

Pas 4: requisits previs (no)

Requisits previs (no)
Requisits previs (no)

8. Descarregueu les 400 imatges en brut de la secció de dades de The STARE Project.

Pas 5: netejar Matlab per preparar-se per executar el codi

Neteja Matlab per preparar-te per executar el codi
Neteja Matlab per preparar-te per executar el codi

Afegeix al codi:

1. tanca-ho tot (tanca totes les imatges obertes anteriorment)

2. clearvars - excepte diagnòstics oficials (neteja totes les variables, excepte el fitxer txt de diagnòstic oficial importat anteriorment)

3. cclc (Esborra la finestra d'ordres)

Pas 6: seleccioneu 10 imatges normals dels ulls i 10 imatges amb símptomes de retinopatia diabètica

Seleccioneu 10 imatges normals dels ulls i 10 imatges amb símptomes de retinopatia diabètica
Seleccioneu 10 imatges normals dels ulls i 10 imatges amb símptomes de retinopatia diabètica
Seleccioneu 10 imatges normals dels ulls i 10 imatges amb símptomes de retinopatia diabètica
Seleccioneu 10 imatges normals dels ulls i 10 imatges amb símptomes de retinopatia diabètica

1. Agafeu el fitxer de text de diagnòstic i extreu els noms de les imatges. Aquests noms es troben a la primera columna del fitxer de text, de manera que, per extreure'ls, escriviu 'officialdiagnoses (:, 1)'. La matriu de noms d'imatges s'ha assignat a una variable, "all_image_numbers"

2. Convertiu la variable all_image_numbers d'una matriu de cel·les a una matriu mitjançant la funció cell2mat

Pas 7: seleccioneu 10 imatges normals dels ulls i 10 imatges amb símptomes de retinopatia diabètica (no)

Seleccioneu 10 imatges normals dels ulls i 10 imatges amb símptomes de retinopatia diabètica (no)
Seleccioneu 10 imatges normals dels ulls i 10 imatges amb símptomes de retinopatia diabètica (no)
Seleccioneu 10 imatges normals dels ulls i 10 imatges amb símptomes de retinopatia diabètica (no)
Seleccioneu 10 imatges normals dels ulls i 10 imatges amb símptomes de retinopatia diabètica (no)

3. Seleccioneu 10 imatges normals per executar el codi. Les imatges seleccionades en aquest cas van ser 278, 199, 241, 235, 35, 77, 82, 164, 239, 170.

Col·loqueu aquests números en una matriu i assigneu-los a una variable que es cridarà en carregar les imatges.

4. Repetiu el pas 3 per a les imatges retinianes que han estat diagnosticades amb retinopatia diabètica. Les imatges seleccionades en aquest cas van ser 139, 137, 136, 135, 133, 140, 141, 116, 157, 188.

Pas 8: creeu 2 variables (normals i diagnosticades) i configureu-les iguals a 0

Creeu 2 variables (normals i diagnosticades) i configureu-les iguals a 0
Creeu 2 variables (normals i diagnosticades) i configureu-les iguals a 0

Creeu aquestes variables abans del bucle for per inicialitzar els números del bucle.

Pas 9: creeu un bucle per penjar automàticament imatges normals

Creeu un bucle per penjar automàticament imatges normals
Creeu un bucle per penjar automàticament imatges normals

1. Creeu un bucle for

2. Establiu una variable de recompte (i, en aquest cas) a una matriu de valors 1-10. Aquesta variable de recompte s'utilitzarà per cridar cada imatge individualment

3. Agafeu l'element i a la matriu d'imatges per extreure i convertir el nom de la imatge d'una cadena a un número mitjançant la funció num2str.

Cerqueu el nombre de dígits presents al nom de la imatge mitjançant la funció numeral. Assigneu aquest valor a una variable, dígits_normals. Aquest número hauria de ser 1 per als números d’un sol dígit, 2 per als números de dos dígits i 3 per als números de tres dígits. Aquesta informació s'utilitzarà per trucar automàticament a imatges.

Pas 10: creeu un bucle per carregar automàticament imatges normals (no)

Creeu un bucle per penjar automàticament imatges normals (no)
Creeu un bucle per penjar automàticament imatges normals (no)

3. Creeu una sentència if que contingui les tres possibilitats dels passos anteriors. Si el nom de la imatge té 1 dígit, la imatge s'anomenarà "im000", si té 2 dígits, la imatge s'anomenarà "im00" i, si en té 3, la imatge s'anomenarà "im0".

4. Sota cada sentència if, assigneu una variable per a llegir "im" a la sentència if corresponent amb el nombre adequat de zeros (tal com s'ha descrit anteriorment), seguida de la i.

Pas 11: retalleu les vores de la imatge

Retalleu les vores de la imatge
Retalleu les vores de la imatge

Agafeu la imatge original i apliqueu un filtre imcrop per eliminar els marges negres i assigneu-los a una variable I_crop. El rectangle de retall s’especifica mitjançant una matriu [95, 95, 500, 410].

Pas 12: creeu una imatge a escala de grisos

Creeu una imatge a escala de grisos
Creeu una imatge a escala de grisos

Agafeu la imatge retallada i apliqueu el filtre rbg2gray per canviar la imatge a escala de grisos. Assigneu aquesta imatge a la variable I2.

Pas 13: creeu una imatge contrastada

Creeu una imatge contrastada
Creeu una imatge contrastada

Agafeu la imatge I2 i utilitzeu imadjust per canviar els valors d’intensitat.

Agafeu valors que estiguin dins de l'interval [0,2, 0,7] i torneu a escalar-los a un [0, 1]. La gamma està configurada a 0,8 per fer la imatge més brillant. Assigneu la nova imatge a I_adjusted.

Pas 14: Milloreu la imatge de contrast

Milloreu la imatge de contrast
Milloreu la imatge de contrast

Agafeu la imatge I_adjusted i utilitzeu la funció adapthisteq per millorar el contrast.

La sintaxi Adapthisteq requereix el nom de la imatge, I_adjusted, "numTiles", la mida de numTiles, "nBins" i el nombre de contenidors. La mida de numTiles s'estableix a [8 8], dividint la imatge en mosaics de 8x8 i el nombre de contenidors a 28. Assigneu la imatge a I_constrast.

Pas 15: creeu un filtre mitjà

Creeu un filtre mitjà
Creeu un filtre mitjà

Creeu una variable anomenada "meanfilt" mitjançant la funció especial. Introduïu "funció mitjana" per crear el filtre de mitjana i inseriu [90 90] per a la mida de la finestra lliscant.

Pas 16: combineu el filtre de mitjana amb la imatge contrastada

Combineu el filtre de mitjana amb la imatge contrastada
Combineu el filtre de mitjana amb la imatge contrastada

Creeu una variable nova anomenada mask_mean i utilitzeu la funció imfilter per prendre la imatge I_contrast i aplicar el filtre mitjà creat anteriorment.

Pas 17: feu una nova màscara mitjana restant píxels

Feu una nova màscara mitjana restant píxels
Feu una nova màscara mitjana restant píxels

Creeu una variable anomenada mask_mean2 i utilitzeu la funció imsubtract per restar el valor de cada píxel a I_contrast del píxel corresponent a mask_mean.

Pas 18: creeu una imatge filtrada binària

Creeu una imatge filtrada binària
Creeu una imatge filtrada binària

Gireu les imatges en escala de grisos a blanc i negre amb imbinar. Entrada mask_mean2, "adaptative", "ForegroundPolarity", "dark", "Sensitivity", 0,6. Assigneu aquesta nova imatge a mask_binarize.

Pas 19: suprimiu els blobs més petits que es troben a les imatges filtrades

Elimineu els blobs més petits de les imatges filtrades
Elimineu els blobs més petits de les imatges filtrades

Elimineu objectes amb connectivitat inferior a 100 píxels mitjançant la funció bwareaopen de mask_binarize i establiu el valor llindar a 100. Assigneu la variable com a bw.

Pas 20: creeu un element d’estructura de disc

Creeu un element d’estructura de disc
Creeu un element d’estructura de disc

Creeu un element d’estructuració de disc (amb un radi de 2) mitjançant la funció strel. Assigneu-lo a se.

Pas 21: realitzeu operacions de tancament morfològic

Realitzar operacions de tancament morfològic
Realitzar operacions de tancament morfològic

Agafeu bw i apliqueu la funció imclose a l'element estructural per realitzar una operació morfològica propera a l'objecte.

Pas 22: cerqueu els objectes amb connectivitat de com a mínim 8

Cerqueu els objectes amb connectivitat de com a mínim 8
Cerqueu els objectes amb connectivitat de com a mínim 8

Agafeu bw i utilitzeu bwconncomp per trobar objectes amb una connectivitat mínima de 8 a la imatge. Assigneu el número de sortida a cc_1.

Pas 23: cerqueu el nombre màxim de píxels connectats

Cerqueu el nombre màxim de píxels connectats
Cerqueu el nombre màxim de píxels connectats
Cerqueu el nombre màxim de píxels connectats
Cerqueu el nombre màxim de píxels connectats

Utilitzeu la funció cellfun per realitzar la funció "numel" a totes les cel·les de CC. Es troba el nombre d'elements a la cel·la PixelIdxList. Assigneu valor a "numPixels".

Cerqueu els valors màxims en numPIxels. Assigneu el màxim màxim a "més gran" i l'índex del valor màxim a "idx".

Pas 24: definiu els valors de píxels màxims a 0 i cerqueu píxels amb> = 26 píxels de connectivitat

Elimina els vasos sanguinis de la imatge
Elimina els vasos sanguinis de la imatge

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

Visualització de la figura
Visualització de la figura

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

Traieu els vaixells i compteu les taques de sang
Traieu els vaixells i compteu les taques de sang

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

Diagnostiqueu la imatge de la retina en funció del nombre de coàguls de sang identificats
Diagnostiqueu la imatge de la retina en funció del nombre de coàguls de sang identificats

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

Establiu els píxels amb els valors més grans de la imatge "bw" a 0, fent que els píxels siguin negres.

Cerqueu els objectes amb una connectivitat mínima de 26 píxels a la imatge mitjançant bwconncomp. Assigna a la variable cc_1.

Pas 25: traieu els vasos sanguinis de la imatge

Traieu els vasos sanguinis encara presents a la imatge mitjançant la funció bwpropfilt amb un interval de [0, 0,9].

[0,9, 1] s'exclou perquè els valors propers a 1 indiquen una línia. Assigneu a "RemoveVessels".

Pas 26: visualització de la figura

Mostra cada imatge filtrada en una subtrama. Imshow. amb entrades "vores" i "ajustades", mostra cada imatge en una estructura de subtrama. Afegiu un títol a cada imatge per distingir quin filtre s'ha utilitzat.

Pas 27: traieu els vaixells i compteu les taques de sang

1. Agafeu "RemoveVessels" i apliqueu la funció "Centroid" a regionalprops per identificar els centroides dels objectes de la imatge. Aquests objectes haurien de correspondre a coàguls de sang presents a la imatge.

2. Compteu el nombre de coàguls de sang identificats prenent la longitud de la matriu del centreide.

Pas 28: diagnostiqueu la imatge de la retina en funció del nombre de coàguls de sang identificats

Utilitzeu declaracions if per diagnosticar la imatge en funció del nombre de coàguls de sang identificats.

Si el nombre de centroides identificats era inferior o igual a 5, la imatge s’identificaria com a normal.

Si el nombre de centroides va ser superior a 5, la imatge es va diagnosticar amb retinopatia diabètica.

El resultat s’imprimeix a la finestra d’ordres mitjançant fprintf.

Pas 29: si hi ha més de 5 bombolles …

Si hi ha més de 5 bombolles …
Si hi ha més de 5 bombolles …

Repetiu les instruccions anteriors per a les imatges diagnosticades com a declaració else. Aquesta part s’executarà si el nombre de blobs és superior a 5.

Finalitzeu la sentència if.

Pas 30: Repetiu el procés de filtratge per a imatges normals amb valors de dígits d'imatge com a 2 i 3

Repetiu el procés de filtratge per a imatges normals amb valors de dígits d'imatge com a 2 i 3
Repetiu el procés de filtratge per a imatges normals amb valors de dígits d'imatge com a 2 i 3
Repetiu el procés de filtratge per a imatges normals amb valors de dígits d'imatge com a 2 i 3
Repetiu el procés de filtratge per a imatges normals amb valors de dígits d'imatge com a 2 i 3

Repetiu el procés per a la resta de l'original si les sentències quan numel (el nombre de dígits del número de la imatge) és igual a 2 i 3. Això completa el bucle for de les imatges normals.

Finalitzeu el bucle for.

Pas 31: Repetiu tot el procés per a les imatges diagnosticades

Repetiu tot el procés per a les imatges diagnosticades
Repetiu tot el procés per a les imatges diagnosticades

Repetiu tot el procés utilitzant les imatges diagnosticades que apareixen a la matriu "números_extracte_diagnosticat".

Assegureu-vos de passar per totes les figures (i) i canviar-les per la figura (i + 10) perquè les figures diagnosticades apareguin com a imatges 11 a 20.

Pas 32: Anàlisi estadística

Anàlisi estadística
Anàlisi estadística

1. "Actual_Diagnosis_Matrix" s'utilitza per comparar els resultats amb el diagnòstic oficial que es troba al fitxer txt. Els primers 10 zeros indiquen que les primeres 10 imatges haurien de ser normals. Els darrers 10 indiquen que les darreres 10 imatges s’han de classificar com a retinopatia diabètica.

2. El doble signe d'igualtat utilitzat per crear "número_correcte" crea una matriu lògica comparant el valor dels elements corresponents de "Matriu_diagnòstic_actual" amb "Matriu de diagnòstic" creat a partir del bucle for.

Per a cada element que coincideixi amb el diagnòstic s'afegirà un 1, és a dir, el codi va diagnosticar correctament aquesta imatge. Si és incorrecte, afegirà un 0 a la matriu.

A continuació, prenent la suma d'això se sumen tots. Dit d’una altra manera, troba la suma d’imatges diagnosticades correctament.

3. "Final_percentage_correct" és el percentatge calculat de la precisió amb què el codi va diagnosticar retinopatia diabètica. El nombre d'imatges diagnosticades correctament es divideix per 20 (el nombre total d'imatges) i es multiplica per 100 per trobar el percentatge de diagnòstics reeixits.

Pas 33: trobar l'interval de confiança

Trobar l'interval de confiança
Trobar l'interval de confiança

1. Assegureu-vos que heu descarregat ModWald.m per trucar-lo com a funció. Sense la funció, hauríeu de calcular vosaltres mateixos l’interval de confiança mitjançant el mètode Wald modificat.

2. La funció ModWald té 2 entrades on la primera és el nombre d'imatges identificades correctament i la segona és la quantitat total d'imatges.

3. La funció ModWald generarà els límits inferior i superior de l'interval de confiança de proporcions per a la precisió de les dades mostrejades. En altres paraules, donareu un interval de percentatges on es troba el percentatge real de la precisió del codi.

4. Utilitzeu fprintf a continuació per publicar les estadístiques i l'interval de confiança a la finestra d'ordres.

> fprintf ('%. El 0% de les imatges de la retina es van diagnosticar correctament segons el diagnòstic oficial. / n / n', Final_percentage_correct)

> fprintf ("El percentatge real en què el nostre codi diagnosticarà correctament la retinopatia diabètica / n es situarà en el rang de [%.3f,%.3f], basat en 20 imatges mostrejades / n", lower_bound, upper_bound)

Recomanat: