Innehållsförteckning:

Automatiserad diagnos av diabetisk retinopati via MATLAB: 33 steg
Automatiserad diagnos av diabetisk retinopati via MATLAB: 33 steg

Video: Automatiserad diagnos av diabetisk retinopati via MATLAB: 33 steg

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

(Se kodöversikten ovan)

Diabetisk retinopati är en diabetesrelaterad ögonsjukdom som orsakas av höga blodsockernivåer. De höga blodsockernivåerna får blodkärlen i näthinnorna att svälla, vilket leder till förstorade blodkärl och till och med kärlläckor, vilket leder till mörka fläckar i näthinnebilder. Med denna kod syftar vi till att använda utseendet på blodkärlens läckfläckar som en indikator på diabetisk retinopati i bakgrunden, även om ytterligare diagnosmetoder skulle krävas i den verkliga världen. Målet med denna kod är att automatisera bildbehandling och diagnos av näthinnebilder för att identifiera tecken på diabetisk retinopati som visas genom mörka fläckar i näthinnebilderna.

10 normala näthinnebilder och 10 diagnostiserade näthinnebilder bearbetades genom en kod som först läser och filtrerar bilderna och sedan kvantifierar de mörka fläckarna för att avgöra om diabetiska retinopatisymtom finns, baserat på en given tröskel. Resultaten skrivs sedan ut i kommandofönstret för visningstolkning.

Steg 1: Förkunskaper

Förkunskaper
Förkunskaper

1. Se till att du har laddat ner MATLAB -programmet till din dator.

2. Ladda ner txt -filen som finns i länken. (Tryck på ‘ctrl+s’ för att spara i samma katalog som MATLAB -koden)

Steg 2: Förkunskaper (fortsätt)

Förkunskaper (forts.)
Förkunskaper (forts.)
Förkunskaper (forts.)
Förkunskaper (forts.)

4. Öppna MATLAB och skriv ‘uiimport’ i kommandofönstret.

5. Välj filen officialdiagnoses.txt och importera den till MATLAB som en cellmatris.

6. Se till att du ser ‘officiell diagnos’ som en variabel i arbetsytan.

Steg 3: Förkunskaper (fortsätt)

Förkunskaper (forts.)
Förkunskaper (forts.)

7. Ladda ner funktionen ModWald.m, som kan hämtas från ovanstående kod eller ladda ner den från Canvas.

(Kod från professor King och professor Choi)

Steg 4: Förkunskaper (fortsätt)

Förkunskaper (forts.)
Förkunskaper (forts.)

8. Ladda ner de 400 råbilderna från datasektionen i STARE -projektet.

Steg 5: Rensa upp Matlab för att förbereda för körningskod

Rensa upp Matlab för att förbereda körningskoden
Rensa upp Matlab för att förbereda körningskoden

Lägg till i koden:

1. Stäng alla (Stänger alla tidigare öppnade bilder)

2. clearvars - utom officiell diagnos (rensar alla variabler utom den officiella diagnosen txt -filen som tidigare importerats)

3. cclc (rensar kommandofönstret)

Steg 6: Välj 10 normala ögonbilder och 10 bilder med diabetisk retinopati

Välj 10 normala ögonbilder och 10 bilder med diabetisk retinopati
Välj 10 normala ögonbilder och 10 bilder med diabetisk retinopati
Välj 10 normala ögonbilder och 10 bilder med diabetisk retinopati
Välj 10 normala ögonbilder och 10 bilder med diabetisk retinopati

1. Ta diagnostextfilen och extrahera bildnamnen. Dessa namn finns i den första kolumnen i textfilen så för att extrahera dem skriver du 'officialdiagnoses (:, 1)'. Matrisen med bildnamn tilldelades en variabel "all_image_numbers"

2. Konvertera variabeln all_image_numbers från en cellmatris till en matrismatris med cell2mat -funktionen

Steg 7: Välj 10 normala ögonbilder och 10 bilder med diabetesretinopati -symtom (fortsätt)

Välj 10 normala ögonbilder och 10 bilder med diabetisk retinopati (fortsätt)
Välj 10 normala ögonbilder och 10 bilder med diabetisk retinopati (fortsätt)
Välj 10 normala ögonbilder och 10 bilder med diabetisk retinopati (fortsätt)
Välj 10 normala ögonbilder och 10 bilder med diabetisk retinopati (fortsätt)

3. Välj 10 normala ögonbilder för att köra koden. Bilderna som valdes i detta fall var 278, 199, 241, 235, 35, 77, 82, 164, 239, 170.

Placera dessa nummer i en matris och tilldela dem till en variabel som kommer att kallas när bilderna laddas.

4. Upprepa steg 3 för näthinnebilder som har diagnostiserats med diabetisk retinopati. Bilderna som valdes i detta fall var 139, 137, 136, 135, 133, 140, 141, 116, 157, 188.

Steg 8: Skapa 2 variabler (normala och diagnostiserade) och ställ dem var och en till 0

Skapa 2 variabler (normala och diagnostiserade) och ställ in alla lika till 0
Skapa 2 variabler (normala och diagnostiserade) och ställ in alla lika till 0

Skapa dessa variabler före for -slingan för att initiera loopnumren.

Steg 9: Skapa en for Loop för att automatiskt ladda upp normala bilder

Skapa en for Loop för att automatiskt ladda upp normala bilder
Skapa en for Loop för att automatiskt ladda upp normala bilder

1. Skapa en for loop

2. Ställ in en räknarvariabel (i, i detta fall) till en matris med värden 1-10. Denna räkningsvariabel kommer att användas för att anropa varje bild individuellt

3. Ta i -elementet i bildmatrisen för att extrahera och konvertera bildnamnet från en sträng till ett tal med hjälp av num2str -funktionen.

Hitta antalet siffror som finns i bildnamnet med hjälp av numelfunktionen. Tilldela detta värde till en variabel, digits_normal. Detta nummer bör vara 1 för enkelsiffriga nummer, 2 för tvåsiffriga nummer och 3 för tresiffriga nummer. Denna information kommer att användas för att automatiskt ringa upp bilder.

Steg 10: Skapa en för loop för att automatiskt ladda upp normala bilder (fortsätt)

Skapa en för loop för att automatiskt ladda upp normala bilder (fortsätt)
Skapa en för loop för att automatiskt ladda upp normala bilder (fortsätt)

3. Skapa en if -sats som innehåller alla tre möjligheterna från föregående steg. Om bildnamnet har en siffra kallas bilden som”im000”, om den har två siffror kallas bilden som”im00”, och om den har tre kommer bilden att kallas som”im0”.

4. Under varje if -sats, tilldela en variabel för att läsa in "im" under motsvarande, if -sats med lämpligt antal nollor (enligt beskrivningen ovan), följt av i.

Steg 11: Beskär bildens ramar

Beskär bildens ramar
Beskär bildens ramar

Ta den ursprungliga bilden och applicera ett imcrop -filter för att eliminera svarta kanter och tilldela en variabel I_crop. Skördarektangeln specificeras med hjälp av en matris [95, 95, 500, 410].

Steg 12: Skapa en gråskalebild

Skapa en gråskalebild
Skapa en gråskalebild

Ta den beskurna bilden och applicera rbg2gray -filtret för att ändra bilden till gråskala. Tilldela denna bild till variabel I2.

Steg 13: Skapa en kontrastbild

Skapa en kontrastbild
Skapa en kontrastbild

Ta bilden I2 och använd imadjust för att skala om intensitetsvärdena.

Ta värden som ligger inom intervallet [0,2, 0,7] och skala om dem till en [0, 1]. Gamma är inställd på 0,8 för att göra bilden ljusare. Tilldela den nya bilden till I_adjusted.

Steg 14: Förbättra kontrastbilden

Förbättra kontrastbilden
Förbättra kontrastbilden

Ta den I_justerade bilden och använd adapthisteq -funktionen för att förbättra kontrasten.

Adapthisteq -syntaxen kräver bildnamnet, I_adjusted, ‘numTiles’, storleken på numTiles, ‘nBins’ och antalet fack. Storleken på numTiles är inställd på [8 8], uppdelning av bilden i 8x8 brickor och antalet fack är satt till 28. Tilldela bilden till I_constrast.

Steg 15: Skapa ett genomsnittligt filter

Skapa ett genomsnittligt filter
Skapa ett genomsnittligt filter

Skapa en variabel med namnet 'meanfilt' med fspecial -funktionen. Ange "genomsnittlig funktion" för att skapa medelvärdesfiltret och sätt in [90 90] för glidfönstret.

Steg 16: Kombinera medelvärdesfiltret med den kontrasterade bilden

Kombinera medelvärdesfiltret med den kontrasterade bilden
Kombinera medelvärdesfiltret med den kontrasterade bilden

Skapa en ny variabel med namnet mask_mean och använd imfilter -funktionen för att ta I_contrast -bilden och tillämpa det genomsnittliga filtret som tidigare skapats.

Steg 17: Gör en ny genomsnittsmask genom att subtrahera pixlar

Gör en ny genomsnittlig mask genom att subtrahera pixlar
Gör en ny genomsnittlig mask genom att subtrahera pixlar

Skapa en variabel som heter mask_mean2 och använd funktionen imsubtract för att subtrahera värdet för varje pixel i I_contrast från motsvarande pixel i mask_mean.

Steg 18: Skapa en binärfiltrerad bild

Skapa en binärfiltrerad bild
Skapa en binärfiltrerad bild

Vänd gråskala bilder till svartvitt med hjälp av imbinarize. Mata in mask_mean2, 'adaptiv', 'ForegroundPolarity', 'dark', 'Sensitivity', 0.6. Tilldela denna nya bild mask_binarize.

Steg 19: Ta bort mindre klossar som finns i de filtrerade bilderna

Ta bort mindre klossar som finns i de filtrerade bilderna
Ta bort mindre klossar som finns i de filtrerade bilderna

Ta bort objekt med anslutning mindre än 100 pixlar med bwareaopen -funktionen på mask_binarize och ställ in tröskelvärdet till 100. Tilldela variabeln som bw.

Steg 20: Skapa ett diskstruktureringselement

Skapa ett diskstruktureringselement
Skapa ett diskstruktureringselement

Skapa ett diskstruktureringselement (med en radie av 2) med hjälp av strel -funktionen. Tilldela det till se.

Steg 21: Utför morfologiska stängningsoperationer

Utför morfologiska stängningsoperationer
Utför morfologiska stängningsoperationer

Ta bw och applicera imclose -funktionen på strukturelementet för att utföra en morfologisk nära operation på objektet.

Steg 22: Hitta objekt med anslutning av minst 8

Hitta objekt med anslutning av minst 8
Hitta objekt med anslutning av minst 8

Ta bw och använd bwconncomp för att hitta objekt med en anslutning på minst 8 i bilden. Tilldela nummerutmatningen till cc_1.

Steg 23: Hitta det maximala antalet anslutna pixlar

Hitta det maximala antalet anslutna pixlar
Hitta det maximala antalet anslutna pixlar
Hitta det maximala antalet anslutna pixlar
Hitta det maximala antalet anslutna pixlar

Använd cellfun -funktionen för att utföra funktionen "numel" på varje cell i CC. Detta hittar antalet element i PixelIdxList -cellen. Tilldela värde till “numPixels”.

Hitta maxvärdena i numPIxels. Tilldela det största max till “största” och indexet för maxvärdet till “idx”.

Steg 24: Ställ in maxpixelvärdena på 0 och hitta pixlar med> = 26 pixelanslutningar

Ta bort blodkärl i bilden
Ta bort blodkärl i bilden

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

Figur Display
Figur Display

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

Ta bort kärl och räkna blodkroppar
Ta bort kärl och räkna blodkroppar

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

Diagnostisera retinalbilden baserat på antalet identifierade blodproppar
Diagnostisera retinalbilden baserat på antalet identifierade blodproppar

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

Ställ in pixlarna med de största värdena i bilden”bw” till 0, vilket gör pixlarna svarta.

Hitta objekten med en anslutning på minst 26 pixlar i bilden med hjälp av bwconncomp. Tilldela variabeln cc_1.

Steg 25: Ta bort blodkärl i bilden

Ta bort de blodkärl som fortfarande finns i bilden med bwpropfilt -funktionen med ett intervall på [0, 0,9].

[0,9, 1] utesluts eftersom värden nära 1 indikerar en rad. Tilldela “RemoveVessels”.

Steg 26: Figurvisning

Visa varje filtrerad bild i en delplan. Imshow. med "gräns" och "snäva" ingångar, visar varje bild i en delplotstruktur. Lägg till en titel till varje bild för att skilja vilket filter som användes.

Steg 27: Ta bort kärl och räkna blodkroppar

1. Ta “RemoveVessels” och använd funktionen”Centroid” i regionprops för att identifiera centroiderna för objekten i bilden. Dessa föremål ska motsvara blodproppar i bilden.

2. Räkna antalet blodproppar som identifierats genom att ta längden på centroidmatrisen.

Steg 28: Diagnostisera retinalbilden baserat på antalet identifierade blodproppar

Använd if -uttalanden för att diagnostisera bilden baserat på antalet identifierade blodproppar.

Om antalet centroider som identifierades var mindre än eller lika med 5, identifierades bilden som normal.

Om antalet centroider var större än 5, diagnostiserades bilden med diabetisk retinopati.

Resultatet skrivs ut på kommandofönstret med fprintf.

Steg 29: Om det finns fler än 5 klossar …

Om det finns fler än 5 klossar …
Om det finns fler än 5 klossar …

Upprepa instruktionerna ovan för diagnostiserade bilder som ett annat uttalande. Den här delen körs om antalet klossar är större än 5.

Avsluta if -uttalandet.

Steg 30: Upprepa filtreringsprocessen för normala bilder med bildsiffror som 2 och 3

Upprepa filtreringsprocessen för normala bilder med bildsiffror som 2 och 3
Upprepa filtreringsprocessen för normala bilder med bildsiffror som 2 och 3
Upprepa filtreringsprocessen för normala bilder med bildsiffror som 2 och 3
Upprepa filtreringsprocessen för normala bilder med bildsiffror som 2 och 3

Upprepa processen för resten av originalet om påståenden när numel (antalet siffror i bildnumret) är lika med 2 och 3. Detta slutför för -slingan för de normala bilderna.

Avsluta for -slingan.

Steg 31: Upprepa hela processen för de diagnostiserade bilderna

Upprepa hela processen för de diagnostiserade bilderna
Upprepa hela processen för de diagnostiserade bilderna

Upprepa hela processen med de diagnostiserade bilderna som listas av matrisen "numbers_to_extract_diagnosed".

Se till att gå igenom varje siffra (i) och ändra den till siffra (i+10) så att de diagnostiserade siffrorna dyker upp som bilder 11 till 20.

Steg 32: Statistisk analys

Statistisk analys
Statistisk analys

1. "Actual_Diagnosis_Matrix" används för att jämföra resultaten med den officiella diagnosen som finns i txt -filen. De första 10 nollorna indikerar att de första 10 bilderna ska vara normala. De tio sista indikerar att de tio sista bilderna ska klassificeras som diabetisk retinopati.

2. Det dubbla likhetstecknet som används för att skapa "number_correct" skapar en logisk array genom att jämföra värdet för motsvarande element i "Actual_Diagnosis_Matrix" med "Diagnosis_Matrix" som skapats från for -slingan.

För varje element som matchar diagnosen kommer ett 1 att läggas till, vilket betyder att koden korrekt diagnostiserade den bilden. Om den är felaktig kommer den att lägga till en 0 i matrisen.

Sedan tar summan av det sammanlagt alla. Med andra ord, den hittar summan av korrekt diagnostiserade bilder.

3. 'Final_percentage_correct' är den beräknade procentandelen av hur exakt koden diagnostiserade diabetisk retinopati. Antalet korrekt diagnostiserade bilder divideras med 20 (det totala antalet bilder) och multipliceras med 100 för att hitta andelen framgångsrika diagnoser.

Steg 33: Hitta konfidensintervall

Hitta förtroendeintervall
Hitta förtroendeintervall

1. Se till att du har laddat ner ModWald.m för att kalla det som en funktion. Utan funktionen måste du själv beräkna konfidensintervallet med den modifierade Wald -metoden.

2. ModWald -funktionen har 2 ingångar där den första är antalet korrekt identifierade bilder och den andra är det totala antalet bilder.

3. ModWald -funktionen kommer att mata ut de nedre och övre gränserna för konfidensintervallet för proportioner för noggrannheten hos de samplade data. Med andra ord, det ger dig ett intervall av procentsatser där den verkliga procenten av kodens noggrannhet kommer att ligga.

4. Använd fprintf nedan för att mata ut statistik och konfidensintervall till kommandofönstret.

> fprintf ('%. 0f procent av näthinnebilderna diagnostiserades korrekt enligt officiell diagnos. / n / n', Final_percentage_correct)

> fprintf ('Den sanna procenten med vilken vår kod korrekt diagnostiserar diabetisk retinopati kommer / n att falla inom intervallet [%.3f, %.3f], baserat på 20 samplade bilder / n', lower_bound, upper_bound)

Rekommenderad: