فهرست مطالب:

تقسیم بندی ریه MatLab: 5 مرحله
تقسیم بندی ریه MatLab: 5 مرحله

تصویری: تقسیم بندی ریه MatLab: 5 مرحله

تصویری: تقسیم بندی ریه MatLab: 5 مرحله
تصویری: آمورش جامع فیزیولوژی ریه🫁 | براساس رفرنس گایتون 2024, ژوئن
Anonim
تقسیم بندی ریه MatLab
تقسیم بندی ریه MatLab

نویسنده: پوک لام ، پل یونگ ، اریک ریس

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

هدف از این پروژه MatLab ایجاد یک برنامه تقسیم بندی ریه تعاملی کاربر پسند برای تشخیص شرایط پاتولوژیک تصاویر اشعه ایکس ریه ها است. هدف ما ایجاد روش م effectiveثرتری برای نشان دادن و شناسایی ریه های غیرطبیعی است تا به پزشکان و رادیولوژیست ها روش مطمئن تری برای تشخیص بیماری های ریه ارائه شود. با استفاده از ابزار طراح برنامه در MatLab ، این برنامه به گونه ای طراحی شده است که به طور خاص با اشعه ایکس قفسه سینه و اسکن توموگرافی کامپیوتری (CT) کار می کند ، اما برای کار با اسکن MRI نیز آزمایش شده است.

دستورالعمل های زیر شامل تکنیک فیلتر نویز (فیلتر وینر کم گذر) و همچنین آستانه تصویر (با استفاده از هیستوگرام شدت تصویر خاکستری) و با استفاده از یک گرادیان مورفولوژیکی (تفاوت بین اتساع و فرسایش تصویر) تا منطقه مورد نظر را مشخص کنید سپس دستورالعمل نحوه ادغام همه عناصر در رابط کاربری گرافیکی (GUI) توضیح داده می شود.

توجه داشته باشید:

1) این پروژه از مقاله ای الهام گرفته شده است: "تقسیم بندی و تجزیه و تحلیل ریه های غیر عادی در CT: رویکردهای فعلی ، چالش ها و روندهای آینده". که در اینجا یافت می شود

2) ما از تصاویر اشعه ایکس از مرکز بالینی NIH استفاده می کنیم. پیوند را می توانید در اینجا پیدا کنید

3) راهنمای طراح برنامه را می توانید در اینجا پیدا کنید

4) قبل از اجرای کد: باید مسیر Dir (در خط 34) را به فهرست پرونده و نوع تصویر خود (خط 35) (ما در حال تجزیه و تحلیل *.png) هستیم تغییر دهید.

مرحله 1: مرحله 1: بارگیری تصویر

مرحله 1: بارگذاری تصویر
مرحله 1: بارگذاری تصویر

این مرحله تصویر اصلی را در مقیاس خاکستری به شما نشان می دهد. "name_of_picture.png" را به نام تصویر خود تغییر دهید

روشن clc؛ همه را بستن ؛

٪٪ بارگیری تصاویر

raw_x_ray = 'name_of_picture.png'؛

I = imread (raw_x_ray) ؛

شکل (101) ؛

نمایش (I) ؛

نقشه رنگ (خاکستری) ؛

عنوان ('اشعه ایکس مقیاس خاکستری')؛

مرحله 2: مرحله 2: فیلتر نویز و هیستوگرام

مرحله 2: فیلتر نویز و هیستوگرام
مرحله 2: فیلتر نویز و هیستوگرام

به منظور یافتن آستانه برای تصویر مقیاس خاکستری ، ما به هیستوگرام نگاه می کنیم تا ببینیم آیا حالت های متمایزی وجود دارد یا خیر. بیشتر اینجا بخوانید

I = wiener2 (من ، [5 5]) ؛

شکل (102) ؛

فرع فرعی (2 ، 1 ، 1) ؛

نمایش (I) ؛

فرع فرعی (2 ، 1 ، 2) ؛

imhist (I، 256)؛

مرحله 3: مرحله 3: تنظیم آستانه ها

مرحله 3: تعیین آستانه ها
مرحله 3: تعیین آستانه ها
مرحله 3: تعیین آستانه ها
مرحله 3: تعیین آستانه ها

این مرحله به شما امکان می دهد تا آستانه را با توجه به هیستوگرام تنظیم کنید. morphologicalGradient ناحیه مورد نظر را با رنگ قرمز برجسته می کند و عملکرد visboundaries تصویر مشخص شده و فیلتر شده از ریه را به رنگ قرمز پوشش می دهد.

با استفاده از مناطق منطقه ای ، می توانیم آرایه های جامدت را دقیق کرده و آنها را به صورت نزولی مرتب کنیم. در مرحله بعد تصویر خاکستری sclae را باینار می کنم و روش گرادیان مورفولوژیکی و mLoren Shurasking را برای برجسته کردن منطقه مورد نظر (ROI) اعمال می کنم. گام بعدی این است که تصویر را وارونه کنید تا ROI ریه در پس زمینه سیاه سفید شود. من از تابع showMaskAsOverlay برای نمایش 2 ماسک استفاده می کنم. توجه: کد از پیوند Loren Shure الهام گرفته شده است.

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

a_thresh = I> = 172؛ ٪ این آستانه را تعیین کرد

[labelImage، numberOfBlobs] = bwlabel (a_thresh)؛

props = regionprops (a_thresh ، "همه") ؛

sortedSolidity = مرتب سازی ([props. Solidity] ، 'فرود') ؛

SB = sortedSolidity (1) ؛

اگر SB == 1٪ SB فقط استحکام را قبول کند == 1 استخوان را فیلتر کنید

binaryImage = imbinarize (I)؛ شکل (103) ؛

imshow (binaryImage) ؛ نقشه رنگ (خاکستری) ؛

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

morphologicalGradient = imsubtract (imdilate (binaryImage، SE) ، imerode (binaryImage، SE)) ؛

mask = imbinarize (morphologicalGradient، 0.03)؛

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

mask = imclose (mask، SE)؛

mask = imfill (mask، 'hole')؛

mask = bwareafilt (mask، 2)؛ ٪ کنترل تعداد نمایش منطقه

notMask = ~ ماسک ؛

ماسک = ماسک | bwpropfilt (notMask، 'Area'، [-Inf، 5000 - eps (5000)])؛

showMaskAsOverlay (0.5 ، ماسک ، 'r') ؛ ٪ باید برنامه/عملکرد showMaskAsOverlay را بارگیری کنید

BW2 = imfill (binaryImage ، 'hole') ؛

new_image = BW2؛

new_image (~ mask) = 0 ؛ background پس زمینه و حفره های معکوس

B = bwboundaries (new_image) ؛ ٪ فقط می تواند 2 بعد را بپذیرد

شکل (104) ؛

نمایش (new_image) ؛

صبر کن

visboundaries (B) ؛

پایان

مرحله 4: ایجاد GUI

اکنون ، ما کد قبلی را در یک برنامه MATLAB ادغام می کنیم. برنامه طراح را در MATLAB (جدید> برنامه) باز کنید. ابتدا ، رابط کاربری را با کلیک-نگه داشتن و کشیدن در سه محور به فضای کار مرکزی طراحی می کنیم. در مرحله بعد ، دو دکمه ، یک زمینه ویرایش (متن) ، یک قسمت ویرایش (عددی) ، یک نوار لغزنده و یک منوی کشویی را کلیک کرده و نگه دارید. دو محور هر کدام پیش نمایش و تصویر را تجزیه و تحلیل می کنند و محورهای سوم هیستوگرام پیکسل ها را برای پیش نمایش تصویر "انتخاب شده" نمایش می دهند. کادر زمینه ویرایش (متن) مسیر فایل تصویر انتخاب شده و فیلد ویرایش (عددی) ناحیه پیکسل شناسایی شده ریه ها را نمایش می دهد.

اکنون از نمای طراحی به نمای کد در App Designer تغییر دهید. با کلیک روی دکمه قرمز "Properties" با علامت بعلاوه ، کد ویژگیها را در کد وارد کنید. ابتدا خصوصیات I ، threshold و regionToExtract را مانند کد ارائه شده در زیر تنظیم کنید. در مرحله بعد ، روی دکمه ای در بالا سمت راست محیط کار (مرورگر کامپوننت) راست کلیک کرده و از Callbacks> Go to … callback (برو به تماس) بروید. کد "function SelectImageButtonPushed (برنامه ، رویداد)" را اضافه کنید. این کد به شما امکان می دهد تا با استفاده از uigetfile تصویری را برای تجزیه و تحلیل از رایانه خود انتخاب کنید. پس از انتخاب تصویر ، یک تصویر پیش نمایش در زیر محورها همراه با هیستوگرام ظاهر می شود. سپس ، روی دکمه دیگر راست کلیک کرده و همان روش را تکرار کنید تا یک تابع callback ایجاد شود.

کد زیر را "function AnalyzeImageButtonPushed (برنامه ، رویداد)" اضافه کنید. این کد شمارش پیکسل و تشخیص لکه روی تصویر پیش نمایش را بر روی دکمه تجزیه و تحلیل تصویر (هر کدام که برای این کد راست کلیک کرده اید) انجام می دهد. پس از برنامه نویسی دکمه ها ، اکنون نوار لغزنده و منوی کشویی را برنامه ریزی می کنیم. بر روی نوار لغزنده راست کلیک کرده ، یک تابع callback ایجاد کرده و کد زیر "function FilterThresholdSliderValueChanged (برنامه ، رویداد)" را تا انتها اضافه کنید. این به نوار لغزنده اجازه می دهد تا آستانه شدت خاکستری را تنظیم کند.

یک تابع تماس برای منوی کشویی ایجاد کرده و کد زیر "تابع AreastoExtractDropDownValueChanged (برنامه ، رویداد)" را اضافه کنید تا به منوی کشویی اجازه دهید تعداد لکه های نمایش داده شده در محورهای تصویر تجزیه و تحلیل شده را تغییر دهد. اکنون ، روی هر موجود در مرورگر کامپوننت کلیک کنید و ویژگی های آنها را به دلخواه تغییر دهید ، مانند تغییر نام موجودیت ها ، حذف محورها و تغییر مقیاس. موجودات مرورگر کامپوننت را در نمای طراحی بکشید و رها کنید تا یک طرح کاربردی و آسان برای درک داشته باشید. شما اکنون یک برنامه در MATLAB دارید که می تواند تصاویر ریه ها را برای ناحیه پیکسل تجزیه و تحلیل کند!

خواص (دسترسی = خصوصی) I = ؛ ٪ فایل تصویری

آستانه = 257 ؛ ٪ آستانه برای دوتایی شدن شدت خاکستری

RegionToExtract = 2 ؛

پایان

عملکرد SelectImageButtonPushed (برنامه ، رویداد)

clc؛ Dir = 'C: / Users / danie / Downloads / images_004 / images'؛ ٪ define invariate file "prefix"

[imageExt، path] = uigetfile ('*. png')؛ ٪ قسمت متغیر نام تصویر را بگیرید

imageName = [Dir filesep imageExt]؛ ٪ رشته های متغیر متغیر و متغیر را به هم متصل می کند

app. I = imread (imageName) ؛ ٪ تصویر را خوانده است

imshow (app. I ، 'parent'، app. UIAxes) ؛ ٪ نمایش تصویر

app. FilePathEditField. Value = path؛ ٪ نمایش مسیر فایل از جایی که تصویر اصلی از آنجا آمده است

پایان

عملکرد AnalyzeImageButtonPushed (برنامه ، رویداد)

originalImage = app. I؛

originalImage = wiener2 (برنامه I. ، [5 5]) ؛ ٪ فیلتر حذف نقطه

هیستوگرام (app. AxesHistogram ، app. I، 256) ؛ ٪ نمایش هیستوگرام تصویر

a_thresh = originalImage> = app.threshold؛ ٪ این آستانه را تعیین کرد

labelImage = bwlabel (a_thresh)؛

props = regionprops (a_thresh ، 'all')؛

sortedSolidity = مرتب سازی ([props. Solidity] ، 'فرود') ؛

SB = sortedSolidity (1) ؛

اگر SB == 1٪ SB فقط استحکام را قبول کند == 1 استخوان را فیلتر کنید

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

morphologicalGradient = imsubtract (imdilate (labelImage، SE) ، imerode (labelImage، SE)) ؛

mask = imbinarize (morphologicalGradient، 0.03)؛

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

mask = imclose (mask، SE)؛

mask = imfill (mask، 'hole')؛

mask = bwareafilt (mask، app.regionsToExtract) ؛

٪ کنترل تعداد نمایش منطقه

notMask = ~ ماسک ؛

ماسک = ماسک | bwpropfilt (notMask، 'Area'، [-Inf، 5000 - eps (5000)])؛

BW2 = imfill (labelImage ، 'hole') ؛

new_image = BW2؛

new_image (~ mask) = 0 ؛

B = bwboundaries (new_image) ؛ ٪ فقط می تواند 2 بعد را نمایش دهد (new_image ، 'parent'، app. UIAxes2) ؛

نگه دارید (app. UIAxes2 ، 'on') ؛

visboundaries (B) ؛

مجموعه (gca ، 'YDir' ، 'معکوس') ؛

lungArea = bwarea (new_image) ؛

app. PixelAreaEditField. Value = lungArea؛

پایان

پایان

تابع FilterThresholdSliderValueChanged (برنامه ، رویداد)

app.threshold = app. FilterThresholdSlider. Value؛

پایان

تابع AreastoExtractDropDownValueChanged (برنامه ، رویداد) stringNumber = app. AreastoExtractDropDown. Value؛

app.regionsToExtract = str2double (stringNumber) ؛

پایان

پایان

توصیه شده: