فهرست مطالب:

تشخیص خودکار رتینوپاتی دیابتی از طریق متلب: 33 مرحله
تشخیص خودکار رتینوپاتی دیابتی از طریق متلب: 33 مرحله

تصویری: تشخیص خودکار رتینوپاتی دیابتی از طریق متلب: 33 مرحله

تصویری: تشخیص خودکار رتینوپاتی دیابتی از طریق متلب: 33 مرحله
تصویری: آموزش نگارش سمینار، پایان نامه و ارائه - ویژه پردازش تصویر و بینایی کامپیوتر 2024, دسامبر
Anonim
تشخیص خودکار رتینوپاتی دیابتی از طریق MATLAB
تشخیص خودکار رتینوپاتی دیابتی از طریق MATLAB
تشخیص خودکار رتینوپاتی دیابتی از طریق MATLAB
تشخیص خودکار رتینوپاتی دیابتی از طریق MATLAB

(طرح کلی کد را در بالا ببینید)

رتینوپاتی دیابتی یک بیماری چشمی مرتبط با دیابت است که به دلیل بالا بودن سطح قند خون ایجاد می شود. سطح بالای قند خون باعث تورم رگ های خونی در شبکیه می شود که منجر به بزرگ شدن رگ های خونی و حتی نشت عروق می شود که منجر به ایجاد لکه های تیره در تصاویر شبکیه می شود. با استفاده از این کد ، هدف ما استفاده از ظاهر نقاط نشت عروق خونی به عنوان شاخصی از رتینوپاتی دیابتی پس زمینه است ، اگرچه در دنیای واقعی تکنیک های تشخیص بیشتری مورد نیاز است. هدف از این کد ، پردازش خودکار تصویر و تشخیص تصاویر شبکیه برای شناسایی علائم شبکیه چشم دیابتی است که از طریق نقاط تیره در تصاویر شبکیه نشان داده می شود.

10 تصویر طبیعی شبکیه و 10 تصویر تشخیص داده شده شبکیه از طریق کدی که ابتدا تصاویر را می خواند و فیلتر می کند و سپس نقاط تیره را تعیین می کند تا مشخص شود که آیا علائم شبکیه چشم دیابتی بر اساس یک آستانه مشخص وجود دارد یا خیر. سپس نتایج برای تفسیر بیننده روی پنجره فرمان چاپ می شود.

مرحله 1: پیش نیازها

پیش نیازها
پیش نیازها

1. مطمئن شوید که برنامه MATLAB را در رایانه خود بارگیری کرده اید.

2. فایل txt موجود در پیوند را بارگیری کنید. (برای ذخیره در همان فهرست با کد MATLAB ، "ctrl+s" را فشار دهید)

مرحله 2: پیش نیازها (con't)

پیش نیازها (con't)
پیش نیازها (con't)
پیش نیازها (con't)
پیش نیازها (con't)

4- MATLAB را باز کرده و در پنجره فرمان ‘uiimport’ را تایپ کنید.

5. فایل officialdiagnoses.txt را انتخاب کرده و آن را به عنوان ماتریس سلولی در MATLAB وارد کنید.

6. اطمینان حاصل کنید که "officialdiagnoses" را به عنوان متغیری در محیط کار می بینید.

مرحله 3: پیش نیازها (con't)

پیش نیازها (con't)
پیش نیازها (con't)

7. تابع ModWald.m را بارگیری کنید ، که می تواند از کد بالا بدست آورد یا آن را از Canvas بارگیری کند.

(کد ارائه شده توسط پروفسور کینگ و پروفسور چوی)

مرحله 4: پیش نیازها (con't)

پیش نیازها (con't)
پیش نیازها (con't)

8. 400 تصویر خام را از بخش داده های پروژه STARE بارگیری کنید.

مرحله 5: Matlab را پاک کنید تا برای اجرای کد آماده شوید

پاک کردن Matlab برای آماده شدن برای اجرای کد
پاک کردن Matlab برای آماده شدن برای اجرای کد

افزودن به کد:

1. بستن همه (بستن تمام تصاویر قبلاً باز شده)

2. clearvars - به غیر از officialdiagnoses (همه متغیرها را پاک می کند به جز فایلهای تشخیص رسمی 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 تصویر با علائم رتینوپاتی دیابتی (con't) انتخاب کنید

10 تصویر عادی چشم و 10 تصویر با علائم رتینوپاتی دیابتی را انتخاب کنید (con't)
10 تصویر عادی چشم و 10 تصویر با علائم رتینوپاتی دیابتی را انتخاب کنید (con't)
10 تصویر طبیعی چشم و 10 تصویر با علائم رتینوپاتی دیابتی را انتخاب کنید (con't)
10 تصویر طبیعی چشم و 10 تصویر با علائم رتینوپاتی دیابتی را انتخاب کنید (con't)

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: یک Loop برای بارگذاری خودکار تصاویر معمولی ایجاد کنید

برای بارگذاری خودکار تصاویر معمولی یک حلقه for ایجاد کنید
برای بارگذاری خودکار تصاویر معمولی یک حلقه for ایجاد کنید

1. یک حلقه for ایجاد کنید

2. یک متغیر شمارش (i ، در این مورد) را روی ماتریسی از مقادیر 1-10 تنظیم کنید. این متغیر شمارش برای فراخوانی هر تصویر به صورت جداگانه استفاده می شود

3. عنصر i را در ماتریس تصاویر بگیرید تا نام تصویر را از یک رشته به یک عدد با استفاده از تابع num2str استخراج و تبدیل کنید.

با استفاده از تابع numel تعداد ارقام موجود در نام تصویر را بیابید. این مقدار را به یک متغیر ، digit_normal اختصاص دهید. این عدد باید برای اعداد تک رقمی 1 ، برای اعداد دو رقمی و 3 برای اعداد سه رقمی باشد. این اطلاعات برای تماس خودکار تصاویر استفاده می شود.

مرحله 10: ایجاد یک حلقه برای بارگذاری خودکار تصاویر معمولی (con't)

ایجاد یک حلقه برای بارگذاری خودکار تصاویر معمولی (con't)
ایجاد یک حلقه برای بارگذاری خودکار تصاویر معمولی (con't)

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 را بگیرید و از imadjust برای تجدید قواعد شدت استفاده کنید.

مقادیری را که در محدوده [0.2 ، 0.7] قرار دارند گرفته و مجدداً به [0 ، 1] برسانید. گاما روی 0.8 تنظیم شده است تا تصویر روشن تر شود. تصویر جدید را به I_adjusted اختصاص دهید.

مرحله 14: تصویر کنتراست را افزایش دهید

تصویر کنتراست را افزایش دهید
تصویر کنتراست را افزایش دهید

تصویر I_adjusted را بگیرید و از عملکرد adapthisteq برای افزایش کنتراست استفاده کنید.

نحو Adapthisteq نیاز به نام تصویر ، I_adjusted ، ‘numTiles’ ، اندازه numTiles ، ‘nBins’ و تعداد سطل دارد. اندازه numTiles روی [8 8] تنظیم شده است ، تصویر را به کاشی 8x8 تقسیم کرده و تعداد سطل ها روی 28 تنظیم شده است. تصویر را به I_constrast اختصاص دهید.

مرحله 15: یک فیلتر متوسط ایجاد کنید

ایجاد یک فیلتر متوسط
ایجاد یک فیلتر متوسط

با استفاده از تابع fspecial متغیری به نام 'meanfilt' ایجاد کنید. برای ایجاد فیلتر میانگین ، "عملکرد متوسط" را وارد کرده و برای اندازه پنجره کشویی [90 90] را وارد کنید.

مرحله 16: میانگین فیلتر را با تصویر کنتراست ترکیب کنید

میانگین فیلتر را با تصویر کنتراست ترکیب کنید
میانگین فیلتر را با تصویر کنتراست ترکیب کنید

یک متغیر جدید با نام mask_mean ایجاد کنید و از تابع imfilter برای گرفتن تصویر I_contrast و اعمال فیلتر میانگین قبلی استفاده کنید.

مرحله 17: با تفریق پیکسل ، یک ماسک متوسط جدید بسازید

با تفریق پیکسل ، یک ماسک متوسط جدید بسازید
با تفریق پیکسل ، یک ماسک متوسط جدید بسازید

متغیری با نام mask_mean2 ایجاد کنید و با استفاده از تابع imsubtract مقدار هر پیکسل در I_contrast را از پیکسل مربوطه در mask_mean کم کنید.

مرحله 18: ایجاد یک تصویر فیلتر شده دودویی

ایجاد یک تصویر فیلتر شده دودویی
ایجاد یک تصویر فیلتر شده دودویی

تصاویر مقیاس خاکستری را با استفاده از imbinarize به سیاه و سفید تبدیل کنید. mask input_mean2 ، ‘adaptive’ ، ‘ForegroundPolarity’ ، ‘dark’ ، ‘حساسیت’ ، 0.6. این تصویر جدید را به mask_binarize اختصاص دهید.

مرحله 19: لکه های کوچکتر موجود در تصاویر فیلتر شده را حذف کنید

لکه های کوچکتر موجود در تصاویر فیلتر شده را حذف کنید
لکه های کوچکتر موجود در تصاویر فیلتر شده را حذف کنید

اشیاء با قابلیت اتصال کمتر از 100 پیکسل را با استفاده از عملکرد bwareaopen در mask_binarize حذف کرده و مقدار آستانه را روی 100 تنظیم کنید. متغیر را به عنوان bw تعیین کنید.

مرحله 20: یک عنصر ساختار دیسک ایجاد کنید

ایجاد یک عنصر ساختار دیسک
ایجاد یک عنصر ساختار دیسک

یک عنصر ساختار دیسک (با شعاع 2) با استفاده از تابع strel ایجاد کنید. آن را به Se اختصاص دهید.

مرحله 21: عملیات بستن مورفولوژیکی را انجام دهید

انجام عملیات بستن مورفولوژیکی
انجام عملیات بستن مورفولوژیکی

bw را بردارید و تابع imclose را روی عنصر ساختاری اعمال کنید تا عملیات نزدیک مورفولوژیکی روی شی انجام شود.

مرحله 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 تنظیم کنید و پیکسل ها را سیاه کنید.

با استفاده از bwconncomp اشیاء با اتصال حداقل 26 پیکسل را در تصویر پیدا کنید. به متغیر cc_1 اختصاص دهید.

مرحله 25: رگهای خونی را در تصویر حذف کنید

با استفاده از تابع bwpropfilt با محدوده [0 ، 0.9] رگ های خونی را که هنوز در تصویر وجود دارد حذف کنید.

[0.9 ، 1] حذف می شود زیرا مقادیر نزدیک به 1 خط را نشان می دهد. به "RemoveVessels" اختصاص دهید.

مرحله 26: نمایش تصویر

نمایش هر تصویر فیلتر شده در یک فرعی فرعی. نشان دادن با ورودی های "border" و "tight" ، هر تصویر را در یک ساختار فرعی نمایش می دهد. یک عنوان به هر تصویر اضافه کنید تا تشخیص دهید کدام فیلتر استفاده شده است.

مرحله 27: رگ ها را بردارید و لکه های خون را شمارش کنید

1. "RemoveVessels" را بردارید و ویژگی "Centroid" را در regionprops برای شناسایی سانتریوئیدهای اشیاء موجود در تصویر اعمال کنید. این اجسام باید با لخته های خونی موجود در تصویر مطابقت داشته باشند.

2. تعداد لخته های خونی را که با در نظر گرفتن طول ماتریس سانتروئید مشخص شده است بشمارید.

مرحله 28: تشخیص تصویر شبکیه بر اساس تعداد لخته های خون شناسایی شده

از عبارات if برای تشخیص تصویر بر اساس تعداد لخته های خون شناسایی شده استفاده کنید.

اگر تعداد سانتروئیدهای شناسایی شده کمتر یا مساوی 5 باشد ، تصویر عادی شناخته می شود.

اگر تعداد سانتروئیدها بیشتر از 5 باشد ، تصویر با رتینوپاتی دیابتی تشخیص داده می شود.

نتیجه با استفاده از fprintf روی پنجره فرمان چاپ می شود.

مرحله 29: اگر بیش از 5 حباب وجود دارد…

در صورت وجود بیش از 5 حباب…
در صورت وجود بیش از 5 حباب…

دستورات بالا را برای تصاویر تشخیص داده شده به عنوان یک عبارت دیگر تکرار کنید. اگر تعداد حباب ها بیشتر از 5 باشد این قسمت اجرا می شود.

دستور if را پایان دهید

مرحله 30: فرایند فیلترینگ را برای تصاویر معمولی با مقادیر رقم تصویر 2 و 3 تکرار کنید

فرایند فیلترینگ را برای تصاویر معمولی با مقادیر رقم تصویر 2 و 3 تکرار کنید
فرایند فیلترینگ را برای تصاویر معمولی با مقادیر رقم تصویر 2 و 3 تکرار کنید
فرایند فیلترینگ را برای تصاویر معمولی با مقادیر رقم تصویر 2 و 3 تکرار کنید
فرایند فیلترینگ را برای تصاویر معمولی با مقادیر رقم تصویر 2 و 3 تکرار کنید

فرآیند را برای بقیه اصول if در صورت numel (تعداد ارقام در شماره تصویر) برابر 2 و 3 تکرار کنید. این حلقه for برای تصاویر معمولی را کامل می کند.

حلقه for را خاتمه دهید.

مرحله 31: کل مراحل را برای تصاویر تشخیص داده شده تکرار کنید

کل مراحل را برای تصاویر تشخیص داده شده تکرار کنید
کل مراحل را برای تصاویر تشخیص داده شده تکرار کنید

کل مراحل را با استفاده از تصاویر تشخیص داده شده توسط ماتریس "number_to_extract_diagnosed" تکرار کنید.

اطمینان حاصل کنید که از هر شکل (i) عبور کرده و آن را به شکل (i+10) تغییر دهید تا ارقام تشخیص داده شده به عنوان تصاویر 11 تا 20 ظاهر شوند.

مرحله 32: تجزیه و تحلیل آماری

تحلیل آماری
تحلیل آماری

1. 'Actual_Diagnosis_Matrix' برای مقایسه نتایج با تشخیص رسمی موجود در فایل txt استفاده می شود. 10 صفر اول نشان می دهد که 10 تصویر اول باید عادی باشند. 10 تصویر آخر نشان می دهد که 10 تصویر آخر باید به عنوان رتینوپاتی دیابتی طبقه بندی شوند.

2. علامت برابر دوگانه که برای ایجاد 'number_crect' استفاده می شود ، با مقایسه مقدار عناصر متناظر 'Actual_Diagnosis_Matrix' با 'Diagnosis_Matrix' ایجاد شده از حلقه for ، یک آرایه منطقی ایجاد می کند.

برای هر عنصری که با تشخیص مطابقت دارد 1 اضافه می شود ، به این معنی که کد آن تصویر را به درستی تشخیص داده است. اگر نادرست باشد یک عدد 0 به ماتریس اضافه می کند.

سپس ، با گرفتن مجموع آن ، همه آنها جمع می شود. به عبارت دیگر ، مجموع تصاویر تشخیص داده شده صحیح را پیدا می کند.

3. "Final_percentage_crectrect" درصد محاسبه شده ای است که نشان می دهد کد چگونه رتینوپاتی دیابتی را دقیق تشخیص می دهد. تعداد تصاویری که به درستی تشخیص داده شده است بر 20 (تعداد کل تصاویر) تقسیم شده و در 100 ضرب می شود تا درصد تشخیص های موفق به دست آید.

مرحله 33: پیدا کردن فاصله اطمینان

پیدا کردن فاصله اطمینان
پیدا کردن فاصله اطمینان

1. مطمئن شوید ModWald.m را بارگیری کرده اید تا به عنوان یک تابع فراخوانی شود. بدون تابع ، شما باید فاصله اطمینان را با استفاده از روش والد اصلاح شده خودتان محاسبه کنید.

2. تابع ModWald دارای 2 ورودی است که اولین آنها تعداد تصاویر به درستی شناسایی شده ، و دوم مقدار کلی تصاویر است.

3. تابع ModWald برای اطمینان از داده های نمونه ، محدوده های پایینی و فوقانی فاصله اطمینان نسبت ها را نشان می دهد. به عبارت دیگر ، درصدی از درصد را به شما می دهد که درصد واقعی دقت کد در آن نهفته است.

4. از fprintf زیر برای خروج آمار و فاصله اطمینان روی پنجره فرمان استفاده کنید.

> fprintf ('٪. 0f درصد از تصاویر شبکیه بر اساس تشخیص رسمی به درستی تشخیص داده شد. / n / n' ، Final_percentage_correct)

> fprintf ('درصد واقعی که در آن کد ما شبکیه دیابتی را به درستی تشخیص می دهد / n ، بر اساس 20 تصویر نمونه برداری شده / n' ، / n '، پایینتر ، پایین_بالا ، در محدوده [٪.3f ،٪.3f] قرار می گیرد)

توصیه شده: