جدول المحتويات:

التشخيص الآلي لاعتلال الشبكية السكري عن طريق MATLAB: 33 خطوة
التشخيص الآلي لاعتلال الشبكية السكري عن طريق MATLAB: 33 خطوة

فيديو: التشخيص الآلي لاعتلال الشبكية السكري عن طريق MATLAB: 33 خطوة

فيديو: التشخيص الآلي لاعتلال الشبكية السكري عن طريق MATLAB: 33 خطوة
فيديو: Python in Arabic #81 Parkinson Detection اكتشاف مرض باركنسون 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. تأكد من رؤية "التشخيصات الرسمية" كمتغير في مساحة العمل.

الخطوة 3: المتطلبات الأساسية (لا)

المتطلبات الأساسية (لا)
المتطلبات الأساسية (لا)

7. قم بتنزيل الوظيفة ModWald.m ، والتي يمكن الحصول عليها من الكود أعلاه أو تنزيلها من Canvas.

(رمز قدمه البروفيسور كنغ والبروفيسور تشوي)

الخطوة 4: المتطلبات الأساسية (لا)

المتطلبات الأساسية (لا)
المتطلبات الأساسية (لا)

8. قم بتنزيل 400 صورة أولية من قسم البيانات في مشروع STARE.

الخطوة 5: تنظيف ماتلاب للتحضير لتشغيل كود

تنظيف ماتلاب للتحضير لتشغيل كود
تنظيف ماتلاب للتحضير لتشغيل كود

أضف إلى الكود:

1. أغلق الكل (لإغلاق جميع الصور المفتوحة سابقًا)

2. clearvars - باستثناء التشخيصات الرسمية (يمسح جميع المتغيرات باستثناء ملف التشخيص الرسمي الذي تم استيراده مسبقًا)

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: قم بإنشاء متغيرين (عادي ومشخص) وقم بتعيين كل منهما يساوي 0

قم بإنشاء متغيرين (عادي ومشخص) وقم بتعيين كل منهما يساوي 0
قم بإنشاء متغيرين (عادي ومشخص) وقم بتعيين كل منهما يساوي 0

قم بإنشاء هذه المتغيرات قبل الحلقة for لتهيئة أرقام الحلقة.

الخطوة 9: إنشاء حلقة من أجل تحميل الصور العادية تلقائيًا

قم بإنشاء حلقة من أجل تحميل الصور العادية تلقائيًا
قم بإنشاء حلقة من أجل تحميل الصور العادية تلقائيًا

1. قم بإنشاء حلقة for

2. اضبط متغير العد (i ، في هذه الحالة) على مصفوفة من القيم 1-10. سيتم استخدام متغير العد هذا لاستدعاء كل صورة على حدة

3. خذ العنصر i في مصفوفة الصور لاستخراج وتحويل اسم الصورة من سلسلة إلى رقم باستخدام وظيفة num2str.

ابحث عن عدد الأرقام الموجودة في اسم الصورة باستخدام وظيفة numel. قم بتعيين هذه القيمة إلى متغير ، digits_normal. يجب أن يكون هذا الرقم 1 للأرقام المكونة من رقم واحد ، و 2 للأرقام المكونة من رقمين ، و 3 للأرقام المكونة من ثلاثة أرقام. سيتم استخدام هذه المعلومات لاستدعاء الصور تلقائيًا.

الخطوة 10: إنشاء حلقة من أجل تحميل الصور العادية تلقائيًا (لا)

قم بإنشاء حلقة من أجل تحميل الصور العادية تلقائيًا (لا)
قم بإنشاء حلقة من أجل تحميل الصور العادية تلقائيًا (لا)

3. قم بإنشاء عبارة if تحتوي على جميع الاحتمالات الثلاثة من الخطوات السابقة. إذا كان اسم الصورة مكونًا من رقم واحد ، فسيتم استدعاء الصورة كـ "im000" ، وإذا كانت تحتوي على رقمين ، فسيتم تسمية الصورة باسم "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: إنشاء مرشح متوسط

قم بإنشاء عامل تصفية متوسط
قم بإنشاء عامل تصفية متوسط

قم بإنشاء متغير يسمى "meanfilt" باستخدام الدالة fspecial. أدخل "متوسط الوظيفة" لإنشاء مرشح متوسط وأدخل [90 90] لحجم النافذة المنزلقة.

الخطوة 16: ادمج مرشح المعدل مع الصورة المتباينة

ادمج مرشح المعدل مع الصورة المتباينة
ادمج مرشح المعدل مع الصورة المتباينة

أنشئ متغيرًا جديدًا باسم mask_mean واستخدم وظيفة imfilter لالتقاط صورة I_contrast ولتطبيق عامل التصفية المتوسط الذي تم إنشاؤه مسبقًا.

الخطوة 17: اصنع قناعًا متوسطًا جديدًا عن طريق طرح وحدات البكسل

اصنع قناعًا متوسطًا جديدًا عن طريق طرح وحدات البكسل
اصنع قناعًا متوسطًا جديدًا عن طريق طرح وحدات البكسل

قم بإنشاء متغير باسم mask_mean2 واستخدم الدالة imsubtract لطرح قيمة كل بكسل في I_contrast من البكسل المقابل في mask_mean.

الخطوة 18: قم بإنشاء صورة مصفاة ثنائية

قم بإنشاء صورة ثنائية مفلترة
قم بإنشاء صورة ثنائية مفلترة

تحويل الصور ذات التدرج الرمادي إلى أبيض وأسود باستخدام imbinarize. إدخال Mask_mean2 ، "تكيفي" ، "مقدمة قطبية" ، "مظلم" ، "حساسية" ، 0.6. قم بتعيين هذه الصورة الجديدة إلى mask_binarize.

الخطوة 19: إزالة النقط الصغيرة الموجودة في الصور التي تمت تصفيتها

إزالة النقط الصغيرة الموجودة في الصور التي تمت تصفيتها
إزالة النقط الصغيرة الموجودة في الصور التي تمت تصفيتها

قم بإزالة الكائنات ذات التوصيلية الأقل من 100 بكسل باستخدام وظيفة bwareaopen الموجودة على mask_binarize وقم بتعيين قيمة الحد على 100. قم بتعيين المتغير كـ bw.

الخطوة 20: إنشاء عنصر هيكلة القرص

قم بإنشاء عنصر هيكلة القرص
قم بإنشاء عنصر هيكلة القرص

قم بإنشاء عنصر هيكلة قرص (بنصف قطر 2) باستخدام وظيفة strel. قم بتعيينه على حد ذاته.

الخطوة 21: إجراء عمليات إغلاق صرفية

تنفيذ عمليات الإغلاق الصرفي
تنفيذ عمليات الإغلاق الصرفي

خذ وزن الجسم وقم بتطبيق وظيفة imclose على العنصر الهيكلي لإجراء عملية صرفية قريبة على الكائن.

الخطوة 22: ابحث عن الكائنات التي لها اتصال على الأقل 8

ابحث عن الكائنات التي لها اتصال على الأقل 8
ابحث عن الكائنات التي لها اتصال على الأقل 8

خذ bw واستخدم bwconncomp للعثور على كائنات ذات اتصال 8 على الأقل في الصورة. قم بتعيين إخراج الرقم إلى cc_1.

الخطوة 23: ابحث عن الحد الأقصى لعدد وحدات البكسل المتصلة

ابحث عن الحد الأقصى لعدد وحدات البكسل المتصلة
ابحث عن الحد الأقصى لعدد وحدات البكسل المتصلة
ابحث عن الحد الأقصى لعدد وحدات البكسل المتصلة
ابحث عن الحد الأقصى لعدد وحدات البكسل المتصلة

استخدم وظيفة cellfun لأداء وظيفة "numel" على كل خلية في CC. يبحث هذا عن عدد العناصر في خلية PixelIdxList. قم بتعيين قيمة إلى "numPixels".

أوجد القيم القصوى في numPIxels. قم بتعيين الحد الأقصى الأكبر إلى "الأكبر" ومؤشر القيمة القصوى إلى "idx".

الخطوة 24: اضبط Max Pixel Values على 0 وابحث عن Pixels With> = 26 Pixel Connectivity

إزالة الأوعية الدموية الموجودة في الصورة
إزالة الأوعية الدموية الموجودة في الصورة

= اتصال 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: عرض الشكل

اعرض كل صورة تمت تصفيتها في مخطط فرعي. Imshow. مع مدخلات "حد" و "ضيقة" ، يعرض كل صورة في هيكل مخطط فرعي. أضف عنوانًا لكل صورة لتمييز المرشح الذي تم استخدامه.

الخطوة 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 صور إلى أنه يجب تصنيف الصور العشر الأخيرة على أنها اعتلال الشبكية السكري.

2. تُنشئ علامة المساواة المزدوجة المستخدمة لإنشاء "number_correct" مصفوفة منطقية عن طريق مقارنة قيمة العناصر المقابلة لـ "Actual_Diagnosis_Matrix" بـ "Diagnosis_Matrix" التي تم إنشاؤها من حلقة for.

لكل عنصر يطابق التشخيص ، ستتم إضافة 1 ، مما يعني أن الكود قام بتشخيص تلك الصورة بشكل صحيح. إذا كانت غير صحيحة ستضيف 0 إلى المصفوفة.

ثم ، أخذ مجموع ذلك يجمع كل الآحاد. بمعنى آخر ، فإنه يجد مجموع الصور التي تم تشخيصها بشكل صحيح.

3. "Final_percentage_correct" هو النسبة المئوية المحسوبة لمدى دقة كود تشخيص اعتلال الشبكية السكري. يتم تقسيم عدد الصور التي تم تشخيصها بشكل صحيح على 20 (العدد الإجمالي للصور) وضربها في 100 لمعرفة النسبة المئوية للتشخيصات الناجحة.

الخطوة 33: البحث عن فترة الثقة

فترة البحث عن الثقة
فترة البحث عن الثقة

1. تأكد من تنزيل ModWald.m لاستدعائها كوظيفة. بدون الوظيفة ، سيكون عليك حساب فاصل الثقة باستخدام طريقة والد المعدلة بنفسك.

2. تحتوي وظيفة ModWald على مدخلين حيث يكون الأول هو عدد الصور المحددة بشكل صحيح ، والثاني هو الحجم الإجمالي للصور.

3. ستخرج وظيفة ModWald الحدود الدنيا والعليا لفاصل الثقة للنسب من أجل دقة البيانات المأخوذة من العينات. بمعنى آخر ، ستعطي فاصلاً من النسب المئوية حيث تكمن النسبة المئوية الحقيقية لدقة الكود.

4. استخدم fprintf أدناه لإخراج الإحصائيات وفاصل الثقة في نافذة الأوامر.

> fprintf ('٪. 0f بالمائة من صور شبكية العين تم تشخيصها بشكل صحيح وفقًا للتشخيص الرسمي. / n / n'، Final_percentage_correct))

موصى به: