فهرست مطالب:
- مرحله 1: پیش نیازها
- مرحله 2: پیش نیازها (con't)
- مرحله 3: پیش نیازها (con't)
- مرحله 4: پیش نیازها (con't)
- مرحله 5: Matlab را پاک کنید تا برای اجرای کد آماده شوید
- مرحله 6: 10 تصویر طبیعی چشم و 10 تصویر با علائم رتینوپاتی دیابتی را انتخاب کنید
- مرحله 7: 10 تصویر طبیعی چشم و 10 تصویر با علائم رتینوپاتی دیابتی (con't) انتخاب کنید
- مرحله 8: 2 متغیر (معمولی و تشخیص داده شده) ایجاد کنید و هر کدام را برابر 0 قرار دهید
- مرحله 9: یک Loop برای بارگذاری خودکار تصاویر معمولی ایجاد کنید
- مرحله 10: ایجاد یک حلقه برای بارگذاری خودکار تصاویر معمولی (con't)
- مرحله 11: مرزهای تصویر را برش دهید
- مرحله 12: ایجاد یک تصویر در مقیاس خاکستری
- مرحله 13: ایجاد یک تصویر متضاد
- مرحله 14: تصویر کنتراست را افزایش دهید
- مرحله 15: یک فیلتر متوسط ایجاد کنید
- مرحله 16: میانگین فیلتر را با تصویر کنتراست ترکیب کنید
- مرحله 17: با تفریق پیکسل ، یک ماسک متوسط جدید بسازید
- مرحله 18: ایجاد یک تصویر فیلتر شده دودویی
- مرحله 19: لکه های کوچکتر موجود در تصاویر فیلتر شده را حذف کنید
- مرحله 20: یک عنصر ساختار دیسک ایجاد کنید
- مرحله 21: عملیات بستن مورفولوژیکی را انجام دهید
- مرحله 22: اشیاء با قابلیت اتصال حداقل 8 را پیدا کنید
- مرحله 23: حداکثر تعداد پیکسل های متصل را پیدا کنید
- مرحله 24: حداکثر مقادیر پیکسل را روی 0 تنظیم کرده و پیکسل ها را با> = 26 پیکسل اتصال پیدا کنید
- مرحله 25: رگهای خونی را در تصویر حذف کنید
- مرحله 26: نمایش تصویر
- مرحله 27: رگ ها را بردارید و لکه های خون را شمارش کنید
- مرحله 28: تشخیص تصویر شبکیه بر اساس تعداد لخته های خون شناسایی شده
- مرحله 29: اگر بیش از 5 حباب وجود دارد…
- مرحله 30: فرایند فیلترینگ را برای تصاویر معمولی با مقادیر رقم تصویر 2 و 3 تکرار کنید
- مرحله 31: کل مراحل را برای تصاویر تشخیص داده شده تکرار کنید
- مرحله 32: تجزیه و تحلیل آماری
- مرحله 33: پیدا کردن فاصله اطمینان
تصویری: تشخیص خودکار رتینوپاتی دیابتی از طریق متلب: 33 مرحله
2024 نویسنده: John Day | [email protected]. آخرین اصلاح شده: 2024-01-30 08:57
(طرح کلی کد را در بالا ببینید)
رتینوپاتی دیابتی یک بیماری چشمی مرتبط با دیابت است که به دلیل بالا بودن سطح قند خون ایجاد می شود. سطح بالای قند خون باعث تورم رگ های خونی در شبکیه می شود که منجر به بزرگ شدن رگ های خونی و حتی نشت عروق می شود که منجر به ایجاد لکه های تیره در تصاویر شبکیه می شود. با استفاده از این کد ، هدف ما استفاده از ظاهر نقاط نشت عروق خونی به عنوان شاخصی از رتینوپاتی دیابتی پس زمینه است ، اگرچه در دنیای واقعی تکنیک های تشخیص بیشتری مورد نیاز است. هدف از این کد ، پردازش خودکار تصویر و تشخیص تصاویر شبکیه برای شناسایی علائم شبکیه چشم دیابتی است که از طریق نقاط تیره در تصاویر شبکیه نشان داده می شود.
10 تصویر طبیعی شبکیه و 10 تصویر تشخیص داده شده شبکیه از طریق کدی که ابتدا تصاویر را می خواند و فیلتر می کند و سپس نقاط تیره را تعیین می کند تا مشخص شود که آیا علائم شبکیه چشم دیابتی بر اساس یک آستانه مشخص وجود دارد یا خیر. سپس نتایج برای تفسیر بیننده روی پنجره فرمان چاپ می شود.
مرحله 1: پیش نیازها
1. مطمئن شوید که برنامه MATLAB را در رایانه خود بارگیری کرده اید.
2. فایل txt موجود در پیوند را بارگیری کنید. (برای ذخیره در همان فهرست با کد MATLAB ، "ctrl+s" را فشار دهید)
مرحله 2: پیش نیازها (con't)
4- MATLAB را باز کرده و در پنجره فرمان ‘uiimport’ را تایپ کنید.
5. فایل officialdiagnoses.txt را انتخاب کرده و آن را به عنوان ماتریس سلولی در MATLAB وارد کنید.
6. اطمینان حاصل کنید که "officialdiagnoses" را به عنوان متغیری در محیط کار می بینید.
مرحله 3: پیش نیازها (con't)
7. تابع ModWald.m را بارگیری کنید ، که می تواند از کد بالا بدست آورد یا آن را از Canvas بارگیری کند.
(کد ارائه شده توسط پروفسور کینگ و پروفسور چوی)
مرحله 4: پیش نیازها (con't)
8. 400 تصویر خام را از بخش داده های پروژه STARE بارگیری کنید.
مرحله 5: Matlab را پاک کنید تا برای اجرای کد آماده شوید
افزودن به کد:
1. بستن همه (بستن تمام تصاویر قبلاً باز شده)
2. clearvars - به غیر از officialdiagnoses (همه متغیرها را پاک می کند به جز فایلهای تشخیص رسمی txt که قبلاً وارد شده بود)
3. cclc (پنجره فرمان را پاک می کند)
مرحله 6: 10 تصویر طبیعی چشم و 10 تصویر با علائم رتینوپاتی دیابتی را انتخاب کنید
1. فایل متنی تشخیص را گرفته و نام تصاویر را استخراج کنید. این اسامی در ستون اول فایل متنی وجود دارد ، بنابراین برای استخراج آنها عبارت 'officialdiagnoses (:، 1)' را تایپ کنید. ماتریس نام تصویر به یک متغیر "all_image_numbers" اختصاص داده شد
2. متغیر all_image_numbers را با استفاده از تابع cell2mat از آرایه سلول به آرایه ماتریسی تبدیل کنید.
مرحله 7: 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 قرار دهید
این متغیرها را قبل از حلقه for ایجاد کنید تا اعداد حلقه را مقداردهی کنید.
مرحله 9: یک Loop برای بارگذاری خودکار تصاویر معمولی ایجاد کنید
1. یک حلقه for ایجاد کنید
2. یک متغیر شمارش (i ، در این مورد) را روی ماتریسی از مقادیر 1-10 تنظیم کنید. این متغیر شمارش برای فراخوانی هر تصویر به صورت جداگانه استفاده می شود
3. عنصر i را در ماتریس تصاویر بگیرید تا نام تصویر را از یک رشته به یک عدد با استفاده از تابع num2str استخراج و تبدیل کنید.
با استفاده از تابع numel تعداد ارقام موجود در نام تصویر را بیابید. این مقدار را به یک متغیر ، digit_normal اختصاص دهید. این عدد باید برای اعداد تک رقمی 1 ، برای اعداد دو رقمی و 3 برای اعداد سه رقمی باشد. این اطلاعات برای تماس خودکار تصاویر استفاده می شود.
مرحله 10: ایجاد یک حلقه برای بارگذاری خودکار تصاویر معمولی (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 را پیدا کنید
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 باشد این قسمت اجرا می شود.
دستور if را پایان دهید
مرحله 30: فرایند فیلترینگ را برای تصاویر معمولی با مقادیر رقم تصویر 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] قرار می گیرد)
توصیه شده:
کشیدن و نمایش داده ها از طریق هر وب سایت از طریق Wifi (نشانگر نورهای شمالی) با NodeMcu: 6 مرحله
کشیدن و نمایش داده ها از هر وب سایتی با استفاده از Wifi (نشانگر نورهای شمالی) با NodeMcu: انگیزه من: من بسیاری از دستورالعمل های مربوط به راه اندازی/ استفاده از NodeMCU (ساخته شده بر روی ماژول ESP8266) برای ساخت پروژه های اینترنت اشیا (اینترنت اشیا) را مشاهده کرده ام. به با این حال ، تعداد کمی از این آموزشها دارای تمام جزئیات/ کد/ نمودارها برای افراد مبتدی بودند
تشخیص چهره ، آموزش و تشخیص Opencv: 3 مرحله
تشخیص چهره ، آموزش و تشخیص Opencv: OpenCV یک کتابخانه بینایی رایانه منبع باز است که برای انجام کارهای اصلی پردازش تصویر مانند تار شدن ، ترکیب تصویر ، افزایش تصویر و همچنین کیفیت فیلم ، آستانه و غیره بسیار محبوب است. علاوه بر پردازش تصویر ، اثبات می کند
تشخیص و تشخیص چهره - Arduino Face ID با استفاده از OpenCV Python و Arduino .: 6 مرحله
تشخیص و تشخیص چهره | شناسه صورت آردوینو با استفاده از OpenCV پایتون و آردوینو.: تشخیص چهره AK ID چهره یکی از مهمترین ویژگی های تلفن های همراه امروزه است. بنابراین ، من یک سوال داشتم & quot؛ آیا می توانم برای پروژه آردوینو خود شناسه چهره داشته باشم & quot؛ و پاسخ بله است … سفر من به شرح زیر آغاز شد: مرحله 1: دسترسی به ما
پردازش ساده Uldar (تشخیص و تشخیص اولتراسونیک): 3 مرحله
پردازش ساده Uldar (تشخیص و رتبه بندی اولتراسونیک): این یک پروژه ساده است که از Arduino UNO و Processing برای ایجاد یک لیدار ساده استفاده می کند. Lidar (همچنین LIDAR ، LiDAR و LADAR نیز نامیده می شود) یک روش نقشه برداری است که با روشن کردن فاصله تا یک هدف را اندازه گیری می کند. هدف با نور لیزری پالس و اندازه گیری
تشخیص چهره+تشخیص: 8 مرحله (همراه با تصاویر)
تشخیص چهره+تشخیص: این یک مثال ساده از اجرای تشخیص و تشخیص چهره با OpenCV از دوربین است. توجه: من این پروژه را برای مسابقه سنسور ساختم و از دوربین به عنوان سنسور برای ردیابی و شناسایی چهره ها استفاده کردم. بنابراین ، هدف ما در این جلسه ، 1. Anaconda را نصب کنید