Съдържание:

Автоматизирана диагностика на диабетна ретинопатия чрез MATLAB: 33 стъпки
Автоматизирана диагностика на диабетна ретинопатия чрез MATLAB: 33 стъпки

Видео: Автоматизирана диагностика на диабетна ретинопатия чрез MATLAB: 33 стъпки

Видео: Автоматизирана диагностика на диабетна ретинопатия чрез MATLAB: 33 стъпки
Видео: ОКТ-диагностика сочетания диабетической ретинопатии и влажной ВМД 2024, Ноември
Anonim
Автоматизирана диагностика на диабетна ретинопатия чрез MATLAB
Автоматизирана диагностика на диабетна ретинопатия чрез MATLAB
Автоматизирана диагностика на диабетна ретинопатия чрез MATLAB
Автоматизирана диагностика на диабетна ретинопатия чрез MATLAB

(Вижте схемата на кода по -горе)

Диабетната ретинопатия е заболяване на очите, свързано с диабет, причинено от високи нива на кръвната захар. Високите нива на кръвната захар причиняват подуване на кръвоносните съдове в ретините, което води до разширяване на кръвоносните съдове и дори до изтичане на съдове, което води до тъмни петна в изображенията на ретината. С този код се стремим да използваме появата на места на изтичане на кръвоносни съдове като индикатор за фонова диабетна ретинопатия, въпреки че в реалния свят ще са необходими допълнителни техники за диагностика. Целта на този код е да автоматизира обработката на изображения и диагностицирането на изображения на ретината, за да идентифицира признаци на диабетна ретинопатия, проявена чрез тъмни петна в изображенията на ретината.

10 нормални изображения на ретината и 10 диагностицирани изображения на ретината бяха обработени чрез код, който първо чете и филтрира изображенията, а след това определя количествено тъмните петна, за да определи дали са налице симптоми на диабетна ретинопатия, въз основа на даден праг. След това резултатите се отпечатват в командния прозорец за интерпретация на зрителя.

Стъпка 1: Предпоставки

Предпоставки
Предпоставки

1. Уверете се, че програмата MATLAB е изтеглена на вашия компютър.

2. Изтеглете txt файла, намерен в линка. (Натиснете ‘ctrl+s’, за да запишете в същата директория като кода MATLAB)

Стъпка 2: Предпоставки (не)

Предпоставки (не)
Предпоставки (не)
Предпоставки (не)
Предпоставки (не)

4. Отворете MATLAB и въведете „uiimport“в командния прозорец.

5. Изберете файла officialdiagnoses.txt и го импортирайте в MATLAB като матрица на клетка.

6. Уверете се, че виждате „officialdiagnoses“като променлива в работното пространство.

Стъпка 3: Предпоставки (не)

Предпоставки (не)
Предпоставки (не)

7. Изтеглете функцията ModWald.m, която можете да получите от горния код или да я изтеглите от Canvas.

(Код, предоставен от професор Кинг и професор Чой)

Стъпка 4: Предпоставки (не)

Предпоставки (не)
Предпоставки (не)

8. Изтеглете 400 необработени изображения от раздела с данни на проекта STARE.

Стъпка 5: Почистете Matlab, за да се подготвите за стартиране на код

Почистете Matlab, за да се подготвите за работещ код
Почистете Matlab, за да се подготвите за работещ код

Добавяне към кода:

1. затваряне на всички (затваря всички предишни отворени изображения)

2. clearvars - с изключение на официални диагнози (Изчиства всички променливи, с изключение на официалния диагноз txt файл, предварително импортиран)

3. cclc (Изчиства командния прозорец)

Стъпка 6: Изберете 10 изображения с нормално око и 10 изображения със симптоми на диабетна ретинопатия

Изберете 10 изображения на нормални очи и 10 изображения със симптоми на диабетна ретинопатия
Изберете 10 изображения на нормални очи и 10 изображения със симптоми на диабетна ретинопатия
Изберете 10 изображения на нормални очи и 10 изображения със симптоми на диабетна ретинопатия
Изберете 10 изображения на нормални очи и 10 изображения със симптоми на диабетна ретинопатия

1. Вземете текстовия файл за диагностика и извлечете имената на изображенията. Тези имена се съдържат в първата колона на текстовия файл, така че за да ги извлечете, въведете „officialdiagnoses (:, 1)“. Матрицата с имена на изображения е присвоена на променлива „all_image_numbers“

2. Преобразувайте променливата all_image_numbers от клетъчен масив в матричен, използвайки функцията cell2mat

Стъпка 7: Изберете 10 изображения с нормално око и 10 изображения със симптоми на диабетна ретинопатия (не)

Изберете 10 изображения с нормални очи и 10 изображения със симптоми на диабетна ретинопатия (не)
Изберете 10 изображения с нормални очи и 10 изображения със симптоми на диабетна ретинопатия (не)
Изберете 10 изображения с нормални очи и 10 изображения със симптоми на диабетна ретинопатия (не)
Изберете 10 изображения с нормални очи и 10 изображения със симптоми на диабетна ретинопатия (не)

3. Изберете 10 нормални изображения на очите, за да стартирате кода. Избраните изображения в този случай са 278, 199, 241, 235, 35, 77, 82, 164, 239, 170.

Поставете тези числа в матрица и ги присвойте на променлива, която ще бъде извикана при зареждане на изображенията.

4. Повторете стъпка 3 за изображения на ретината, които са диагностицирани с диабетна ретинопатия. Избраните изображения в този случай са 139, 137, 136, 135, 133, 140, 141, 116, 157, 188.

Стъпка 8: Създайте 2 променливи (нормални и диагностицирани) и ги задайте като равни на 0

Създайте 2 променливи (нормални и диагностицирани) и ги задайте равно на 0
Създайте 2 променливи (нормални и диагностицирани) и ги задайте равно на 0

Създайте тези променливи преди цикъла for, за да инициализирате номерата на цикъла.

Стъпка 9: Създайте for for Loop за автоматично качване на нормални изображения

Създайте for Loop за автоматично качване на нормални изображения
Създайте for Loop за автоматично качване на нормални изображения

1. Създайте цикъл for

2. Задайте променлива за броене (i, в този случай) на матрица от стойности 1-10. Тази променлива за броене ще се използва за извикване на всяко изображение поотделно

3. Вземете елемента i в матрицата с изображения, за да извлечете и преобразувате името на изображението от низ в число, използвайки функцията num2str.

Намерете броя на цифрите в името на изображението, като използвате функцията numel. Задайте тази стойност на променлива, digits_normal. Това число трябва да бъде 1 за едноцифрени числа, 2 за двуцифрени числа и 3 за трицифрени числа. Тази информация ще се използва за автоматично извикване на изображения.

Стъпка 10: Създайте цикъл за за автоматично качване на нормални изображения (не)

Създайте цикъл за за автоматично качване на нормални изображения (не)
Създайте цикъл за за автоматично качване на нормални изображения (не)

3. Създайте оператор if, съдържащ и трите възможности от предишните стъпки. Ако името на изображението има 1 цифра, изображението ще се нарича „im000“, ако има 2 цифри, изображението ще се нарича „im00“, а ако има 3, изображението ще се нарича „im0“.

4. Под всеки оператор if задайте променлива на imread „im“под съответния, if израз със съответния брой нули (както е описано по -горе), последван от i.

Стъпка 11: Изрежете границите на изображението

Изрежете границите на изображението
Изрежете границите на изображението

Вземете оригиналното изображение и приложете imcrop филтър, за да премахнете черните рамки и присвоите на променлива I_crop. Правоъгълникът за изрязване се определя с помощта на матрица [95, 95, 500, 410].

Стъпка 12: Създайте изображение в сив мащаб

Създайте изображение в сив мащаб
Създайте изображение в сив мащаб

Вземете изрязаното изображение и приложете филтъра rbg2gray, за да промените изображението на сиво. Присвойте това изображение на променлива I2.

Стъпка 13: Създайте контрастно изображение

Създайте контрастно изображение
Създайте контрастно изображение

Вземете изображението I2 и използвайте настройка, за да преоразмерите стойностите на интензитета.

Вземете стойности, които попадат в диапазона [0.2, 0.7] и ги преоразмерете до [0, 1]. Гамата е настроена на 0.8, за да направи изображението по -ярко. Присвойте новото изображение на I_adjusted.

Стъпка 14: Подобрете контрастното изображение

Подобрете контрастното изображение
Подобрете контрастното изображение

Направете I_adjucted изображение и използвайте функцията adapthisteq, за да подобрите контраста.

Синтаксисът на Adapthisteq изисква името на изображението, I_adjusted, „numTiles“, размера на numTiles, „nBins“и броя на контейнерите. Размерът на numTiles е зададен на [8 8], разделяйки изображението на 8x8 плочки, а броят на контейнерите е зададен на 28. Задайте изображението на I_constrast.

Стъпка 15: Създайте среден филтър

Създайте среден филтър
Създайте среден филтър

Създайте променлива, наречена „meanfilt“, използвайки функцията fspecial. Въведете „средна функция“, за да създадете филтър за осредняване и вмъкнете [90 90] за размера на плъзгащия се прозорец.

Стъпка 16: Комбинирайте филтъра за усредняване с контрастиращото изображение

Комбинирайте филтъра за усредняване с контрастираното изображение
Комбинирайте филтъра за усредняване с контрастираното изображение

Създайте нова променлива с име mask_mean и използвайте функцията imfilter, за да вземете изображението I_contrast и да приложите предварително създадения филтър за средна стойност.

Стъпка 17: Направете нова средна маска чрез изваждане на пиксели

Направете нова средна маска чрез изваждане на пиксели
Направете нова средна маска чрез изваждане на пиксели

Създайте променлива с име mask_mean2 и използвайте функцията imsubtract, за да извадите стойността на всеки пиксел в I_contrast от съответния пиксел в mask_mean.

Стъпка 18: Създайте двоично филтрирано изображение

Създайте двоично филтрирано изображение
Създайте двоично филтрирано изображение

Превърнете изображенията в сиво в черно и бяло, като използвате imbinarize. Input mask_mean2, ‘adaptive’, ‘ForegroundPolarity’, ‘dark’, ‘Sensitivity’, 0.6. Задайте това ново изображение на mask_binarize.

Стъпка 19: Премахнете по -малки петна, намерени във филтрираните изображения

Премахнете по -малки петна, намерени във филтрираните изображения
Премахнете по -малки петна, намерени във филтрираните изображения

Премахнете обекти с възможност за свързване по -малко от 100 пиксела, като използвате функцията bwareaopen на mask_binarize и задайте праговата стойност на 100. Задайте променливата като bw.

Стъпка 20: Създайте елемент за структуриране на диска

Създайте елемент за структуриране на диска
Създайте елемент за структуриране на диска

Създайте елемент за структуриране на диск (с радиус 2), като използвате функцията strel. Задайте го на se.

Стъпка 21: Изпълнете морфологични операции за затваряне

Извършете морфологични операции за затваряне
Извършете морфологични операции за затваряне

Вземете bw и приложете функцията за затваряне към структурния елемент, за да извършите морфологична операция за затваряне на обекта.

Стъпка 22: Намерете обектите със свързаност поне 8

Намерете обектите с възможност за свързване най -малко 8
Намерете обектите с възможност за свързване най -малко 8

Вземете bw и използвайте bwconncomp, за да намерите обектите с свързаност поне 8 в изображението. Присвойте изхода за номер на cc_1.

Стъпка 23: Намерете максималния брой свързани пиксели

Намерете максималния брой свързани пиксели
Намерете максималния брой свързани пиксели
Намерете максималния брой свързани пиксели
Намерете максималния брой свързани пиксели

Използвайте функцията cellfun, за да изпълните функцията „numel“на всяка клетка в CC. Това намира броя на елементите в клетката PixelIdxList. Задайте стойност на „numPixels“.

Намерете максималните стойности в numPIxels. Задайте най -големия максимум на „най -голям“, а индексът на максималната стойност на „idx“.

Стъпка 24: Задайте максималните стойности на пикселите на 0 и намерете пиксели с> = 26 пикселна свързаност

Премахнете кръвоносните съдове в изображението
Премахнете кръвоносните съдове в изображението

= 26 Пикселна свързаност "src =" https://content.instructables.com/ORIG/FXY/DTW3/JEOIIEL4/FXYDTW3JEOIIEL4-p.webp

Фигура Дисплей
Фигура Дисплей

= 26 Пикселна свързаност "src =" https://content.instructables.com/ORIG/FXO/GBX1/JEOIIELB/FXOGBX1JEOIIELB-p.webp

Премахнете съдовете и пребройте кръвни петна
Премахнете съдовете и пребройте кръвни петна

= 26 Пикселна свързаност "src =" {{file.large_url | add: 'auto = webp & frame = 1 & height = 300' %} ">

Диагностицирайте образа на ретината въз основа на броя на идентифицираните кръвни съсиреци
Диагностицирайте образа на ретината въз основа на броя на идентифицираните кръвни съсиреци

= 26 Пикселна свързаност "src =" {{file.large_url | add: 'auto = webp & frame = 1 & height = 300' %} ">

Задайте пикселите с най -големите стойности в изображението „bw“на 0, като направите пикселите черни.

Намерете обектите със свързаност най -малко 26 пиксела в изображението с помощта на bwconncomp. Присвояване на променлива cc_1.

Стъпка 25: Премахнете кръвоносните съдове в изображението

Премахнете кръвоносните съдове, които все още присъстват на изображението, като използвате функцията bwpropfilt с диапазон [0, 0.9].

[0,9, 1] се изключва, защото стойности, близки до 1, показват линия. Присвояване на „RemoveVessels“.

Стъпка 26: Фигурален дисплей

Показване на всяко филтрирано изображение в подплот. Имшоу. с „гранични“и „стегнати“входове, показва всяко изображение в структура на подплота. Добавете заглавие към всяко изображение, за да различите кой филтър е използван.

Стъпка 27: Премахнете съдовете и пребройте кръвни петна

1. Вземете „RemoveVessels“и приложете функцията „Centroid“в regionprops, за да идентифицирате центроидите на обектите в изображението. Тези обекти трябва да съответстват на кръвни съсиреци, присъстващи на изображението.

2. Пребройте броя на идентифицираните кръвни съсиреци, като вземете дължината на центроидната матрица.

Стъпка 28: Диагностицирайте изображението на ретината въз основа на броя на идентифицираните кръвни съсиреци

Използвайте if, за да диагностицирате изображението въз основа на броя на идентифицираните кръвни съсиреци.

Ако броят на идентифицираните центроиди е по -малък или равен на 5, изображението се идентифицира като нормално.

Ако броят на центроидите е по -голям от 5, изображението е диагностицирано с диабетна ретинопатия.

Резултатът се отпечатва в командния прозорец с помощта на fprintf.

Стъпка 29: Ако има повече от 5 петна …

Ако има повече от 5 петна …
Ако има повече от 5 петна …

Повторете горните инструкции за диагностицирани изображения като изявление else. Тази част ще се изпълнява, ако броят на петна е по -голям от 5.

Прекратете оператора if.

Стъпка 30: Повторете процеса на филтриране за нормални изображения със стойности на цифрите на изображението като 2 и 3

Повторете процеса на филтриране за нормални изображения със стойности на цифрите на изображението като 2 и 3
Повторете процеса на филтриране за нормални изображения със стойности на цифрите на изображението като 2 и 3
Повторете процеса на филтриране за нормални изображения със стойности на цифрите на изображението като 2 и 3
Повторете процеса на филтриране за нормални изображения със стойности на цифрите на изображението като 2 и 3

Повторете процеса за остатъка от оригинала if, когато numel (броят на цифрите в номера на изображението) е равен на 2 и 3. Това завършва цикъла for за нормалните изображения.

Прекратете цикъла for.

Стъпка 31: Повторете целия процес за диагностицираните изображения

Повторете целия процес за диагностицираните изображения
Повторете целия процес за диагностицираните изображения

Повторете целия процес, като използвате диагностицираните изображения, изброени в матрицата „номера_до_екстрактирани_диагностицирани“.

Не забравяйте да преминете през всяка цифра (i) и да я промените на цифра (i+10), така че диагностицираните цифри да се появят като изображения 11 до 20.

Стъпка 32: Статистически анализ

Статистически анализ
Статистически анализ

1. „Actual_Diagnosis_Matrix“се използва за сравняване на резултатите с официалната диагноза, намерена във файла txt. Първите 10 нули показват, че първите 10 изображения трябва да са нормални. Последните 10 показват, че последните 10 изображения трябва да бъдат класифицирани като диабетна ретинопатия.

2. Двойният знак за равенство, използван за създаване на „number_correct“, създава логически масив чрез сравняване на стойността на съответните елементи на „Actual_Diagnosis_Matrix“с „Diagnosis_Matrix“, създаден от цикъла for.

За всеки елемент, който съответства на диагнозата, ще се добави 1, което означава, че кодът правилно е диагностицирал това изображение. Ако е неправилно, той ще добави 0 към матрицата.

След това, като се вземе сумата от това, се събират всички. С други думи, той намира сумата от правилно диагностицирани изображения.

3. „Final_percentage_correct“е изчисленият процент от това колко точно кодът е диагностицирал диабетна ретинопатия. Броят на правилно диагностицираните изображения се дели на 20 (общият брой снимки) и се умножава по 100, за да се намери процентът на успешните диагнози.

Стъпка 33: Намиране на интервал на доверие

Намиране на интервал на доверие
Намиране на интервал на доверие

1. Уверете се, че сте изтеглили ModWald.m, за да го извикате като функция. Без функцията ще трябва сами да изчислите доверителния интервал, като използвате модифицирания метод на Wald.

2. Функцията ModWald има 2 входа, където първият е броят на правилно идентифицираните изображения, а вторият е общото количество изображения.

3. Функцията ModWald ще изведе долната и горната граница на доверителния интервал на пропорциите за точността на извадените данни. С други думи, ще дадете интервал от проценти, където ще бъде истинският процент от точността на кода.

4. Използвайте fprintf по -долу, за да изведете статистическите данни и доверителния интервал в командния прозорец.

> fprintf ('%. 0f процента от изображенията на ретината са правилно диагностицирани според официалната диагноза. / n / n', Final_percentage_correct)

> fprintf ('Истинският процент, при който нашият код правилно ще диагностицира диабетна ретинопатия, ще / n попадне в диапазона от [%.3f, %.3f], въз основа на 20 извадени изображения / n', долна_граница, горна_граница)

Препоръчано: