Spisu treści:

Automatyczna diagnostyka retinopatii cukrzycowej za pomocą MATLAB: 33 kroki
Automatyczna diagnostyka retinopatii cukrzycowej za pomocą MATLAB: 33 kroki

Wideo: Automatyczna diagnostyka retinopatii cukrzycowej za pomocą MATLAB: 33 kroki

Wideo: Automatyczna diagnostyka retinopatii cukrzycowej za pomocą MATLAB: 33 kroki
Wideo: Cukrzyca ➡️ przyczyny, typy, diagnostyka, leczenie, powikłania 2024, Lipiec
Anonim
Zautomatyzowana diagnostyka retinopatii cukrzycowej za pomocą MATLAB
Zautomatyzowana diagnostyka retinopatii cukrzycowej za pomocą MATLAB
Zautomatyzowana diagnostyka retinopatii cukrzycowej za pomocą MATLAB
Zautomatyzowana diagnostyka retinopatii cukrzycowej za pomocą MATLAB

(Patrz zarys kodu powyżej)

Retinopatia cukrzycowa to choroba oczu związana z cukrzycą, spowodowana wysokim poziomem cukru we krwi. Wysoki poziom cukru we krwi powoduje pęcznienie naczyń krwionośnych siatkówki, co prowadzi do powiększenia naczyń krwionośnych, a nawet nieszczelności naczyń, co prowadzi do ciemnych plam na obrazach siatkówki. Za pomocą tego kodu staramy się wykorzystać pojawianie się przecieków z naczyń krwionośnych jako wskaźnik podstawowej retinopatii cukrzycowej, chociaż w rzeczywistym świecie wymagane byłyby dalsze techniki diagnostyczne. Celem tego kodu jest automatyzacja przetwarzania obrazu i diagnozowania obrazów siatkówki w celu identyfikacji objawów retinopatii cukrzycowej widocznych w ciemnych plamach na obrazach siatkówki.

10 normalnych obrazów siatkówki i 10 zdiagnozowanych obrazów siatkówki zostało przetworzonych za pomocą kodu, który najpierw odczytuje i filtruje obrazy, a następnie określa ilościowo ciemne plamy w celu określenia, czy występują objawy retinopatii cukrzycowej, w oparciu o dany próg. Wyniki są następnie drukowane w oknie poleceń w celu interpretacji przez przeglądarkę.

Krok 1: Warunki wstępne

Warunki wstępne
Warunki wstępne

1. Upewnij się, że masz pobrany program MATLAB na swój komputer.

2. Pobierz plik txt znaleziony w linku. (Naciśnij „ctrl+s”, aby zapisać w tym samym katalogu, co kod MATLAB)

Krok 2: Warunki wstępne (nie)

Wymagania wstępne (nie)
Wymagania wstępne (nie)
Wymagania wstępne (nie)
Wymagania wstępne (nie)

4. Otwórz MATLAB i wpisz „uiimport” w oknie poleceń.

5. Wybierz plik Officialdiagnoses.txt i zaimportuj go do MATLAB jako macierz komórek.

6. Upewnij się, że widzisz „oficjalne diagnozy” jako zmienną w obszarze roboczym.

Krok 3: Warunki wstępne (nie)

Wymagania wstępne (nie)
Wymagania wstępne (nie)

7. Pobierz funkcję ModWald.m, którą można uzyskać z powyższego kodu lub pobrać go z Canvas.

(Kod dostarczony przez profesora Kinga i profesora Choi)

Krok 4: Warunki wstępne (nie)

Wymagania wstępne (nie)
Wymagania wstępne (nie)

8. Pobierz 400 surowych obrazów z sekcji danych projektu STARE.

Krok 5: Oczyść Matlab, aby przygotować się do uruchomienia kodu

Oczyść Matlab, aby przygotować się do uruchomienia kodu
Oczyść Matlab, aby przygotować się do uruchomienia kodu

Dodaj do kodu:

1. zamknij wszystko (Zamyka wszystkie wcześniej otwarte obrazy)

2. clearvars - z wyjątkiem oficjalnych diagnoz (Czyści wszystkie zmienne z wyjątkiem wcześniej zaimportowanego pliku txt oficjalnych diagnoz)

3. cclc (czyści okno poleceń)

Krok 6: Wybierz 10 normalnych obrazów oka i 10 obrazów z objawami retinopatii cukrzycowej

Wybierz 10 obrazów normalnych oczu i 10 obrazów z objawami retinopatii cukrzycowej
Wybierz 10 obrazów normalnych oczu i 10 obrazów z objawami retinopatii cukrzycowej
Wybierz 10 obrazów normalnych oczu i 10 obrazów z objawami retinopatii cukrzycowej
Wybierz 10 obrazów normalnych oczu i 10 obrazów z objawami retinopatii cukrzycowej

1. Weź plik tekstowy diagnostyki i wyodrębnij nazwy obrazów. Nazwy te znajdują się w pierwszej kolumnie pliku tekstowego, więc aby je wyodrębnić, wpisz „officialdiagnoses(:, 1)”. Macierz nazw obrazów została przypisana do zmiennej „wszystkie_liczby_obrazów”

2. Przekonwertuj zmienną all_image_numbers z tablicy komórek na tablicę macierzy za pomocą funkcji cell2mat

Krok 7: Wybierz 10 normalnych obrazów oka i 10 obrazów z objawami retinopatii cukrzycowej (nie)

Wybierz 10 obrazów normalnych oczu i 10 obrazów z objawami retinopatii cukrzycowej (nie)
Wybierz 10 obrazów normalnych oczu i 10 obrazów z objawami retinopatii cukrzycowej (nie)
Wybierz 10 obrazów normalnych oczu i 10 obrazów z objawami retinopatii cukrzycowej (nie)
Wybierz 10 obrazów normalnych oczu i 10 obrazów z objawami retinopatii cukrzycowej (nie)

3. Wybierz 10 normalnych obrazów oczu, aby uruchomić kod. Wybrane w tym przypadku obrazy to 278, 199, 241, 235, 35, 77, 82, 164, 239, 170.

Umieść te liczby w macierzy i przypisz je do zmiennej, która zostanie wywołana podczas ładowania obrazów.

4. Powtórz krok 3 dla obrazów siatkówki, u których zdiagnozowano retinopatię cukrzycową. Wybrane w tym przypadku obrazy to 139, 137, 136, 135, 133, 140, 141, 116, 157, 188.

Krok 8: Utwórz 2 zmienne (normalną i zdiagnozowaną) i ustaw je na 0

Utwórz 2 zmienne (normalną i zdiagnozowaną) i ustaw je na 0
Utwórz 2 zmienne (normalną i zdiagnozowaną) i ustaw je na 0

Utwórz te zmienne przed pętlą for, aby zainicjować numery pętli.

Krok 9: Utwórz pętlę for, aby automatycznie przesyłać normalne obrazy

Utwórz pętlę for, aby automatycznie przesyłać normalne obrazy
Utwórz pętlę for, aby automatycznie przesyłać normalne obrazy

1. Utwórz pętlę for

2. Ustaw zmienną liczącą (w tym przypadku i) na macierz wartości 1-10. Ta zmienna zliczająca będzie używana do wywoływania każdego obrazu indywidualnie

3. Weź element i w macierzy obrazów, aby wyodrębnić i przekonwertować nazwę obrazu z ciągu na liczbę za pomocą funkcji num2str.

Znajdź liczbę cyfr występujących w nazwie obrazu za pomocą funkcji numel. Przypisz tę wartość do zmiennej cyfry_normalne. Liczba ta powinna wynosić 1 dla liczb jednocyfrowych, 2 dla liczb dwucyfrowych i 3 dla liczb trzycyfrowych. Te informacje będą używane do automatycznego wywoływania obrazów.

Krok 10: Utwórz pętlę for, aby automatycznie przesyłać normalne obrazy (nie)

Utwórz pętlę for, aby automatycznie przesyłać normalne obrazy (nie)
Utwórz pętlę for, aby automatycznie przesyłać normalne obrazy (nie)

3. Utwórz instrukcję if zawierającą wszystkie trzy możliwości z poprzednich kroków. Jeśli nazwa obrazu ma 1 cyfrę, obraz będzie nazwany „im000”, jeśli ma 2 cyfry, obraz zostanie nazwany „im00”, a jeśli będzie miał 3, obraz zostanie nazwany „im0”.

4. Pod każdą instrukcją if przypisz zmienną do imread „im” pod odpowiednią instrukcją if z odpowiednią liczbą zer (jak opisano powyżej), po której następuje i.

Krok 11: Przytnij granice obrazu

Przytnij granice obrazu
Przytnij granice obrazu

Weź oryginalny obraz i zastosuj filtr imcrop, aby wyeliminować czarne obramowania i przypisz do zmiennej I_crop. Prostokąt kadrowania określa się za pomocą macierzy [95, 95, 500, 410].

Krok 12: Utwórz obraz w skali szarości

Utwórz obraz w skali szarości
Utwórz obraz w skali szarości

Weź wykadrowany obraz i zastosuj filtr rbg2gray, aby zmienić obraz na skalę szarości. Przypisz ten obraz do zmiennej I2.

Krok 13: Utwórz skontrastowany obraz

Utwórz skontrastowany obraz
Utwórz skontrastowany obraz

Zrób obraz I2 i użyj imadjust, aby przeskalować wartości intensywności.

Weź wartości mieszczące się w zakresie [0.2, 0.7] i przeskaluj je do [0, 1]. Gamma jest ustawiona na 0,8, aby obraz był jaśniejszy. Przypisz nowy obraz do I_adjusted.

Krok 14: Popraw kontrast obrazu

Popraw kontrast obrazu
Popraw kontrast obrazu

Zrób obraz I_adjusted i użyj funkcji adapthisteq, aby zwiększyć kontrast.

Składnia Adapthisteq wymaga nazwy obrazu I_adjusted, „numTiles”, rozmiaru numTiles, „nBins” i liczby pojemników. Rozmiar numTiles jest ustawiony na [8 8], dzieląc obraz na kafelki 8x8, a liczba pojemników jest ustawiona na 28. Przypisz obraz do I_constrast.

Krok 15: Utwórz średni filtr

Utwórz średni filtr
Utwórz średni filtr

Utwórz zmienną o nazwie 'meanfilt' za pomocą funkcji fspecial. Wprowadź „funkcję średniej”, aby utworzyć filtr uśredniający i wstaw [90 90] dla rozmiaru okna przesuwnego.

Krok 16: Połącz filtr uśredniający z skontrastowanym obrazem

Połącz filtr uśredniający z skontrastowanym obrazem
Połącz filtr uśredniający z skontrastowanym obrazem

Utwórz nową zmienną o nazwie mask_mean i użyj funkcji imfilter, aby pobrać obraz I_contrast i zastosować wcześniej utworzony filtr średniej.

Krok 17: Utwórz nową maskę średniej, odejmując piksele

Utwórz nową maskę średniej, odejmując piksele
Utwórz nową maskę średniej, odejmując piksele

Utwórz zmienną o nazwie mask_mean2 i użyj funkcji imsubtract, aby odjąć wartość każdego piksela w I_contrast od odpowiedniego piksela w mask_mean.

Krok 18: Utwórz filtrowany obraz binarny

Utwórz filtrowany obraz binarny
Utwórz filtrowany obraz binarny

Zmień obrazy w skali szarości na czarno-białe za pomocą imbinarize. Input mask_mean2, ‘adaptive’, ‘ForegroundPolarity’, ‘dark’, ‘Sensitivity’, 0.6. Przypisz ten nowy obraz do mask_binarize.

Krok 19: Usuń mniejsze plamy znalezione w filtrowanych obrazach

Usuń mniejsze plamy znalezione w filtrowanych obrazach
Usuń mniejsze plamy znalezione w filtrowanych obrazach

Usuń obiekty z łącznością mniejszą niż 100 pikseli za pomocą funkcji bwareaopen w mask_binarize i ustaw wartość progową na 100. Przypisz zmienną jako bw.

Krok 20: Utwórz element strukturyzujący dysk

Utwórz element strukturyzujący dysk
Utwórz element strukturyzujący dysk

Utwórz element strukturyzujący dysk (o promieniu 2) za pomocą funkcji strel. Przypisz go do se.

Krok 21: Wykonaj morfologiczne operacje zamknięcia

Wykonywanie morfologicznych operacji zamykających
Wykonywanie morfologicznych operacji zamykających

Weź bw i zastosuj funkcję imclose do elementu strukturalnego, aby wykonać morfologiczną operację zamknięcia na obiekcie.

Krok 22: Znajdź obiekty z łącznością co najmniej 8

Znajdź obiekty z łącznością co najmniej 8
Znajdź obiekty z łącznością co najmniej 8

Weź bw i użyj bwconncomp, aby znaleźć obiekty z łącznością co najmniej 8 na obrazie. Przypisz numer wyjściowy do cc_1.

Krok 23: Znajdź maksymalną liczbę połączonych pikseli

Znajdź maksymalną liczbę połączonych pikseli
Znajdź maksymalną liczbę połączonych pikseli
Znajdź maksymalną liczbę połączonych pikseli
Znajdź maksymalną liczbę połączonych pikseli

Użyj funkcji cellfun, aby wykonać funkcję „numel” na każdej komórce w CC. Znajduje to liczbę elementów w komórce PixelIdxList. Przypisz wartość do „numPixels”.

Znajdź maksymalne wartości w numPixels. Przypisz największe maksimum do „największego”, a indeks maksymalnej wartości do „idx”.

Krok 24: Ustaw maksymalne wartości pikseli na 0 i znajdź piksele z łącznością >= 26 pikseli

Usuń naczynia krwionośne z obrazu
Usuń naczynia krwionośne z obrazu
Wyświetlacz rysunku
Wyświetlacz rysunku
Usuń naczynia i policz krople krwi
Usuń naczynia i policz krople krwi
Zdiagnozuj obraz siatkówki na podstawie liczby zidentyfikowanych skrzepów krwi
Zdiagnozuj obraz siatkówki na podstawie liczby zidentyfikowanych skrzepów krwi

Ustaw piksele o największych wartościach w obrazie „bw” na 0, dzięki czemu piksele będą czarne.

Znajdź obiekty z łącznością co najmniej 26 pikseli na obrazie za pomocą bwconncomp. Przypisz do zmiennej cc_1.

Krok 25: Usuń naczynia krwionośne z obrazu

Usuń naczynia krwionośne nadal obecne na obrazie za pomocą funkcji bwpropfilt w zakresie [0, 0,9].

[0.9, 1] jest wykluczone, ponieważ wartości bliskie 1 wskazują linię. Przypisz do „Usuń naczynia”.

Krok 26: Wyświetlanie figury

Wyświetl każdy filtrowany obraz na wykresie podrzędnym. Pokaż. z danymi wejściowymi „border” i „tight” wyświetla każdy obraz w strukturze podrzędnej. Dodaj tytuł do każdego obrazu, aby odróżnić, który filtr został użyty.

Krok 27: Usuń naczynia i policz krople krwi

1. Weź „RemoveVessels” i zastosuj funkcję „Centroid” w rekwizytach regionu, aby zidentyfikować centroidy obiektów na obrazie. Obiekty te powinny odpowiadać skrzepom krwi obecnym na obrazie.

2. Policz liczbę zidentyfikowanych skrzepów krwi, biorąc długość matrycy centroidu.

Krok 28: Zdiagnozuj obraz siatkówki na podstawie liczby zidentyfikowanych skrzepów krwi

Użyj instrukcji if, aby zdiagnozować obraz na podstawie liczby zidentyfikowanych skrzepów krwi.

Jeśli liczba zidentyfikowanych centroidów była mniejsza lub równa 5, obraz był identyfikowany jako normalny.

Jeśli liczba centroidów była większa niż 5, w obrazie rozpoznano retinopatię cukrzycową.

Wynik jest wypisywany w oknie poleceń za pomocą fprintf.

Krok 29: Jeśli jest więcej niż 5 plamek…

Jeśli jest więcej niż 5 plamek…
Jeśli jest więcej niż 5 plamek…

Powtórz powyższe instrukcje dla zdiagnozowanych obrazów jako inne stwierdzenie. Ta część zostanie uruchomiona, jeśli liczba obiektów blob jest większa niż 5.

Zakończ instrukcję if.

Krok 30: Powtórz proces filtrowania dla normalnych obrazów z wartościami cyfr obrazu 2 i 3

Powtórz proces filtrowania dla normalnych obrazów o wartościach cyfr obrazu 2 i 3
Powtórz proces filtrowania dla normalnych obrazów o wartościach cyfr obrazu 2 i 3
Powtórz proces filtrowania dla normalnych obrazów o wartościach cyfr obrazu 2 i 3
Powtórz proces filtrowania dla normalnych obrazów o wartościach cyfr obrazu 2 i 3

Powtórz ten proces dla pozostałej części oryginalnych instrukcji if, gdy liczba (liczba cyfr w numerze obrazu) jest równa 2 i 3. To kończy pętlę for dla normalnych obrazów.

Zakończ pętlę for.

Krok 31: Powtórz cały proces dla zdiagnozowanych obrazów

Powtórz cały proces dla zdiagnozowanych obrazów
Powtórz cały proces dla zdiagnozowanych obrazów

Powtórz cały proces, używając zdiagnozowanych obrazów wymienionych w macierzy „liczby_do_wydobycia_diagnozowane”.

Pamiętaj, aby przejrzeć każdą figurę (i) i zmienić ją na figurę (i+10), aby zdiagnozowane figury pojawiły się jako obrazy od 11 do 20.

Krok 32: Analiza statystyczna

Analiza statystyczna
Analiza statystyczna

1. 'Actual_Diagnosis_Matrix' służy do porównania wyników z oficjalną diagnozą znalezioną w pliku txt. Pierwsze 10 zer wskazuje, że pierwsze 10 obrazów powinno być normalne. Ostatnie 10 obrazów wskazuje, że ostatnie 10 obrazów powinno być zaklasyfikowane jako retinopatia cukrzycowa.

2. Podwójny znak równości użyty do utworzenia „number_correct” tworzy logiczną tablicę, porównując wartość odpowiednich elementów „Actual_Diagnosis_Matrix” z „Diagnosis_Matrix” utworzonych z pętli for.

Dla każdego elementu pasującego do diagnozy zostanie dodane 1, co oznacza, że kod poprawnie zdiagnozował ten obraz. Jeśli jest niepoprawny, doda 0 do matrycy.

Następnie, biorąc sumę, która sumuje wszystkie jedynki. Innymi słowy, znajduje sumę prawidłowo zdiagnozowanych obrazów.

3. „Final_percentage_correct” to obliczony procent dokładności kodu zdiagnozowanej retinopatii cukrzycowej. Liczba prawidłowo zdiagnozowanych obrazów jest podzielona przez 20 (całkowita liczba obrazów) i pomnożona przez 100, aby obliczyć procent pomyślnych diagnoz.

Krok 33: Znalezienie przedziału ufności

Znajdowanie przedziału ufności
Znajdowanie przedziału ufności

1. Upewnij się, że pobrałeś plik ModWald.m, aby wywołać go jako funkcję. Bez tej funkcji musiałbyś sam obliczyć przedział ufności za pomocą zmodyfikowanej metody Walda.

2. Funkcja ModWald posiada 2 wejścia, z których pierwsze to liczba poprawnie zidentyfikowanych obrazów, a drugie to łączna liczba obrazów.

3. Funkcja ModWald wyświetli dolną i górną granicę przedziału ufności proporcji dla dokładności próbkowanych danych. Innymi słowy, podasz przedział procentowy, w którym będzie leżał prawdziwy procent dokładności kodu.

4. Użyj fprintf poniżej, aby wyświetlić statystyki i przedział ufności w oknie poleceń.

> fprintf('%.0f procent obrazów siatkówki zostało prawidłowo zdiagnozowanych zgodnie z oficjalną diagnozą. \n\n', Final_percentage_correct)

> fprintf('Prawdziwy procent, przy którym nasz kod poprawnie zdiagnozuje retinopatię cukrzycową,\n mieści się w zakresie [%.3f, %.3f], na podstawie 20 pobranych próbek \n', lower_bound, upper_bound)

Zalecana: