Obsah:

Automatizovaná diagnostika diabetické retinopatie prostřednictvím MATLAB: 33 kroků
Automatizovaná diagnostika diabetické retinopatie prostřednictvím MATLAB: 33 kroků

Video: Automatizovaná diagnostika diabetické retinopatie prostřednictvím MATLAB: 33 kroků

Video: Automatizovaná diagnostika diabetické retinopatie prostřednictvím MATLAB: 33 kroků
Video: Monitoring diabetu v Klaudiánově nemocnici 2024, Listopad
Anonim
Automatizovaná diagnostika diabetické retinopatie prostřednictvím MATLAB
Automatizovaná diagnostika diabetické retinopatie prostřednictvím MATLAB
Automatizovaná diagnostika diabetické retinopatie prostřednictvím MATLAB
Automatizovaná diagnostika diabetické retinopatie prostřednictvím MATLAB

(Viz obrys kódu výše)

Diabetická retinopatie je oční onemocnění související s diabetem způsobené vysokou hladinou cukru v krvi. Vysoké hladiny cukru v krvi způsobují bobtnání cév v sítnicích, což vede ke zvětšení krevních cév a dokonce k prosakování cév, což vede k tmavým skvrnám na sítnicových obrazech. S tímto kódem se snažíme využít vzhled skvrn na prosakování krevních cév jako indikátor pozadí diabetické retinopatie, ačkoli v reálném světě by byly zapotřebí další diagnostické techniky. Cílem tohoto kódu je zautomatizovat zpracování obrazu a diagnostiku obrazů sítnice za účelem identifikace známek diabetické retinopatie projevených tmavými skvrnami na sítnicových obrázcích.

10 normálních obrazů sítnice a 10 diagnostikovaných snímků sítnice bylo zpracováno pomocí kódu, který nejprve čte a filtruje obrázky a poté kvantifikuje tmavé skvrny, aby určil, zda jsou přítomny příznaky diabetické retinopatie, na základě daného prahu. Výsledky se poté vytisknou do příkazového okna pro interpretaci prohlížeče.

Krok 1: Předpoklady

Předpoklady
Předpoklady

1. Ujistěte se, že máte v počítači stažený program MATLAB.

2. Stáhněte si soubor txt, který najdete v odkazu. (Stisknutím ‘ctrl+s’ uložíte do stejného adresáře jako kód MATLAB)

Krok 2: Předpoklady (není)

Předpoklady (není)
Předpoklady (není)
Předpoklady (není)
Předpoklady (není)

4. Otevřete MATLAB a do příkazového okna zadejte „uiimport“.

5. Vyberte soubor officialdiagnoses.txt a importujte jej do MATLABu jako matici buněk.

6. Ujistěte se, že vidíte „úřední diagnózy“jako proměnnou v pracovním prostoru.

Krok 3: Předpoklady (není)

Předpoklady (není)
Předpoklady (není)

7. Stáhněte si funkci ModWald.m, která může získat z výše uvedeného kódu nebo ji stáhnout z Canvas.

(Kód poskytli profesor King a profesor Choi)

Krok 4: Předpoklady (není)

Předpoklady (není)
Předpoklady (není)

8. Stáhněte si 400 nezpracovaných obrázků z datové části projektu STARE.

Krok 5: Vyčistěte Matlab a připravte se na spuštění kódu

Vyčistěte Matlab a připravte se na spuštění kódu
Vyčistěte Matlab a připravte se na spuštění kódu

Přidat do kódu:

1. zavřít vše (Zavře všechny dříve otevřené obrázky)

2. clearvars - kromě oficiálních diagnóz (Vymaže všechny proměnné kromě dříve importovaného souboru txt oficiálních diagnóz)

3. cclc (vymaže příkazové okno)

Krok 6: Vyberte 10 běžných očních snímků a 10 snímků s příznaky diabetické retinopatie

Vyberte 10 běžných očních snímků a 10 snímků s příznaky diabetické retinopatie
Vyberte 10 běžných očních snímků a 10 snímků s příznaky diabetické retinopatie
Vyberte 10 snímků normálního oka a 10 snímků s příznaky diabetické retinopatie
Vyberte 10 snímků normálního oka a 10 snímků s příznaky diabetické retinopatie

1. Vezměte diagnostický textový soubor a rozbalte názvy obrázků. Tato jména jsou obsažena v prvním sloupci textového souboru, takže pro jejich extrahování zadejte 'officialdiagnoses (:, 1)'. Matice názvů obrázků byla přiřazena proměnné „všechna_obrazová_čísla“

2. Převeďte proměnnou all_image_numbers z pole buňky na maticové pole pomocí funkce cell2mat

Krok 7: Vyberte 10 běžných očních snímků a 10 snímků s příznaky diabetické retinopatie (nezahrnuje)

Vyberte 10 běžných očních snímků a 10 snímků s příznaky diabetické retinopatie (nezahrnuje)
Vyberte 10 běžných očních snímků a 10 snímků s příznaky diabetické retinopatie (nezahrnuje)
Vyberte 10 běžných očních snímků a 10 snímků s příznaky diabetické retinopatie (nezahrnuje)
Vyberte 10 běžných očních snímků a 10 snímků s příznaky diabetické retinopatie (nezahrnuje)

3. Pro spuštění kódu vyberte 10 běžných obrazů očí. V tomto případě byly vybrány obrázky 278, 199, 241, 235, 35, 77, 82, 164, 239, 170.

Umístěte tato čísla do matice a přiřaďte je k proměnné, která bude volána při načítání obrázků.

4. Opakujte krok 3 pro obrazy sítnice, u kterých byla diagnostikována diabetická retinopatie. V tomto případě byly vybrány obrázky 139, 137, 136, 135, 133, 140, 141, 116, 157, 188.

Krok 8: Vytvořte 2 proměnné (normální a diagnostikované) a nastavte je na 0

Vytvořte 2 proměnné (normální a diagnostikované) a nastavte je na 0
Vytvořte 2 proměnné (normální a diagnostikované) a nastavte je na 0

Vytvořte tyto proměnné před smyčkou for a inicializujte čísla smyček.

Krok 9: Vytvořte smyčku pro automatické nahrávání normálních obrázků

Vytvořte smyčku pro automatické nahrávání normálních obrázků
Vytvořte smyčku pro automatické nahrávání normálních obrázků

1. Vytvořte smyčku for

2. Nastavte proměnnou počítání (v tomto případě i) na matici hodnot 1-10. Tato proměnná počítání bude použita k volání každého obrázku jednotlivě

3. Vezměte prvek i do matice obrázků a extrahujte a převeďte název obrázku z řetězce na číslo pomocí funkce num2str.

Zjistěte počet číslic přítomných v názvu obrázku pomocí funkce numel. Přiřaďte tuto hodnotu proměnné digits_normal. Toto číslo by mělo být 1 pro jednociferná čísla, 2 pro dvojciferná čísla a 3 pro trojciferná čísla. Tyto informace budou použity k automatickému volání obrázků.

Krok 10: Vytvořte smyčku pro automatické nahrávání normálních obrázků (con't)

Vytvořte smyčku pro automatické nahrávání normálních obrázků (ne)
Vytvořte smyčku pro automatické nahrávání normálních obrázků (ne)

3. Vytvořte příkaz if obsahující všechny tři možnosti z předchozích kroků. Pokud má název obrázku 1 číslici, bude obrázek nazýván „im000“, pokud má 2 číslice, bude obrázek nazýván „im00“a pokud má 3, bude obrázek nazýván „im0“.

4. Pod každým příkazem if přiřaďte proměnnou imread „im“pod odpovídající, if příkaz s příslušným počtem nul (jak je popsáno výše), za nímž následuje i.

Krok 11: Ořízněte okraje obrázku

Ořízněte okraje obrázku
Ořízněte okraje obrázku

Pořiďte původní obrázek a použijte filtr imcrop k odstranění černých okrajů a přiřaďte proměnné I_crop. Ořezový obdélník je určen pomocí matice [95, 95, 500, 410].

Krok 12: Vytvořte obrázek v šedé škále

Vytvořte obrázek v měřítku šedé
Vytvořte obrázek v měřítku šedé

Pořiďte oříznutý obrázek a pomocí filtru rbg2gray změňte obrázek na stupně šedi. Přiřaďte tento obrázek proměnné I2.

Krok 13: Vytvořte kontrastní obrázek

Vytvořte kontrastní obrázek
Vytvořte kontrastní obrázek

Pořiďte snímek I2 a pomocí imadjust změňte hodnoty intenzity.

Vezměte hodnoty, které spadají do rozsahu [0,2, 0,7], a změňte jejich měřítko na [0, 1]. Gama je nastaveno na 0,8, aby byl obraz jasnější. Přiřaďte nový obrázek I_adjusted.

Krok 14: Vylepšete kontrastní obraz

Vylepšete kontrastní obraz
Vylepšete kontrastní obraz

Pořiďte I_adjusted image a použijte funkci adapthisteq ke zvýšení kontrastu.

Syntaxe Adapthisteq vyžaduje název obrázku, I_adjusted, ‘numTiles’, velikost numTiles, ‘nBins‘a počet popelnic. Velikost numTiles je nastavena na [8 8], rozdělení obrazu na dlaždice 8x8 a počet přihrádek je nastaven na 28. Přiřaďte obrázek I_constrast.

Krok 15: Vytvořte průměrný filtr

Vytvořte průměrný filtr
Vytvořte průměrný filtr

Pomocí funkce fspecial vytvořte proměnnou s názvem 'meanfilt'. Zadejte „průměrnou funkci“pro vytvoření průměrovacího filtru a vložte [90 90] pro velikost posuvného okna.

Krok 16: Zkombinujte průměrující filtr s kontrastním obrazem

Zkombinujte průměrující filtr s kontrastním obrazem
Zkombinujte průměrující filtr s kontrastním obrazem

Vytvořte novou proměnnou s názvem mask_mean a pomocí funkce imfilter pořiďte obrázek I_contrast a použijte dříve vytvořený průměrný filtr.

Krok 17: Vytvořte novou průměrnou masku odečtením pixelů

Vytvořte novou průměrnou masku odečtením pixelů
Vytvořte novou průměrnou masku odečtením pixelů

Vytvořte proměnnou s názvem mask_mean2 a pomocí funkce imsubtract odečtěte hodnotu každého pixelu v I_contrast od odpovídajícího pixelu v mask_mean.

Krok 18: Vytvořte binární filtrovaný obrázek

Vytvořte binární filtrovaný obrázek
Vytvořte binární filtrovaný obrázek

Otočte obrázky ve stupních šedi na černobílé pomocí imbinarizace. Input mask_mean2, ‘adaptive’, ‘ForegroundPolarity’, ‘dark’, ‘Sensitivity’, 0.6. Přiřaďte tento nový obrázek k mask_binarize.

Krok 19: Odstraňte menší bloby nalezené ve filtrovaných obrázcích

Odstraňte menší bloby nalezené ve filtrovaných obrázcích
Odstraňte menší bloby nalezené ve filtrovaných obrázcích

Odstraňte objekty s připojením menším než 100 pixelů pomocí funkce bwareaopen na mask_binarize a nastavte prahovou hodnotu na 100. Přiřaďte proměnnou jako bw.

Krok 20: Vytvořte prvek pro strukturování disku

Vytvořte prvek pro strukturování disku
Vytvořte prvek pro strukturování disku

Pomocí funkce strel vytvořte prvek pro strukturování disku (o poloměru 2). Přiřaďte to k sobě.

Krok 21: Proveďte morfologické operace blízko

Proveďte morfologické operace blízko
Proveďte morfologické operace blízko

Vezměte bw a použijte funkci imclose na konstrukční prvek k provedení morfologické blízké operace s objektem.

Krok 22: Najděte objekty s konektivitou nejméně 8

Najděte objekty s konektivitou nejméně 8
Najděte objekty s konektivitou nejméně 8

Vezměte bw a pomocí bwconncomp najděte objekty s konektivitou alespoň 8 na obrázku. Přiřaďte výstup čísla k cc_1.

Krok 23: Najděte maximální počet připojených pixelů

Najděte maximální počet připojených pixelů
Najděte maximální počet připojených pixelů
Najděte maximální počet připojených pixelů
Najděte maximální počet připojených pixelů

Pomocí funkce cellfun proveďte funkci „numel“na každé buňce v CC. Tím se zjistí počet prvků v buňce PixelIdxList. Přiřaďte hodnotu „numPixels“.

Najděte maximální hodnoty v numPIxels. Největší maximum přiřaďte „největší“a index maximální hodnoty „idx“.

Krok 24: Nastavte maximální hodnoty pixelů na 0 a najděte pixely s> = 26 pixelovým připojením

Odstraňte krevní cévy z obrázku
Odstraňte krevní cévy z obrázku

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

Zobrazení obrázku
Zobrazení obrázku

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

Odstraňte nádoby a spočítejte kapky krve
Odstraňte nádoby a spočítejte kapky krve

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

Diagnostikujte obraz sítnice na základě počtu identifikovaných krevních sraženin
Diagnostikujte obraz sítnice na základě počtu identifikovaných krevních sraženin

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

Nastavte pixely s největšími hodnotami v obrázku „bw“na 0, čímž budou pixely černé.

Najděte objekty s konektivitou alespoň 26 pixelů v obrázku pomocí bwconncomp. Přiřadit proměnné cc_1.

Krok 25: Odstraňte krevní cévy na obrázku

Odstraňte krevní cévy, které jsou stále na obrázku, pomocí funkce bwpropfilt s rozsahem [0, 0,9].

[0,9, 1] je vyloučeno, protože hodnoty blízké 1 označují řádek. Přiřaďte k „RemoveVessels“.

Krok 26: Zobrazení obrázku

Zobrazte každý filtrovaný obrázek v subplotu. Imshow. se vstupy „ohraničení“a „těsný“zobrazí každý obrázek ve struktuře subplotu. Ke každému obrázku přidejte nadpis, abyste rozlišili, který filtr byl použit.

Krok 27: Odstraňte nádoby a spočítejte krvavé kapky

1. Vezměte „RemoveVessels“a použijte funkci „Centroid“v regionprops, abyste identifikovali těžiště objektů na obrázku. Tyto objekty by měly odpovídat krevním sraženinám přítomným na obrázku.

2. Spočítejte počet krevních sraženin identifikovaný délkou těžiště matrice.

Krok 28: Diagnostikujte obraz sítnice na základě počtu identifikovaných krevních sraženin

Použijte příkazy if k diagnostice obrazu na základě počtu identifikovaných krevních sraženin.

Pokud byl počet identifikovaných centroidů menší nebo roven 5, byl obrázek identifikován jako normální.

Pokud byl počet centroidů větší než 5, byl obraz diagnostikován s diabetickou retinopatií.

Výsledek se vytiskne do příkazového okna pomocí fprintf.

Krok 29: Pokud existuje více než 5 blobů…

Pokud existuje více než 5 blobů…
Pokud existuje více než 5 blobů…

Opakujte výše uvedené pokyny pro diagnostikované obrázky jako příkaz else. Tato část se spustí, pokud je počet blobů větší než 5.

Ukončete příkaz if.

Krok 30: Opakujte postup filtrování pro normální snímky s hodnotami číslic obrázku jako 2 a 3

Opakujte proces filtrování pro normální snímky s hodnotami číslic obrázku jako 2 a 3
Opakujte proces filtrování pro normální snímky s hodnotami číslic obrázku jako 2 a 3
Opakujte proces filtrování pro normální snímky s hodnotami číslic obrázku jako 2 a 3
Opakujte proces filtrování pro normální snímky s hodnotami číslic obrázku jako 2 a 3

Opakujte postup pro zbývající část původního příkazu if, pokud je numel (počet číslic v čísle obrázku) roven 2 a 3. Tím je smyčka for pro normální obrázky dokončena.

Ukončete smyčku for.

Krok 31: Opakujte celý proces pro diagnostikované obrázky

Opakujte celý proces pro diagnostikované obrázky
Opakujte celý proces pro diagnostikované obrázky

Opakujte celý proces pomocí diagnostikovaných obrázků uvedených v matici „čísla_to_extrakce_diagnostikována“.

Ujistěte se, že jste prošli každou číslici (i) a změnili ji na číslici (i+10), aby diagnostikované figury vyskočily jako obrázky 11 až 20.

Krok 32: Statistická analýza

Statistická analýza
Statistická analýza

1. „Actual_Diagnosis_Matrix“se používá k porovnání výsledků s oficiální diagnózou nalezenou v souboru txt. Prvních 10 nul znamená, že prvních 10 obrázků by mělo být normální. Posledních 10 z nich naznačuje, že posledních 10 snímků by mělo být klasifikováno jako diabetická retinopatie.

2. Dvojité znaménko rovnosti použité k vytvoření „number_correct“vytvoří logické pole porovnáním hodnoty odpovídajících prvků „Actual_Diagnosis_Matrix“s „Diagnosis_Matrix“vytvořeným ze smyčky for.

Pro každý prvek, který odpovídá diagnostice, bude přidána hodnota 1, což znamená, že kód správně diagnostikoval tento obrázek. Pokud je nesprávný, přidá do matice 0.

Když tedy vezmeme jejich součet, všechny sečtou. Jinými slovy, najde součet správně diagnostikovaných obrázků.

3. 'Final_percentage_correct' je vypočtené procento přesnosti kódu diagnostikované diabetické retinopatie. Počet správně diagnostikovaných obrázků se vydělí 20 (celkový počet obrázků) a vynásobí 100, aby se zjistilo procento úspěšných diagnóz.

Krok 33: Hledání intervalu spolehlivosti

Hledání intervalu spolehlivosti
Hledání intervalu spolehlivosti

1. Ujistěte se, že máte stažený ModWald.m, abyste jej mohli volat jako funkci. Bez funkce byste museli interval spolehlivosti vypočítat pomocí upravené Waldovy metody sami.

2. Funkce ModWald má 2 vstupy, kde první je počet správně identifikovaných obrázků a druhý je celkové množství obrázků.

3. Funkce ModWald vydá dolní a horní hranice intervalu spolehlivosti proporcí pro přesnost vzorkovaných dat. Jinými slovy, udáte interval v procentech, kde bude ležet skutečné procento přesnosti kódu.

4. Pomocí příkazu fprintf níže vygenerujte statistiky a interval spolehlivosti do příkazového okna.

> fprintf ('%. 0f procent obrazů sítnice bylo správně diagnostikováno podle oficiální diagnózy. / n / n', Final_percentage_correct)

> fprintf ('Skutečné procento, při kterém náš kód správně diagnostikuje diabetickou retinopatii, / n spadá do rozmezí [%.3f, %.3f], na základě 20 vzorkovaných obrázků / n', dolní_vázaný, horní_vázaný)

Doporučuje: