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

تجزئة الرئة MatLab: 5 خطوات
تجزئة الرئة MatLab: 5 خطوات

فيديو: تجزئة الرئة MatLab: 5 خطوات

فيديو: تجزئة الرئة MatLab: 5 خطوات
فيديو: LTE with MATLAB-5: Downlink and Uplink Physical Channels of LTE 2024, يونيو
Anonim
تجزئة الرئة ماتلاب
تجزئة الرئة ماتلاب

بقلم: فوك لام ، بول يونغ ، إريك رييس

الاعتراف بأن الأخطاء في تجزئة الرئتين ستنتج معلومات خاطئة فيما يتعلق بتحديد منطقة المرض ويمكن أن تؤثر بشكل مباشر على عملية التشخيص. فشلت تقنيات المساعدة الحاسوبية الحديثة في تقديم نتائج دقيقة عندما يكون لأمراض الرئة أشكال صعبة. يمكن أن تحدث هذه الأشكال غير الطبيعية بسبب الانصباب الجنبي ، والتوحيد ، وما إلى ذلك. بتطبيق تقنية تجزئة الرئة ، حيث يتم عزل حدود الرئة عن الأنسجة الصدرية المحيطة ، يمكن لتطبيقنا تحديد الحدود مع عتبات إدخال المستخدم لإعطاء وجهات نظر قابلة للتخصيص بالكامل من أشكال الرئتين ،

الغرض من مشروع MatLab هذا هو إنشاء تطبيق تجزئة تفاعلية سهل الاستخدام للكشف عن الحالات المرضية لصور الأشعة السينية للرئتين. هدفنا هو إيجاد طريقة أكثر فعالية لتوضيح وتحديد الرئة غير الطبيعية من أجل إعطاء الأطباء وأخصائيي الأشعة طريقة أكثر موثوقية لتشخيص أمراض الرئة. باستخدام أداة مصمم التطبيق في MatLab ، تم تصميم البرنامج للعمل بشكل خاص مع فحوصات الصدر بالأشعة السينية والتصوير المقطعي المحوسب (CT) ، ولكن تم اختباره أيضًا للعمل مع فحوصات التصوير بالرنين المغناطيسي.

تحتوي الإرشادات أدناه على تقنية تصفية الضوضاء (مرشح Wiener منخفض التمرير) بالإضافة إلى عتبة الصورة (باستخدام الرسم البياني لشدة الصورة ذات التدرج الرمادي) واستخدام التدرج المورفولوجي (الفرق بين تمدد الصورة وتآكلها) تحديد منطقة الاهتمام. ستشرح التعليمات بعد ذلك كيف ندمج جميع العناصر في واجهة المستخدم الرسومية (GUI).

ملحوظة:

1). هذا المشروع مستوحى من ورقة بحثية: "التقسيم وتحليل الصور للرئة غير الطبيعية في CT: الأساليب الحالية والتحديات والاتجاهات المستقبلية". والتي يمكن العثور عليها هنا

2). نحن نستخدم صور الأشعة السينية من المعاهد الوطنية للصحة: المركز الطبي. يمكن العثور على الرابط هنا

3). يمكن العثور على مساعدة مصمم التطبيق هنا

4). قبل تشغيل الكود: تحتاج إلى تغيير مسار Dir (في السطر 34) إلى دليل الملفات ونوع الصورة (السطر 35) (نقوم بتحليل *.png).

الخطوة 1: الخطوة 1: تحميل الصورة

الخطوة 1: تحميل الصورة
الخطوة 1: تحميل الصورة

ستظهر لك هذه الخطوة الصورة الأصلية بمقياس رمادي. قم بتغيير "name_of_picture.png" إلى اسم صورتك

صافي؛ clc. أغلق الكل

٪٪ تحميل الصور

raw_x_ray = 'name_of_picture.png' ؛

أنا = imread (raw_x_ray) ؛

شخصية (101) ؛

imshow (أنا) ؛

خريطة ملونة (رمادي) ؛

العنوان ("Grayscale X-Ray") ؛

الخطوة 2: الخطوة 2: تصفية الضوضاء والرسم البياني

الخطوة 2: تصفية الضوضاء والرسم البياني
الخطوة 2: تصفية الضوضاء والرسم البياني

من أجل العثور على عتبة الصورة ذات المقياس الرمادي ، ننظر إلى الرسم البياني لمعرفة ما إذا كانت هناك أوضاع مميزة. اقرأ المزيد هنا

أنا = wiener2 (I، [5 5]) ؛

الشكل (102) ؛

حبكة فرعية (2 ، 1 ، 1) ؛

imshow (أنا) ؛

حبكة فرعية (2 ، 1 ، 2) ؛

imhist (أنا ، 256) ؛

الخطوة 3: الخطوة 3: تحديد العتبات

الخطوة 3: تحديد العتبات
الخطوة 3: تحديد العتبات
الخطوة 3: تحديد العتبات
الخطوة 3: تحديد العتبات

تسمح لك هذه الخطوة بتعيين الحد الأدنى وفقًا للرسم البياني. سيبرز التدرج المورفولوجي منطقة الاهتمام باللون الأحمر ، وتغطي حدود الرؤية الوظيفية الصورة المحددة والمفلترة للرئة باللون الأحمر.

باستخدام regionprops ، يمكننا تحديد مصفوفات الصلابة وفرزها تنازليًا. بعد ذلك ، قم بترميز صورة الصلبة الرمادية بالثنائي وطبق طريقة التدرج الصرفي و mLoren Shurasking لتسليط الضوء على منطقة الاهتمام (ROI). الخطوة التالية هي عكس الصورة بحيث يكون عائد استثمار الرئة أبيض في الخلفية السوداء. أستخدم وظيفة showMaskAsOverlay لعرض قناعين. ملاحظة: الكود مستوحى من رابط Loren Shure.

Lasly ، أقوم بإنشاء مخطط أحمر باستخدام bwbwboundaries وإخفاء صورة المرشح والحدود.

a_thresh = أنا> = 172 ؛ ٪ تعيين هذا الحد

[labelImage، numberOfBlobs] = bwlabel (a_thresh) ؛

props = regionprops (a_thresh، 'all') ؛

SortedSolidity = sort ([props. Solidity] ، 'descend') ؛

SB = SortedSolidity (1) ؛

إذا كان SB == 1٪ SB يقبل الصلابة فقط == 1 قم بترشيح العظام

binaryImage = imbinarize (I) ؛ الشكل (103) ؛

imshow (binaryImage) ؛ خريطة ملونة (رمادي) ؛

SE = strel ('مربع' ، 3) ؛

التدرج المورفولوجي = imsubtract (imdilate (binaryImage ، SE) ، imerode (binaryImage ، SE)) ؛

القناع = imbinarize (التدرج المورفولوجي ، 0.03) ؛

SE = strel ('مربع' ، 2) ؛

قناع = imclose (قناع ، SE) ؛

قناع = imfill (قناع ، "ثقوب") ؛

القناع = bwareafilt (القناع ، 2) ؛ ٪ رقم التحكم في عرض المنطقة

notMask = ~ قناع ؛

قناع = قناع | bwpropfilt (notMask، "المنطقة"، [-Inf، 5000 - eps (5000)]) ؛

showMaskAsOverlay (0.5، قناع، 'r') ؛ ٪ لديك لتنزيل التطبيق / وظيفة showMaskAsOverlay

BW2 = imfill (binaryImage، 'ثقوب') ؛

new_image = BW2 ؛

new_image (~ القناع) = 0 ؛ ٪ عكس الخلفية والثقوب

B = bwboundaries (new_image) ؛ يمكن لـ٪ فقط قبول بُعدين

الشكل (104) ؛

imshow (new_image) ؛

يتمسك

حدود اللزوجة (ب) ؛

نهاية

الخطوة 4: إنشاء واجهة المستخدم الرسومية

الآن ، نقوم بدمج الكود السابق في تطبيق MATLAB. افتح مصمم التطبيق في MATLAB (جديد> تطبيق). أولاً ، نقوم بتصميم الواجهة عن طريق الضغط مع الاستمرار والسحب في ثلاثة محاور إلى مساحة العمل المركزية. بعد ذلك ، نقوم بالنقر مع الاستمرار على زرين ، وحقل تحرير واحد (نص) ، وحقل تحرير واحد (رقمي) ، وشريط تمرير واحد ، وقائمة منسدلة واحدة. سيعرض كل محورين المعاينة ويحلل الصورة ، وسيعرض المحاور الثالث رسمًا بيانيًا للبكسل لمعاينة الصورة "المحددة". سيعرض مربع حقل التحرير (النص) مسار الملف للصورة المحددة ، وسيعرض حقل التحرير (الرقمي) منطقة البكسل المكتشفة للرئتين.

الآن قم بالتبديل من عرض التصميم إلى عرض التعليمات البرمجية في مصمم التطبيق. أدخل رمز الخصائص عن طريق النقر فوق الزر "خصائص" الأحمر مع علامة الجمع الموجودة به. قم بتهيئة الخصائص I و threshold و areasToExtract كما في الكود الموضح أدناه. بعد ذلك ، انقر بزر الماوس الأيمن فوق زر في الجانب الأيمن العلوي من مساحة العمل (متصفح المكونات) وانتقل من Callbacks> Go to… callback. أضف رمز "الوظيفة SelectImageButtonPushed (التطبيق ، الحدث)." يسمح لك هذا الرمز بتحديد صورة لتحليلها من جهاز الكمبيوتر الخاص بك باستخدام ملف uiget. بعد تحديد صورة ، ستظهر صورة معاينة تحت المحاور مصحوبة برسم بياني. ثم ، انقر بزر الماوس الأيمن فوق الزر الآخر وكرر نفس الإجراء لإنشاء وظيفة رد الاتصال.

أضف الشفرة الموجودة أسفل "function AnalyzeImageButtonPushed (التطبيق ، الحدث)." سيقوم هذا الرمز بإجراء عد البكسل واكتشاف النقطة الثنائية الكبيرة على صورة المعاينة عند زر تحليل الصورة (أيهما قمت بالنقر بزر الماوس الأيمن فوق هذا الرمز). بعد برمجة الأزرار ، سنقوم الآن ببرمجة شريط التمرير والقائمة المنسدلة. انقر بزر الماوس الأيمن فوق شريط التمرير ، وأنشئ وظيفة رد اتصال وأضف الكود الموجود أسفل "وظيفة FilterThresholdSliderValueChanged (التطبيق ، الحدث)" حتى النهاية. يسمح هذا لشريط التمرير بضبط حد الكثافة الرمادية.

قم بإنشاء وظيفة رد اتصال للقائمة المنسدلة ، وأضف الكود الموجود أسفل "function AreastoExtractDropDownValueChanged (app، event)" للسماح للقائمة المنسدلة بتعديل عدد النقاط المعروضة على محاور الصورة التي تم تحليلها. الآن ، انقر فوق كل كيان في متصفح المكونات وقم بتغيير خصائصه حسب رغبتك ، مثل تغيير أسماء الكيانات وإزالة المحاور وتغيير القياس. قم بسحب وإسقاط كيانات متصفح المكونات في Design View إلى تخطيط عملي وسهل الفهم. لديك الآن تطبيق في MATLAB يمكنه تحليل صور الرئتين لمنطقة البكسل!

الخصائص (الوصول = خاص) I = ؛ ٪ ملف صورة

العتبة = 257 ؛ حد النسبة المئوية لمضاعفة كثافة اللون الرمادي

RegionToExtract = 2 ؛

نهاية

الوظيفة SelectImageButtonPushed (التطبيق ، الحدث)

clc ؛ Dir = 'C: / Users / danie / Downloads / images_004 / images' ؛ ٪ تعريف ملف ثابت "بادئة"

[imageExt، path] = uigetfile ('*. png')؛ ٪ انتزاع الجزء المتغير من اسم الصورة

imageName = [Dir filesep imageExt] ؛ ٪ إجهادات متسلسلة ثابتة ومتغيرة

app. I = imread (imageName) ؛ قراءة الصورة

imshow (app. I، 'parent'، app. UIAxes) ؛ ٪ عرض الصورة

app. FilePathEditField. Value = مسار ؛ ٪ مسار ملف العرض من حيث أتت الصورة الأصلية

نهاية

function AnalyzeImageButtonPushed (التطبيق ، الحدث)

originalImage = app. I؛

originalImage = wiener2 (app. I، [5 5]) ؛ عامل تصفية إزالة٪ نقطة

الرسم البياني (app. AxesHistogram ، app. I ، 256) ؛ ٪ عرض الرسم البياني للصورة

a_thresh = originalImage> = app.threshold ؛ ٪ تعيين هذا الحد

labelImage = bwlabel (a_thresh) ،

props = regionprops (a_thresh، 'all') ؛

SortedSolidity = sort ([props. Solidity] ، 'descend') ؛

SB = SortedSolidity (1) ؛

إذا كان SB == 1٪ SB يقبل الصلابة فقط == 1 قم بترشيح العظام

SE = strel ('مربع' ، 3) ؛

التدرج المورفولوجي = imsubtract (imdilate (labelImage ، SE) ، imerode (labelImage ، SE)) ؛

القناع = imbinarize (التدرج المورفولوجي ، 0.03) ؛

SE = strel ('مربع' ، 2) ؛

قناع = imclose (قناع ، SE) ؛

قناع = imfill (قناع ، "ثقوب") ؛

القناع = bwareafilt (القناع ، app.regionsToExtract) ؛

٪ رقم التحكم في عرض المنطقة

notMask = ~ قناع ؛

قناع = قناع | bwpropfilt (notMask، "المنطقة"، [-Inf، 5000 - eps (5000)]) ؛

BW2 = imfill (labelImage، 'ثقوب') ؛

new_image = BW2 ؛

new_image (~ قناع) = 0 ؛

B = bwboundaries (new_image) ؛ يمكن لـ٪ فقط قبول أبعاد ثنائية imshow (new_image، 'parent'، app. UIAxes2) ؛

اضغط على (app. UIAxes2، 'on') ؛

حدود اللزوجة (ب) ؛

مجموعة (gca، 'YDir'، 'reverse') ؛

LungArea = bwarea (صورة جديدة) ؛

app. PixelAreaEditField. Value = LungArea ؛

نهاية

نهاية

وظيفة FilterThresholdSliderValueChanged (التطبيق ، الحدث)

app.threshold = app. FilterThresholdSlider. Value ؛

نهاية

الوظيفة AreastoExtractDropDownValueChanged (التطبيق ، الحدث) stringNumber = app. AreastoExtractDropDown. Value ؛

app.regionsToExtract = str2double (stringNumber) ،

نهاية

نهاية

موصى به: