Innholdsfortegnelse:

Automatisert diagnose av diabetisk retinopati via MATLAB: 33 trinn
Automatisert diagnose av diabetisk retinopati via MATLAB: 33 trinn

Video: Automatisert diagnose av diabetisk retinopati via MATLAB: 33 trinn

Video: Automatisert diagnose av diabetisk retinopati via MATLAB: 33 trinn
Video: Пакет-68 Внутренний крупный проект «Выявление и анализ диабетической ретинопатии с использованием глубокого обучения» 2024, November
Anonim
Automatisert diagnose av diabetisk retinopati via MATLAB
Automatisert diagnose av diabetisk retinopati via MATLAB
Automatisert diagnose av diabetisk retinopati via MATLAB
Automatisert diagnose av diabetisk retinopati via MATLAB

(Se kodeoversikt ovenfor)

Diabetisk retinopati er en diabetesrelatert øyesykdom forårsaket av høyt blodsukkernivå. Det høye blodsukkernivået får blodårene i netthinnen til å hovne opp, noe som fører til forstørrede blodårer og til og med karlekkasjer, noe som fører til mørke flekker i netthinnebilder. Med denne koden tar vi sikte på å bruke utseendet på blodkarlekkasjer som en indikator på diabetisk retinopati i bakgrunnen, selv om ytterligere diagnoseteknikker ville være nødvendig i den virkelige verden. Målet med denne koden er å automatisere bildebehandling og diagnostisering av netthinnebilder for å identifisere tegn på diabetisk retinopati vist gjennom mørke flekker i netthinnebildene.

10 normale netthinnebilder og 10 diagnostiserte netthinnebilder ble behandlet gjennom en kode som først leser og filtrerer bildene og deretter kvantifiserer de mørke flekkene for å avgjøre om diabetiske retinopatisymptomer er tilstede, basert på en gitt terskel. Resultatene skrives deretter ut på kommandovinduet for tolkning av seerne.

Trinn 1: Forutsetninger

Forutsetninger
Forutsetninger

1. Kontroller at du har MATLAB -programmet lastet ned på datamaskinen.

2. Last ned txt -filen som finnes i lenken. (Trykk ‘ctrl+s’ for å lagre i samme katalog som MATLAB -koden)

Trinn 2: Forutsetninger (fortsett)

Forutsetninger (forts.)
Forutsetninger (forts.)
Forutsetninger (forts.)
Forutsetninger (forts.)

4. Åpne MATLAB og skriv ‘uiimport’ i kommandovinduet.

5. Velg filen officialdiagnoses.txt og importer den til MATLAB som en cellematrise.

6. Sørg for at du ser "offisielle diagnoser" som en variabel i arbeidsområdet.

Trinn 3: Forutsetninger (fortsett)

Forutsetninger (forts.)
Forutsetninger (forts.)

7. Last ned funksjonen ModWald.m, som kan hentes fra ovennevnte kode eller lastes ned fra Canvas.

(Kode gitt av professor King og professor Choi)

Trinn 4: Forutsetninger (fortsett)

Forutsetninger (forts.)
Forutsetninger (forts.)

8. Last ned de 400 råbildene fra dataseksjonen i STARE -prosjektet.

Trinn 5: Rydd opp Matlab for å forberede kjøring av kode

Rydd opp Matlab for å forberede kjøringskoden
Rydd opp Matlab for å forberede kjøringskoden

Legg til i koden:

1. Lukk alle (Lukker alle tidligere åpnede bilder)

2. clearvars - unntatt offisiell diagnose (sletter alle variabler unntatt den offisielle diagnosen txt -filen som tidligere er importert)

3. cclc (sletter kommandovinduet)

Trinn 6: Velg 10 normale øyebilder og 10 bilder med diabetisk retinopati

Velg 10 normale øyebilder og 10 bilder med diabetisk retinopati
Velg 10 normale øyebilder og 10 bilder med diabetisk retinopati
Velg 10 normale øyebilder og 10 bilder med diabetisk retinopati
Velg 10 normale øyebilder og 10 bilder med diabetisk retinopati

1. Ta diagnosetekstfilen og trekk ut bildenavnene. Disse navnene finnes i den første kolonnen i tekstfilen, så for å trekke dem ut, skriver du 'officialdiagnoses (:, 1)'. Matrisen med bildenavn ble tilordnet en variabel, "all_image_numbers"

2. Konverter variabelen all_image_numbers fra en cellematrise til en matrisematrise ved hjelp av cell2mat -funksjonen

Trinn 7: Velg 10 normale øyebilder og 10 bilder med diabetiske retinopati -symptomer (fortsett)

Velg 10 normale øyebilder og 10 bilder med diabetiske retinopati -symptomer (fortsett)
Velg 10 normale øyebilder og 10 bilder med diabetiske retinopati -symptomer (fortsett)
Velg 10 normale øyebilder og 10 bilder med diabetiske retinopati -symptomer (fortsett)
Velg 10 normale øyebilder og 10 bilder med diabetiske retinopati -symptomer (fortsett)

3. Velg 10 normale øyebilder for å kjøre koden. Bildene som ble valgt i dette tilfellet var 278, 199, 241, 235, 35, 77, 82, 164, 239, 170.

Plasser disse tallene i en matrise og tilordne dem til en variabel som vil bli kalt når du laster inn bildene.

4. Gjenta trinn 3 for netthinnebilder som har blitt diagnostisert med diabetisk retinopati. Bildene som ble valgt i dette tilfellet var 139, 137, 136, 135, 133, 140, 141, 116, 157, 188.

Trinn 8: Lag to variabler (normal og diagnostisert) og sett dem hver til 0

Lag to variabler (normal og diagnostisert) og sett dem hver til 0
Lag to variabler (normal og diagnostisert) og sett dem hver til 0

Lag disse variablene før for -sløyfen for å initialisere sløyfetallene.

Trinn 9: Lag en for loop for automatisk opplasting av normale bilder

Lag en for Loop for å automatisk laste opp normale bilder
Lag en for Loop for å automatisk laste opp normale bilder

1. Lag en for loop

2. Sett en tellevariabel (i, i dette tilfellet) til en matrise med verdiene 1-10. Denne tellevariabelen vil bli brukt til å kalle hvert bilde individuelt

3. Ta i -elementet i bildematrisen for å trekke ut og konvertere bildenavnet fra en streng til et tall ved hjelp av num2str -funksjonen.

Finn antall sifre som er tilstede i bildenavnet ved hjelp av tallfunksjonen. Tilordne denne verdien til en variabel, digits_normal. Dette tallet bør være 1 for enkeltsifrede tall, 2 for tosifrede tall og 3 for tresifrede tall. Denne informasjonen vil bli brukt til å ringe bilder automatisk.

Trinn 10: Lag en for loop for å automatisk laste opp normale bilder (fortsett)

Lag en for Loop for å automatisk laste opp normale bilder (fortsett)
Lag en for Loop for å automatisk laste opp normale bilder (fortsett)

3. Lag en if -setning som inneholder alle tre mulighetene fra de foregående trinnene. Hvis bildetavnet har 1 siffer, vil bildet bli kalt "im000", hvis det har to siffer, vil bildet bli kalt "im00", og hvis det har 3, vil bildet bli kalt "im0".

4. Under hver if -setning tilordner du en variabel for å lese "im" under den tilsvarende if -setningen med det riktige antallet nuller (som beskrevet ovenfor), etterfulgt av i.

Trinn 11: Beskjær kantene på bildet

Beskjær kantene på bildet
Beskjær kantene på bildet

Ta det originale bildet og bruk et imcrop -filter for å eliminere svarte kanter og tilordne en variabel I_crop. Beskjæringsrektangelet er spesifisert ved hjelp av en matrise [95, 95, 500, 410].

Trinn 12: Lag et gråtonebilde

Lag et gråtonebilde
Lag et gråtonebilde

Ta det beskårne bildet og bruk rbg2gray -filteret for å endre bildet til gråtoner. Tilordne dette bildet til variabel I2.

Trinn 13: Lag et kontrastbilde

Lag et kontrastbilde
Lag et kontrastbilde

Ta bildet I2 og bruk imadjust for å skalere intensitetsverdiene.

Ta verdier som faller innenfor området [0,2, 0,7] og omskaler dem til en [0, 1]. Gamma er satt til 0,8 for å gjøre bildet lysere. Tilordne det nye bildet til I_adjusted.

Trinn 14: Forbedre kontrastbildet

Forbedre kontrastbildet
Forbedre kontrastbildet

Ta det jeg_justerte bildet og bruk adapthisteq -funksjonen for å forbedre kontrasten.

Adapthisteq -syntaksen krever bildenavnet, I_adjusted, ‘numTiles’, størrelsen på numTiles, ‘nBins’ og antall hyller. Størrelsen på numTiles er satt til [8 8], ved å dele bildet i 8 x 8 fliser og antall søppelbøtter er satt til 28. Tilordne bildet til I_constrast.

Trinn 15: Lag et gjennomsnittsfilter

Lag et gjennomsnittsfilter
Lag et gjennomsnittsfilter

Lag en variabel med navnet 'meanfilt' ved å bruke fspecial -funksjonen. Skriv inn "gjennomsnittlig funksjon" for å lage gjennomsnittsfiltret og sett inn [90 90] for størrelsen på skyvevinduet.

Trinn 16: Kombiner gjennomsnittsfilteret med kontrastbildet

Kombiner gjennomsnittsfilteret med kontrastbildet
Kombiner gjennomsnittsfilteret med kontrastbildet

Lag en ny variabel som heter mask_mean, og bruk imfilter -funksjonen til å ta I_contrast -bildet og bruke middelfilteret som ble opprettet tidligere.

Trinn 17: Lag en ny gjennomsnittsmaske ved å trekke fra piksler

Lag en ny middelmaske ved å trekke fra piksler
Lag en ny middelmaske ved å trekke fra piksler

Lag en variabel som heter mask_mean2, og bruk funksjonen imsubtract til å trekke verdien av hver piksel i I_contrast fra den tilsvarende pixelen i mask_mean.

Trinn 18: Lag et binært filtrert bilde

Lag et binært filtrert bilde
Lag et binært filtrert bilde

Gjør gråtonebilder til svart -hvitt ved hjelp av imbinarize. Skriv inn mask_mean2, 'adaptiv', 'Forgrunnspolaritet', 'mørk', 'Følsomhet', 0.6. Tilordne dette nye bildet til mask_binarize.

Trinn 19: Fjern mindre blobs som finnes i filtrerte bilder

Fjern mindre blobs som finnes i filtrerte bilder
Fjern mindre blobs som finnes i filtrerte bilder

Fjern objekter med tilkobling mindre enn 100 piksler ved hjelp av bwareaopen -funksjonen på mask_binarize og sett terskelverdien til 100. Tilordne variabelen som bw.

Trinn 20: Lag et diskstruktureringselement

Lag et diskstruktureringselement
Lag et diskstruktureringselement

Lag et diskstruktureringselement (med en radius på 2) ved hjelp av strel -funksjonen. Tilordne det til se.

Trinn 21: Utfør morfologiske lukkeoperasjoner

Utfør morfologiske lukkeoperasjoner
Utfør morfologiske lukkeoperasjoner

Ta bw og bruk funksjonen Imclose på det strukturelle elementet for å utføre en morfologisk tett operasjon på objektet.

Trinn 22: Finn objektene med tilkobling minst 8

Finn objektene med tilkobling minst 8
Finn objektene med tilkobling minst 8

Ta bw og bruk bwconncomp for å finne objektene med tilkobling på minst 8 i bildet. Tilordne nummerutgangen til cc_1.

Trinn 23: Finn maksimalt antall tilkoblede piksler

Finn maksimalt antall tilkoblede piksler
Finn maksimalt antall tilkoblede piksler
Finn maksimalt antall tilkoblede piksler
Finn maksimalt antall tilkoblede piksler

Bruk cellfunfunksjonen til å utføre funksjonen "numel" på hver celle i CC. Dette finner antall elementer i PixelIdxList -cellen. Tilordne verdi til “numPixels”.

Finn maksimalverdiene i numPIxels. Tilordne det største maksimumet til “største” og indeksen for maksimumsverdien til “idx”.

Trinn 24: Sett Maks. Pikselverdier til 0 og Finn piksler med> = 26 pikseltilkoblinger

Fjern blodkar i bildet
Fjern blodkar i bildet

= 26 Pixel -tilkobling "src =" https://content.instructables.com/ORIG/FXY/DTW3/JEOIIEL4/FXYDTW3JEOIIEL4-p.webp

Figur Display
Figur Display

= 26 Pixel -tilkobling "src =" https://content.instructables.com/ORIG/FXO/GBX1/JEOIIELB/FXOGBX1JEOIIELB-p.webp

Fjern fartøyer og tell blodblokker
Fjern fartøyer og tell blodblokker

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

Diagnostiser netthinnebildet basert på antall identifiserte blodpropper
Diagnostiser netthinnebildet basert på antall identifiserte blodpropper

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

Sett pikslene med de største verdiene i bildet "bw" til 0, slik at pikslene blir svarte.

Finn objektene med en tilkobling på minst 26 piksler i bildet ved hjelp av bwconncomp. Tilordne variabelen cc_1.

Trinn 25: Fjern blodkar i bildet

Fjern blodårene som fremdeles er på bildet ved hjelp av bwpropfilt -funksjonen med et område på [0, 0,9].

[0,9, 1] er ekskludert fordi verdier nær 1 angir en linje. Tilordne “RemoveVessels”.

Trinn 26: Figurvisning

Vis hvert filtrert bilde i en delplot. Imshow. med "kantlinje" og "stramme" innganger, viser hvert bilde i en delplottstruktur. Legg til en tittel på hvert bilde for å skille hvilket filter som ble brukt.

Trinn 27: Fjern fartøyer og tell blodblokker

1. Ta “RemoveVessels” og bruk “Centroid” -funksjonen i regionprops for å identifisere sentroider til objektene i bildet. Disse objektene skal tilsvare blodproppene i bildet.

2. Tell antall blodpropper som er identifisert ved å ta lengden på sentroidmatrisen.

Trinn 28: Diagnostiser netthinnebildet basert på antall identifiserte blodpropper

Bruk if -setninger for å diagnostisere bildet basert på antall identifiserte blodpropper.

Hvis antallet sentroider som ble identifisert var mindre enn eller lik 5, ble bildet identifisert som normalt.

Hvis antallet sentroider var større enn 5, ble bildet diagnostisert med diabetisk retinopati.

Resultatet skrives ut på kommandovinduet ved hjelp av fprintf.

Trinn 29: Hvis det er flere enn 5 klatter …

Hvis det er flere enn 5 klatter …
Hvis det er flere enn 5 klatter …

Gjenta instruksjonene ovenfor for diagnostiserte bilder som en annen uttalelse. Denne delen vil kjøre hvis antall klatter er større enn 5.

Avslutt if -setningen.

Trinn 30: Gjenta filtreringsprosessen for normale bilder med bildesifferverdier som 2 og 3

Gjenta filtreringsprosessen for normale bilder med bildesifferverdier som 2 og 3
Gjenta filtreringsprosessen for normale bilder med bildesifferverdier som 2 og 3
Gjenta filtreringsprosessen for normale bilder med bildesifferverdier som 2 og 3
Gjenta filtreringsprosessen for normale bilder med bildesifferverdier som 2 og 3

Gjenta prosessen for resten av originalen hvis setninger når tall (antall sifre i bildetallet) er lik 2 og 3. Dette fullfører for -løkken for de normale bildene.

Avslutt for -løkken.

Trinn 31: Gjenta hele prosessen for de diagnostiserte bildene

Gjenta hele prosessen for de diagnostiserte bildene
Gjenta hele prosessen for de diagnostiserte bildene

Gjenta hele prosessen ved å bruke de diagnostiserte bildene som er oppført i matrisen "numbers_to_extract_diagnosed".

Sørg for å gå gjennom hver figur (i) og endre den til figur (i+10) slik at de diagnostiserte tallene dukker opp som bilder 11 til 20.

Trinn 32: Statistisk analyse

Statistisk analyse
Statistisk analyse

1. 'Actual_Diagnosis_Matrix' brukes for å sammenligne resultatene med den offisielle diagnosen som finnes i txt -filen. De første 10 nullene indikerer at de første 10 bildene skal være normale. De siste 10 viser at de siste 10 bildene bør klassifiseres som diabetisk retinopati.

2. Det doble likhetstegnet som brukes til å lage 'number_correct' oppretter en logisk matrise ved å sammenligne verdien av de tilsvarende elementene i 'Actual_Diagnosis_Matrix' med 'Diagnosis_Matrix' opprettet fra for -løkken.

For hvert element som samsvarer med diagnosen vil det bli lagt til en 1, noe som betyr at koden korrekt diagnostiserte bildet. Hvis den er feil, vil den legge til en 0 i matrisen.

Ta deretter summen av det som summerer alle. Med andre ord finner den summen av korrekt diagnostiserte bilder.

3. 'Final_percentage_correct' er den beregnede prosentandelen av hvor nøyaktig koden diagnostiserte diabetisk retinopati. Antall bilder diagnostisert riktig er delt med 20 (totalt antall bilder) og multiplisert med 100 for å finne prosentandelen vellykkede diagnoser.

Trinn 33: Finne konfidensintervall

Finne konfidensintervall
Finne konfidensintervall

1. Kontroller at du har lastet ned ModWald.m for å kalle det som en funksjon. Uten funksjonen måtte du selv beregne konfidensintervallet ved å bruke den modifiserte Wald -metoden.

2. ModWald -funksjonen har 2 innganger der den første er antallet korrekt identifiserte bilder, og den andre er den totale mengden bilder.

3. ModWald -funksjonen sender ut de nedre og øvre grensene for konfidensintervallet for proporsjoner for nøyaktigheten av de samplede dataene. Med andre ord vil det gi deg et intervall med prosent hvor den sanne prosentandelen av nøyaktigheten til koden vil ligge.

4. Bruk fprintf nedenfor for å sende statistikk og konfidensintervall til kommandovinduet.

> fprintf ('%. 0f prosent av netthinnebildene ble korrekt diagnostisert i henhold til offisiell diagnose. / n / n', Final_percentage_correct)

> fprintf ('Den sanne prosentandelen vår kode vil korrekt diagnostisere diabetisk retinopati vil / n falle i området [%.3f, %.3f], basert på 20 samplede bilder / n', lavere_bound, upper_bound)

Anbefalt: