Cuprins:

Diagnosticul automat al retinopatiei diabetice prin MATLAB: 33 de pași
Diagnosticul automat al retinopatiei diabetice prin MATLAB: 33 de pași
Anonim
Diagnostic automat al retinopatiei diabetice prin MATLAB
Diagnostic automat al retinopatiei diabetice prin MATLAB
Diagnostic automat al retinopatiei diabetice prin MATLAB
Diagnostic automat al retinopatiei diabetice prin MATLAB

(A se vedea schița codului de mai sus)

Retinopatia diabetică este o boală oculară legată de diabet, cauzată de niveluri ridicate de zahăr din sânge. Nivelurile ridicate de zahăr din sânge determină umflarea vaselor de sânge din retină, ceea ce duce la mărirea vaselor de sânge și chiar la scurgeri ale vaselor, care duc la pete întunecate în imaginile retiniene. Cu acest cod, ne propunem să utilizăm apariția petelor de scurgere a vaselor de sânge ca indicator al retinopatiei diabetice de fond, deși ar fi necesare tehnici de diagnostic suplimentare în lumea reală. Scopul acestui cod este de a automatiza procesarea imaginilor și diagnosticarea imaginilor retiniene pentru a identifica semnele de retinopatie diabetică prezentate prin pete întunecate în imaginile retiniene.

10 imagini retiniene normale și 10 imagini retiniene diagnosticate au fost procesate printr-un cod care mai întâi citește și filtrează imaginile și apoi cuantifică petele întunecate pentru a determina dacă sunt prezente simptome de retinopatie diabetică, pe baza unui prag dat. Rezultatele sunt apoi tipărite pe fereastra de comandă pentru interpretarea vizualizatorului.

Pasul 1: premise

Condiții prealabile
Condiții prealabile

1. Asigurați-vă că ați descărcat programul MATLAB pe computer.

2. Descărcați fișierul txt găsit în link. (Apăsați „ctrl + s” pentru a salva în același director cu codul MATLAB)

Pasul 2: premise (nu)

Condiții preliminare (nu)
Condiții preliminare (nu)
Condiții preliminare (nu)
Condiții preliminare (nu)

4. Deschideți MATLAB și tastați ‘uiimport’ în fereastra de comandă.

5. Selectați fișierul officialdiagnoses.txt și importați-l în MATLAB ca matrice de celule.

6. Asigurați-vă că vedeți „diagnosticarea oficială” ca o variabilă în spațiul de lucru.

Pasul 3: premise (nu)

Condiții preliminare (nu)
Condiții preliminare (nu)

7. Descărcați funcția ModWald.m, care poate fi obținută din codul de mai sus sau descărcați-o din Canvas.

(Cod furnizat de profesorul King și profesorul Choi)

Pasul 4: premise (nu)

Condiții preliminare (nu)
Condiții preliminare (nu)

8. Descărcați cele 400 de imagini brute din secțiunea de date a proiectului STARE.

Pasul 5: Curățați Matlab pentru a vă pregăti pentru rularea codului

Curățați Matlab pentru a vă pregăti pentru codul de rulare
Curățați Matlab pentru a vă pregăti pentru codul de rulare

Adăugați la cod:

1. închideți toate (Închide toate imaginile deschise anterior)

2. clearvars - cu excepția diagnosticelor oficiale (șterge toate variabilele, cu excepția fișierului txt diagnosticare oficial importat anterior)

3. cclc (șterge fereastra de comandă)

Pasul 6: Selectați 10 imagini normale ale ochilor și 10 imagini cu simptome de retinopatie diabetică

Selectați 10 imagini normale ale ochilor și 10 imagini cu simptome de retinopatie diabetică
Selectați 10 imagini normale ale ochilor și 10 imagini cu simptome de retinopatie diabetică
Selectați 10 imagini normale ale ochilor și 10 imagini cu simptome de retinopatie diabetică
Selectați 10 imagini normale ale ochilor și 10 imagini cu simptome de retinopatie diabetică

1. Luați fișierul text de diagnosticare și extrageți numele imaginilor. Aceste nume sunt conținute în prima coloană a fișierului text, astfel încât să le extrageți, tastați „oficialdiagnoses (:, 1)”. Matricea numelor de imagini a fost atribuită unei variabile, „all_image_numbers”

2. Convertiți variabila all_image_numbers dintr-o matrice de celule într-o matrice folosind funcția cell2mat

Pasul 7: Selectați 10 imagini normale ale ochilor și 10 imagini cu simptome de retinopatie diabetică (nu)

Selectați 10 imagini normale ale ochilor și 10 imagini cu simptome de retinopatie diabetică (nu)
Selectați 10 imagini normale ale ochilor și 10 imagini cu simptome de retinopatie diabetică (nu)
Selectați 10 imagini normale ale ochilor și 10 imagini cu simptome de retinopatie diabetică (nu)
Selectați 10 imagini normale ale ochilor și 10 imagini cu simptome de retinopatie diabetică (nu)

3. Selectați 10 imagini normale pentru ochi pentru a rula codul. Imaginile selectate în acest caz au fost 278, 199, 241, 235, 35, 77, 82, 164, 239, 170.

Plasați aceste numere într-o matrice și atribuiți-le unei variabile care va fi apelată la încărcarea imaginilor.

4. Repetați pasul 3 pentru imaginile retiniene care au fost diagnosticate cu retinopatie diabetică. Imaginile selectate în acest caz au fost 139, 137, 136, 135, 133, 140, 141, 116, 157, 188.

Pasul 8: Creați 2 variabile (normale și diagnosticate) și setați-le la egal la 0

Creați 2 variabile (normale și diagnosticate) și setați-le pe fiecare egal la 0
Creați 2 variabile (normale și diagnosticate) și setați-le pe fiecare egal la 0

Creați aceste variabile înainte de bucla for pentru a inițializa numerele buclei.

Pasul 9: Creați un Buclă pentru a încărca automat imagini normale

Creați un Buclă pentru a încărca automat imagini normale
Creați un Buclă pentru a încărca automat imagini normale

1. Creați o buclă for

2. Setați o variabilă de numărare (i, în acest caz) la o matrice de valori 1-10. Această variabilă de numărare va fi utilizată pentru a apela fiecare imagine în mod individual

3. Luați elementul i din matricea imaginilor pentru a extrage și converti numele imaginii dintr-un șir într-un număr folosind funcția num2str.

Găsiți numărul de cifre prezente în numele imaginii folosind funcția numel. Atribuiți această valoare unei variabile, cifre_normale. Acest număr ar trebui să fie 1 pentru numerele cu o singură cifră, 2 pentru numerele cu două cifre și 3 pentru numerele cu trei cifre. Aceste informații vor fi folosite pentru a apela automat imagini.

Pasul 10: Creați un buclă pentru a încărca automat imagini normale (nu)

Creați un Buclă pentru a încărca automat imagini normale (nu)
Creați un Buclă pentru a încărca automat imagini normale (nu)

3. Creați o declarație if care conține toate cele trei posibilități din pașii anteriori. Dacă numele imaginii are 1 cifră, imaginea va fi numită „im000”, dacă are 2 cifre, imaginea va fi numită „im00”, iar dacă are 3 imaginea va fi numită „im0”.

4. Sub fiecare instrucțiune if, atribuiți o variabilă pentru a citi „im” sub instrucțiunea corespunzătoare, if, cu numărul corespunzător de zerouri (așa cum este descris mai sus), urmată de i.

Pasul 11: Decupați marginile imaginii

Decupați marginile imaginii
Decupați marginile imaginii

Luați imaginea originală și aplicați un filtru imcrop pentru a elimina marginile negre și atribuiți o variabilă I_crop. Dreptunghiul de decupare este specificat folosind o matrice [95, 95, 500, 410].

Pasul 12: Creați o imagine la scară de gri

Creați o imagine la scară de gri
Creați o imagine la scară de gri

Luați imaginea decupată și aplicați filtrul rbg2gray pentru a schimba imaginea în tonuri de gri. Atribuiți această imagine variabilei I2.

Pasul 13: Creați o imagine contrastată

Creați o imagine contrastată
Creați o imagine contrastată

Luați imaginea I2 și utilizați imadjust pentru a redimensiona valorile intensității.

Luați valori care se încadrează în intervalul [0.2, 0.7] și redimensionați-le la un [0, 1]. Gama este setată la 0,8 pentru a face imaginea mai luminoasă. Atribuiți noua imagine la I_adjusted.

Pasul 14: Îmbunătățiți imaginea de contrast

Îmbunătățiți imaginea de contrast
Îmbunătățiți imaginea de contrast

Luați imaginea I_adjusted și utilizați funcția adapthisteq pentru a spori contrastul.

Sintaxa Adapthisteq necesită numele imaginii, I_adjusted, „numTiles”, dimensiunea numTiles, „nBins” și numărul de bin-uri. Dimensiunea numTiles este setată la [8 8], împărțind imaginea în dale 8x8 și numărul de coșuri este setat la 28. Alocați imaginea la I_constrast.

Pasul 15: Creați un filtru mediu

Creați un filtru mediu
Creați un filtru mediu

Creați o variabilă numită „meanfilt” utilizând funcția specială. Introduceți „funcția medie” pentru a crea filtrul de medie și introduceți [90 90] pentru dimensiunea ferestrei glisante.

Pasul 16: Combinați filtrul mediu cu imaginea contrastată

Combinați filtrul mediu cu imaginea contrastată
Combinați filtrul mediu cu imaginea contrastată

Creați o nouă variabilă numită mask_mean și utilizați funcția imfilter pentru a lua imaginea I_contrast și pentru a aplica filtrul mediu creat anterior.

Pasul 17: Faceți o nouă mască medie prin scăderea pixelilor

Faceți o nouă mască medie scăzând pixeli
Faceți o nouă mască medie scăzând pixeli

Creați o variabilă numită mask_mean2 și utilizați funcția imsubtract pentru a scădea valoarea fiecărui pixel din I_contrast din pixelul corespunzător din mask_mean.

Pasul 18: Creați o imagine filtrată binară

Creați o imagine filtrată binar
Creați o imagine filtrată binar

Transformați imaginile în tonuri de gri în alb și negru folosind imbinarize. Intrare mask_mean2, ‘adaptive’, ‘ForegroundPolarity’, ‘dark’, ‘Sensitivity’, 0.6. Atribuiți această nouă imagine la mask_binarize.

Pasul 19: Eliminați bloburile mai mici găsite în imaginile filtrate

Eliminați bloburile mai mici găsite în imaginile filtrate
Eliminați bloburile mai mici găsite în imaginile filtrate

Eliminați obiectele cu conectivitate mai mică de 100 pixeli utilizând funcția bwareaopen de pe mask_binarize și setați valoarea pragului la 100. Alocați variabila ca bw.

Pasul 20: Creați un element de structurare a discului

Creați un element de structurare a discului
Creați un element de structurare a discului

Creați un element de structurare a discului (cu o rază de 2) folosind funcția strel. Atribuiți-l la se.

Pasul 21: Efectuați operațiuni de închidere morfologică

Efectuați operații de închidere morfologică
Efectuați operații de închidere morfologică

Luați bw și aplicați funcția imclose elementului structural pentru a efectua o operație morfologică apropiată asupra obiectului.

Pasul 22: Găsiți obiectele cu conectivitate de cel puțin 8

Găsiți obiectele cu conectivitate de cel puțin 8
Găsiți obiectele cu conectivitate de cel puțin 8

Luați bw și utilizați bwconncomp pentru a găsi obiectele cu conectivitate de cel puțin 8 în imagine. Atribuiți numărul de ieșire la cc_1.

Pasul 23: Găsiți numărul maxim de pixeli conectați

Găsiți numărul maxim de pixeli conectați
Găsiți numărul maxim de pixeli conectați
Găsiți numărul maxim de pixeli conectați
Găsiți numărul maxim de pixeli conectați

Utilizați funcția cellfun pentru a efectua funcția „numel” pe fiecare celulă din CC. Aceasta găsește numărul de elemente din celula PixelIdxList. Atribuiți valoare „numPixels”.

Găsiți valorile maxime în numPIxels. Atribuiți cel mai mare maxim la „cel mai mare” și indicele valorii maxime la „idx”.

Pasul 24: Setați valorile maxime ale pixelilor la 0 și găsiți pixeli cu conectivitate> = 26 pixeli

Eliminați vasele de sânge din imagine
Eliminați vasele de sânge din imagine

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

Afișaj figura
Afișaj figura

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

Îndepărtați vasele și numărați pete de sânge
Îndepărtați vasele și numărați pete de sânge

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

Diagnosticați imaginea retinei pe baza numărului de cheaguri de sânge identificate
Diagnosticați imaginea retinei pe baza numărului de cheaguri de sânge identificate

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

Setați pixelii cu cele mai mari valori din imaginea „bw” la 0, făcând pixelii negri.

Găsiți obiecte cu o conectivitate de cel puțin 26 de pixeli în imagine folosind bwconncomp. Alocați variabilei cc_1.

Pasul 25: Eliminați vasele de sânge din imagine

Îndepărtați vasele de sânge încă prezente în imagine utilizând funcția bwpropfilt cu un interval de [0, 0,9].

[0.9, 1] este exclus deoarece valorile apropiate de 1 indică o linie. Alocați la „RemoveVessels”.

Pasul 26: Afișare figură

Afișați fiecare imagine filtrată într-un subplot. Imshow. cu intrări „border” și „tight”, afișează fiecare imagine într-o structură subplot. Adăugați un titlu fiecărei imagini pentru a distinge ce filtru a fost utilizat.

Pasul 27: Scoateți vasele și numărați pete de sânge

1. Luați „RemoveVessels” și aplicați caracteristica „Centroid” în regionprops pentru a identifica centrele obiectelor din imagine. Aceste obiecte ar trebui să corespundă cheagurilor de sânge prezente în imagine.

2. Numărați numărul de cheaguri de sânge identificate luând lungimea matricei centrului.

Pasul 28: Diagnosticați imaginea retinei pe baza numărului de cheaguri de sânge identificate

Utilizați declarațiile if pentru a diagnostica imaginea pe baza numărului de cheaguri de sânge identificate.

Dacă numărul de centroizi identificați a fost mai mic sau egal cu 5, imaginea a fost identificată ca fiind normală.

Dacă numărul de centroizi a fost mai mare de 5, imaginea a fost diagnosticată cu retinopatie diabetică.

Rezultatul este tipărit pe fereastra de comandă folosind fprintf.

Pasul 29: Dacă există mai mult de 5 bloburi …

Dacă există mai mult de 5 blob-uri …
Dacă există mai mult de 5 blob-uri …

Repetați instrucțiunile de mai sus pentru imaginile diagnosticate ca o afirmație else. Această parte va rula dacă numărul de blob-uri este mai mare de 5.

Încheiați declarația if.

Pasul 30: Repetați procesul de filtrare pentru imagini normale cu valori ale cifrelor de imagine 2 și 3

Repetați procesul de filtrare pentru imagini normale cu valori ale cifrelor de imagine 2 și 3
Repetați procesul de filtrare pentru imagini normale cu valori ale cifrelor de imagine 2 și 3
Repetați procesul de filtrare pentru imagini normale cu valori ale cifrelor de imagine 2 și 3
Repetați procesul de filtrare pentru imagini normale cu valori ale cifrelor de imagine 2 și 3

Repetați procesul pentru restul originalului dacă instrucțiunile atunci când numel (numărul de cifre din numărul imaginii) este egal cu 2 și 3. Aceasta completează bucla for pentru imaginile normale.

Încheiați bucla for.

Pasul 31: Repetați întregul proces pentru imaginile diagnosticate

Repetați întregul proces pentru imaginile diagnosticate
Repetați întregul proces pentru imaginile diagnosticate

Repetați întregul proces folosind imaginile diagnosticate enumerate de matricea „numere_pentru_extractare_diagnosticate”.

Asigurați-vă că parcurgeți fiecare cifră (i) și schimbați-o în cifră (i + 10), astfel încât cifrele diagnosticate să apară ca imagini 11-20.

Pasul 32: Analiza statistică

Analize statistice
Analize statistice

1. „Actual_Diagnosis_Matrix” este utilizat pentru a compara rezultatele cu diagnosticul oficial găsit în fișierul txt. Primele 10 zerouri indică faptul că primele 10 imagini ar trebui să fie normale. Ultimele 10 indică faptul că ultimele 10 imagini ar trebui clasificate ca retinopatie diabetică.

2. Semnul dublu egal utilizat pentru a crea „număr_corect” creează o matrice logică prin compararea valorii elementelor corespunzătoare din „Actual_Diagnosis_Matrix” cu „Diagnosis_Matrix” creat din bucla for.

Pentru fiecare element care se potrivește cu diagnosticul se va adăuga un 1, adică codul a diagnosticat corect acea imagine. Dacă este incorect, va adăuga un 0 la matrice.

Apoi, luând suma, se adaugă toate. Cu alte cuvinte, găsește suma imaginilor diagnosticate corect.

3. „Final_percentage_correct” este procentul calculat din cât de precis este codul diagnosticat cu retinopatie diabetică. Numărul de imagini diagnosticate corect este împărțit la 20 (numărul total de imagini) și înmulțit cu 100 pentru a găsi procentul de diagnostice reușite.

Pasul 33: Găsirea intervalului de încredere

Găsirea intervalului de încredere
Găsirea intervalului de încredere

1. Asigurați-vă că ați descărcat ModWald.m pentru a-l apela ca funcție. Fără funcție, ar trebui să calculați singur intervalul de încredere folosind metoda Wald modificată.

2. Funcția ModWald are 2 intrări în care prima este numărul de imagini identificate corect, iar a doua este cantitatea totală de imagini.

3. Funcția ModWald va afișa limitele inferioară și superioară ale intervalului de încredere al proporțiilor pentru acuratețea datelor eșantionate. Cu alte cuvinte, vă va oferi un interval de procente în care se află procentul real al acurateței codului.

4. Utilizați fprintf de mai jos pentru a afișa statisticile și intervalul de încredere în fereastra de comandă.

> fprintf ('%. 0f la sută din imaginile retiniene au fost diagnosticate corect conform diagnosticului oficial. / n / n', Final_percentage_correct)

> fprintf („Procentul adevărat la care codul nostru va diagnostica corect retinopatia diabetică va intra în intervalul [%.3f,%.3f], pe baza a 20 de imagini eșantionate / n ', lower_bound, upper_bound)

Recomandat: