اطلاعیه

Collapse
No announcement yet.

کمک درباره مقاله GVF

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    #76
    پاسخ : کمک درباره مقاله GVF

    با سلام وعرض ادب
    1)شما تاپیک شماره 74 رو که نوشته بدوم مطالعه فرمودید یانه میشه اون تاپیک رو یه مطالعه بفرمایید

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

    3)منظور من این که:
    در فضای رنگیgray scaleهر کدوم از پیکسل ها دارای یک مقدار رنگی هستند درسته ، پس همه پیکسلهای توده دارای یه مقدار رنگی یکسان هستند و اینجوری استخراج تومور راحتتره البته این شرط رو باید به کلاستر بندی اضافه کنیم که نقاطی که در همسایگی یکدیگر هستند ومقدار رنگ آنها یکسان است را استخراج کنه شما این راه حل منو لطفا بررسی کنید و نظر تون بفرمایید اگه راه حل من درست بود خوب بقیوش دنبال کنیم (البته من یه تابع دست نویس برای نقاط همسایه نوشتم ) اگر نه یه راه حل برای مشکل تاپیک شماره 74 پیدا کنیم
    با کمال تشکر

    دیدگاه


      #77
      پاسخ : کمک درباره مقاله GVF

      سلام .....................

      من اون فایل هایی که برام فرستاده بودید رو چک کردم .. خــب؛ حالا نتیجه ...

      برید به پست 48 .. اونجا یه کد هست و نمونه هایی که با اون کد اجرا شده .. کاملا مراحل مشخصه دیگه درسته؟ توی فایل هایی که شما برام فرستاده بوید؛ این مرحله کاملا صحیح اجرا شده بود .. نگرانی ای که توی این مرحله برای ما پیش اومد؛ چی بود؟ این بود که کانتور توی هر آزمایش، میرفت و Boundary خود مغز رو به دست میاورد .. علتش هم کاملا مشخص بود .. حالا برای اینکه این موضوع رو تا حدودی مرتفع کنیم، اومدیم چیکار کردیم؟ اومدیم گفتیم به دلیل اینکه Sample خود الگوریتم روی im_lung تعریف شده و جواب هم گرفته؛ شاید بهتر باشه با اون دید تصویرمون رو غربال کنیم به این معنا که تصاویرمون رو شبیه im_lung کنیم .. این حرف به این معنا بود که ما به تصاویرمون، فضای رنگی جدیدی رو اختصاص بدیم که بتونن شبیه رفتار im_lung رو در مساله به اجرا در بیارن .. برای این تبدیل از چه راهی استفاده کردیم؟ اومدیم توجه الگوریتم رو از Background به Forgraund معطوف کردیم .. چجوری؟ با اعمال یه رابطه ی نقیض ساده ..

      این راه تونست ما رو کمک کنه امــا باز هم نتونست مارو به نتیجه ی اصلی برسونه .. اینجای کار بود که به این فکر افتادیم که اگه بتونیم Representation تومورمون رو به گونه ای بیان کنیم که تمرکز الگوریتم روی ناحیه ی محتمل تومور؛ بیشتر بشه، اونوقت میتونیم باز هم به نتیجه ی مطلوب نزدیکتر بشیم .. اومدیم و گفتیم که باید دنبال این موضوع بود که کدوم نتاجیه برای وجود تومور از وزن بیشتری برخورداره .. ایده ی اولی که به ذهنمون رسید این بود که شاید بتونیم بر مبنای یه Kernel Filtering معمولی ناحیه ی تومور رو تشخیص بدیم امــا دیدیم که در عمل؛ با توجه به نمونه های مغزی؛ چنین دید ساده ای نمیتونه بهمون کمک کنه .. با نگاهی دقیق تر به تصاویر مغز؛ این ایده به ذهنمون رسید که ناحیه ی تومور دار؛ از Contrast بیشتری برخورداره تا ناحیه های غیر تومور .. از این Base فکری استفاده کردیم و الگوریتم Croping رو روی نمونه های مغزیمون تعریف کردیم ..

      اتفاقی که افتاد چی بود؟ یه کد به نام Sample Code ایجاد شد که دوتا تصویر باهاش تست شده بود .. یکی abc و دیگری هم hij .. الگوریتم به طور کامل با اینها جواب میداد امــا با تصویر efg به مشکل میخورد .. چرا؟ کاملا واضحه؛ چون نمونه ی efg یه نمونه ی خیلی بد از تصاویر مغزیه به طوریکه اگه خود انسان هم بهش نگاه کنه شاید نتونه تشخیص خوبی از محدوده ی تومور داشته باشه .. یه ایده ای که این وسط مطرح شد این بود که از متدهای Clustering برای تشخیص ناحیه ی تومور استفاده کنیم .. این ایده چه زمانی میتونه به ما کمک کنه؟ موقعی که بتونیم Discriminative Feature هایی پیدا کنیم که بتونن به مجزا شدن Cluster های ما کمک کنن .. روی دو مورد اول میشه از این ایده استفاده کرد امــا برای efg نمیشه به مقادیر پیکسل برای تولید Clustre های Discriminative بسنده کرد .. من علتش رو با تصویر زیر نشونتون میدم ..


      مرحله ی آخری که توی پست های قبل بهش اشاره کردیم؛ این بود که بیایم و این دو کد رو باهم ادغام کنیم .. یعنی PIG و Sample Code .. برای ادغام اینها اونچیزی که طبیعی بود؛ این بود که باید خروجی Sample Code رو بذاریم به عنوان ورودی کد PIG .. امــا اینجا به یه مشکل میخوردیم و اون این بود که کدPIG به تصویر ورودیش ایراد میگرفت .. علتش رو من ازتون سوال کردم امــا پاسخ سوال در لابلای مطالب گذشته گم شد .. حالا پاسخش رو خودم میدم .. توی خود متد PIG یه تابع تعریف شده که یه آرگومان داره به نام "اتـــــا" .. وقتی ابعاد تصویر از یه رزولوشن خاص تجاوز میکنه (کمتر میشه..) و تناسب پیکسلی از بین میره؛ این تابع دچار مشکل میشه و نمیتونه خروجی بده .. حالا ما برای رفع این مشکل باید کاری کنیم که این اتفاق در خروجی Sample Code به نحوی جبران بشه و بتونیم تصویر رو برای ورود به الگوریتم PIG محیاش کنیم .. نتایجی که به عنوان ثمره ی این هماهنگ سازی و جبران سازی خطا در حوزه ی رزولوشن؛ به دست اومده؛ در پست 63 براتون گذاشتم .. به دقت به اون تصاویر نگاه کنید .. میبینید که به همون منظوری که خواستیم رسیدیم؛ یعنی Segmentation تومور روی تصویر مغز .. در نتیجه میتونیم اعلام کنیم که مراحل پله به پله طی شدن و در نهایت، به نتیجه ی مطلوب رسیدیم .. (من این فایل رو هنوز پیش خودم نگه میدارم تا خودتون کدش رو بنویسید .. چیز خاصی نداره .. یک مقدار به مطالبی که گفتم دقت کنید..)

      امــا سوالاتی که شما پرسیدید ....

      مثلا شما تصویر abcرو توی paintیه مقدار تغییر بدید یعنی طول ویا عرض اون رو کم وزیاد کنید بعد الگوریتم pig روبا اون تست کنید چرا نتیجه فرق میکنه؟
      وقتی شما تصویر رو توی Paint تغییر میدید؛ چندین تا عامل هست که به این واسطه نابودشون کردید!

      -- فرمت تصویر؛ PNG بوده و احتمالا موقع ذخیره کردن با فرمت Bitmap عملیات رو پایان دادید ..
      -- وقتی تصویر رو کوچیک کردید؛ ضریب "اتــــا" رو در نظر نگرفتید .. (من نمیدونم این ضریب دقیقا چیکار میکنه؛ زیاد متدش رو دقیق نخوندم..) ..
      -- الگوریتم در تصاویری با ابعاد بالاتر خوب جواب میده؛ مثلا سایز تصویر im_lung از Bounding Box هایی که ما از مغز گرفتیم؛ بزرگتر هست ولی در اجرای الگوریتم با اونا به مشکل نمیخوریم ..

      مطمئن هستم که وقتی جای rgb2gray()رو توی برنامه تغییر می دهیم نتیجه برنامه فرق میکنه به نظر شما بهتر نیست که جای اون در الگوریتمexample_pigتغییر بدیم
      این حرف شما زیاد صحیح نیست .. تبدیل فضای رنگی یه تصویر باید کی انجام بشه؟ قبل از اینکه بخوایم روی تصویر؛ Operation خاصی انجام بدیم .. یعنی وقتی تصویر خونده میشه؛ بالافاصله تبدیل فضای رنگی رو انجام میدیم که به مشکلات ColorSpace برخورد نکنیم ..

      البته جدا از اون مراحلی به من گفته بودید انجام بدم یکی از تصاویر با مشکل برخورد کرده تصویرefg.pngدر فایلی که برای من گذاشته بودید در تاپیک شماره48 ، این تصویر با الگوریتمی که در فایلsample codeبود اجرا نمیشود میتونید اون اجرا کنید و نتیجه رو ببینید.
      این رو در بالا هم توضیح دادیم .. چرا اون تصویر با الگوریتم Sample code جواب نمیده؟ چون Threshold ای که برای دو تصویر abc و hij تعریف شده؛ روی این تصویر جواب نمیده .. واضحه دلیلش دیگه؛ درسته؟ محدوده ی Dark بسیار از Threshold ما فاصله داره و وقتی که ما Thresholding رو روی این تصویر اعمال میکنیم؛ اتفاقی که میوفته چیه؟ کل اطلاعات تصویر منهای برخی محدوده های پیکسلی که در اقلیت هستن؛ کشته میشن .. برای همینه که اون تصویر از هر نظر یه داده ی پرت برای ما به حساب میاد ..

      نمی دونم شاید مشکل از فضای رنگی تصویر efg.pngباشه اما من تقریبا همه ی تبدیلات رو اعمال کردم اما نتیجه خاصی بدست نیامدبجز تبدیل rgb2indکه نتیجه نهایی چیزی خاصی نمیگه الگوریتمexample_pigدر فضای رنگی grayscaleتعریف شده که این تبدیل هم مفید نیست واگه بخواهیم بعد از تبدیل بالا این تبدیل رو هم بنویسیمind2grayبازهم الگوریتم به مشکل برمیخوره
      اگه بخوایم با این view به موضوع نگاه کنیم؛ باید به فکر این باشیم که بتونیم رفتار پیکسل ها رو از نظر مقدار به دو تصویر اول abc و hij نزدیک کنیم .. این که ما تصویرمون رو به Index Image تبدیل کنیم هیچ دردی رو از مساله درمان نمیکنه چرا که اصلا مشکل به ساختار تصویر بر نمیگرده .. به value های پیکسل تصویرمون بر میگرده که با این تبدیلات؛ Value ها تغییری نمیکنن ..

      در فضای رنگیgray scaleهر کدوم از پیکسل ها دارای یک مقدار رنگی هستند درسته ، پس همه پیکسلهای توده دارای یه مقدار رنگی یکسان هستند و اینجوری استخراج تومور راحتتره البته این شرط رو باید به کلاستر بندی اضافه کنیم که نقاطی که در همسایگی یکدیگر هستند ومقدار رنگ آنها یکسان است را استخراج کنه شما این راه حل منو لطفا بررسی کنید و نظر تون بفرمایید اگه راه حل من درست بود خوب بقیوش دنبال کنیم (البته من یه تابع دست نویس برای نقاط همسایه نوشتم ) اگر نه یه راه حل برای مشکل تاپیک شماره 74 پیدا کنیم
      جواب این سوالتون هم میشه اون تصویری که براتون در بالا گذاشتم .. منحنی هیستوگرام رو ببینید .. متوجه میشید که روی Value های پیکسل ها نمیشه قضاوت کرد مضاف بر اینکه ما تنها انتظاری که داریم اینه که بتونیم یه محدوده برای اعمال الگوریتم اصلیمون پیدا کنیم .. همین! دیگه قرار نیست این همه هزینه کنیم تا اینکه محدوده ی تومور خیلی دقیق محاسبه بشه .. اون وظیفه ی کانتوره که بتونه این ناحیه رو Segment کنه .. امیدوارم مطالب تونسته باشه؛ کمکتون کنه .. به نوشتن کد انتهایی فکر کنید .. موفق باشید ..
      دوستان! مدتی کمتر به سایت میام ..

      دیدگاه


        #78
        پاسخ : کمک درباره مقاله GVF

        با سلام وعر ض ادب
        یه نکته که من از نوشته های شما در تاپیک شماره 76 فهمیدم ،اینه که باید resolutionتصویر crop2 در الگوریتمsample codeرو باید افزایش بدیم
        وhelpمتلب رو مطالعه کردم و این دستورات رو به sample codeاضافه کردم اما نتیجه ای حاصل نشد

        h=fspecial('unsharp' -1
        crop2=roifilt2(h,crop2,crop2); -2

        این تابع resolutionتصویر رو بالا می بره اما در مورد این تصویر ،نتیجه ای حاصل نشد

        یه چیز دیگرم که فهمیدم اینکه، وقتی information تصویر gvfرو با تصویرim_lungمقایسه کردم
        سه تفاوت عمده رو پیدا کردم در تصویر im_lung
        resolutionunit='meter' -1
        Xresolution=2835 -2
        Yresolution=2835 -3
        حالا منظور من مقادیر خاص این پارامترها نیست بلکه داشتن مقدار است
        اما در تصویرgvfسه پارامتر بالا مقدار ندارند
        البته نا گفته نماند که دو سه تا راه دیگه برای افزایش resolution دارم تست می کنم نتیجه اونا رو هم براتون ارسال میکنم

        حالا به نظر شما راه رو دارم درست میرم یا نه؟
        با کمال تشکر

        دیدگاه


          #79
          پاسخ : کمک درباره مقاله GVF

          سلام .....................

          باید resolutionتصویر crop2 در الگوریتمsample codeرو باید افزایش بدیم
          کاهش.. اون هم در حالتی که به سایزتون کمک کنه چرا که ما محدودیت سایز هم داریم .. در مورد Unsharping که اشاره کردید باید بگم کاری که این فیلتر میکنه اینه که میاد و یه جورایی Edge response effects ها رو میکشه به این معنا که تصویرمون رو نرم تر میکنه .. وقتی میگیم تصویری Sharp شده این معنا توی ذهنمون میاد که تصویر از نظر تفکیک پیکسلی در ارزش بالاتری قرار داره ..

          اون قسمت اولی که در ابتدای پست نوشتم رو دوباره بخونید .. اون میتونه جواب متد باشه .. (البته صرفا تنها ترین راه نیست امــا راهیه که با کمترین هزینه مارو به منظورمون میرسونه ..) .. موفق باشید ..
          دوستان! مدتی کمتر به سایت میام ..

          دیدگاه


            #80
            پاسخ : کمک درباره مقاله GVF

            با سلام وعرض ادب
            من یه مدتی برای امتحان مجبورم که تحقیقات وکارهای پروژه رو دنبال نکنم

            باکمال تشکر

            دیدگاه


              #81
              پاسخ : کمک درباره مقاله GVF

              سلام ..................

              من کد نهایی رو براتون میذارم تا روش صحبت کنیم .. این کد روی دو گونه ی متفاوت از عکس های MRI مغز تست شده و همونطور که توی نتایجش میبینید تونسته کاملا ناحیه ی تومور رو Segment کنه .. هر جای کد رو که سوال داشتید؛ بپرسید .. موفق باشید ..

              فایل های پیوست شده
              دوستان! مدتی کمتر به سایت میام ..

              دیدگاه


                #82
                پاسخ : کمک درباره مقاله GVF

                سلام ..............

                این پست رو من توی یه تاپیک دیگه در مورد GVF نوشته بودم؛ گفتم توی این تاپیک هم بذارم تا یه جمعبندی خوبی از مباحث رو داشته باشیم ..

                خب .. برگردیم به جایی که این ایده مطرح شد و مسیر تکاملش را دنبال کنیم و بیایم جلو تا اینکه برسیم به GVF و توضیحات مربوط به اون .. گفتیم که ایده ی اصلی بر میگشت به مدل Traditional Contour Model جاییکه یه Curve بر حسب یه متغیر S تعریف میشد و تمام تلاشش این بود که در یه فضای گسسته روی آبجکت حرکت کنه تا بتونه یه تابع انرژی رو Minimize کنه .. این تابع تشکیل میشد از دو بخش خیلی خاص .. یکی؛ بخشی که انعطاف کانتور رو برای ما ممکن میکرد (با یه سری اعمال وزن به مشتق اول و مشتق دوم تابع Curve مون) و بخش دوم که برای تشخیص Boundary و در نهایت حرکت به سمت اون؛ در نظر گرفته شده بود .. در آخر هم برای اینکه کانتور ما بتونه تابع انرژی تعریف شده رو Minimize کنه، لازم بود تا بتونه توی رابطه ی اویـلـر صدق کنه .. در واقع اگه میخواستیم خیلی کلی و از بالا به موضوع نگاه کنیم باید مساله رو اینطور بیان میکردیم: مجموع دو نیروی خارجی و داخلی باید برابر صفر بشه (یا به عبارتی در شرایط رابطه ی اویـلـر صدق کنه) .. حالا این دوتا نیروی داخلی و خارجی چطور بیان میشدن؟ نیروی داخلی نیرویی بود که روی خمش و انعطاف و کشیدگی کانتور تمرکز میکرد و نیروی خارجی هم نیرویی بود که به کانتور کمک میکرد تا به سمت لبه های آبجکت حرکت کنه .. در واقع نیروی دوم یه رابطه ای داشت با لبه های آبجکت ..


                بخش اول که به طور کاملا مشخص از روی مشتقات اول و دوم به دست میومد و با اعمال یه سری ضرایب (با نگاه وزنی) میتونستیم یه بالانس بین اونها برقرار کنیم .. بالانس برای چی؟ برای تضمین عملکرد کانتور از نظر انعطافش روی آبجکت .. امــا برای بخش دوم ایده ها باهم دیگه توی این مدل یک مقدار فرق میکرد .. اصل اولیه ای که این مدل بهش معتقد بود این بود که اگه قراره کانتور به ازای تابع انرژی در رابطه ی اویـلـر صدق کنه؛ باید بتونه از گرادیان نیروی خارجی استفاده کنه؛ بنابر این اگه ما نیروی خارجی رو با تصویرمون متناظر کنیم و اونهارو به هم ربط بدیم تونستیم چیکار کنیم؟ توی رابطه ی اویـلـر همگرایی به سمت لبه ها رو جایگزین کنیم .. خب این تعریف دوتا حالت کلی ایجاد میکرد .. یکی اینکه انرژی خارجی ما اندازه ی گرادیان خود تصویر باشه یا اینکه Smooth شده ی این مقدار باشه .. این فرض خوب بود اگر ما تصویرمون Gray Scale بود .. در غیر این صورت (یعنی اگه تصویر باینری داشتیم) باید از خود تصویر و Smooth شده ی خودش استفاده میکردیم نه اندازه ی گرادیانش ..

                با این فرض نتایجی که از مدل Traditional به دست اومد؛ زیاد بد نبود امــا زیاد هم دلچسب Segmentation کارها نبود .. انتظاری که از این مدل میرفت این بود که بتونه با تغییر دادن ضرایب "آلفا" و "بتا" به خمش و تغییر فرم کانتور کمک کنه به طوریکه بتونه در ناحیه های Concave کاملا وارد بشه و Segmentation رو در اونجا ها هم انجام بده .. امــا اینا به دو نکته توجه نکرده بودن و از همون دو قسمت هم ضربه خورن .. اول اینکه وقتی که مدل رو با منطق حاکم بر ضرایب و تصویر آبجکت بستن (منظورم همون تعریف تابع انرژی شون هست) اومدن و گفتن که این تابع باید در رابطه ی اویـلـر صدق کنه و شرط صدق کردن هم این بود که مجموع نیروهای داخلی و خارجی صفر بشه .. حالا این اتفاق بده یا خوب؟ این اتفاق زمانی میتونست خوب باشه که نقاط U_Shape در آبجکت وجود نمیداشتن .. امــا جایی که این نقاط وجود داشتن؛ کانتور بر حسب تعریفی که از اویـلـر براش تعیین شده بود به بررسی مجموعه نیروهای خارجی و داخلی میپرداخت و این نکته باعث میشد که تفاضل اینها رو در عمل وارد نتیجه کنه .. پــــس وقتی دو نیرو در خلاف جهت هم میدید؛ اینها رو از هم کم میکرد و برآیندشون رو صفر قرار میداد یا اگه باهم برابر نبودن؛ مقدار رو در جهت افق قرار میداد .. این صفر شدن برآیند یا جهت گرفتن مقدار نهایی تفاضل در راستای افق باعث میشد تا در نقاط Concave کانتور هیچ واکنشی نشون نده و در واقع مسیر رو به داخل، طی نکنه و این اولین و عمده ترین اشکال این مدل بود .. به شکل زیر دقیقا نگاه کنید ..


                چه اتفاقی افتاده؟ الگوریتم در اطراف Boundary آبجکت؛ خوب Segmentation رو انجام میده امــا توی نقاط U_Shape ببینید چه رفتاری داره؟ اصلا نمیتونه وارد اون محدوده بشه .. چرا؟ برای اینکه نیروهای داخلی و خارجی همدیگه رو خنثی میکنن یا در راستای افق، جهت قرار میگیرن و هیچ بردار گرادیانی به سمت پایین وجود نداره که بتونه نقطه ی شروع بعدی برای کانتور ما باشه .. اگه بخوایم به صورت کاملا گرافیکی این اتفاق رو بررسی کنیم، باید اون قسمت رو بذاریم زیر ذره بین .. زیر ذره بین؛ رفتار بردارهای گرادیان در اون محدوده خیلی جالب میشه که میتونید اون رو در شکل زیر ببینید ..


                حالا ممکنه بگید این اتفاق با پدیت کردن ضرائب از بین میره یعنی میتونیم کانتور رو وارد نقاط U_Shape بکنیم .. امــا جواب کاملا منفیه .. چون این نیروها به صورت افقی در این محدوده وجود دارن و شما هر کاری بکنید، اینها دست نمیخورن .. اگه برآیندشون هم صفر نشه در یک جهتی به سمت افق قرار میگیرن که نمیشه اونهارو از هم تفکیک کرد یا مولفه ای ازشون پیدا کرد که بشه به سمت پایین براش مسیری تعریف بشه .. کما اینکه خودشون هم از این ایده استفاده کردن و بارها و بارها در آزمایش های مختلف، به این ضرایب دست زدند امــا اتفاقی که افتاده چی بوده؟ هـیــچ .. اصلا نتونستن این مشکل رو بهترش کنن .. یعنی نمیشه گفت این اتفاق به خاطر ناهماهنگی ضرایب؛ یا نا منعطف بودن کانتور افتاده .. خـیـر .. به دلیل اینکه نوع تعریف تابع انرژی بر اساس منطق خاصی بوده این اتفاق افتاده و نمیشه اون رو تغییر داد ..

                از این مشکل که بگذریم؛ به یه مشکل دیگه میرسیم و اون اینکه بردارهای اندازه ی گرادیان ما به محض اینکه یک مقدار از Boundary آبجکت فاصله میگیرن؛ کشته میشن .. یعنی از دست میرن و این اتفاق بده .. چرا بده؟ به دلیل اینکه با مشکل Capture Range روبرو میشیم .. همه ی تلاش Snake اینه که بتونه تا حدودی مستقل از ناحیه ی Initialize شده عمل کنه امــا اینجا میبینیم که اصلا اینطور نیست .. بلافاصله با فاصله گرفتن از Boundary آبجکت؛ نه تنها اثر Capture Range در خارج از آبجکت زیاد نمیشه بلکه داخل خود آبجکت هم کم میشه و اینو دیگه چیکارش بکنیم؟ درسته که اگه Initialization خوب باشه فقط مشکل اول برای ما مطرحه امــا نمیتونیم مورد دوم رو هم ندید بگیریم و باید به فکری باشیم که مورد دوم هم بهتر بشه .. اگه مطلب بالا در مورد Capture Range زیاد شفاف نیست؛ میتونید تصویر زیر رو ببینید .. این تصویر بردارهای اندازه ی گرادیان رو بر روی آبجکت نشون میده .. خوب به شکل دقت کنید ..


                همه ی اونچیزی که توی این شکل هست؛ اندازه ی بردار نیروی خارجیه که همونطور که میبینید؛ در خارج از ناحیه های Boundary کشته شده و فقط دور یه ناحیه ی خاص از اون، مقدار و اندازه داره و این یه پیام خیلی مهم برای ما داره و اون اینکه شما باید نیروی خارجیتون رو هم تغییر بدید تا بتونید این اتفاق رو رفعش کنید یا به بیان ساده تر الگوریتمتون رو برای برطرف کردن مشکل Capture Range بهینه کنید .. حالا ممکنه بگید اگه ما توی اون مرحله ی Smoothing با تغییر سیگمای Blurring بتونیم مقدار گرادیان انرژی خارجی رو که برمیگرده به ماهیت Image ؛ تغییر بدیم (یعنی زیادش کنیم) آیا این مشکل برطرف نمیشه؟ یا لا اقل بهتر نمیشه؟ جواب مثبته یعنی اینکه بهتر میشه امــا همینجا دوباره یه سوال پیش میاد و اون اینکه اگه Image شما Smooth بشه باز هم میتونید به خوبی گذشته Boundary های آبجکت داخل تصویرتون رو به دست بیارید؟ اینجا جواب منفیه .. یعنی هرچی تصویر Smooth تر باشه؛ Resolution به دست آوردن Boundary کمتره و در نتیجه همگرا شدن به Boundary برای مدل ما مشکل تره و این یه اصله که به عنوان Trade off باید بهش توجه کرد ..

                جمعبندی مطالب بالا میشه دو تا مشکل که باید حل بشن: Boundary Concavity و Capture Range .. در ادامه ی این بحث ها دو نفر اومدن یه ایده ی جدید رو باز کردن که میشد بهش تا حدود زیادی اعتماد کرد .. اونا گفتن اگه روی انرژی خارجی کار کنیم، میتونیم مشکل Capture Range رو حل کنیم .. برای حل این مشکل یه Potential Function جدید تعریف کردن که روی محاسبه ی فاصله ی اقلیدسی و Chamfer تمرکز داشت .. این کار باعث شد مشکل Capture Range حل بشه امــا چطور؟ در واقع اینطور به موضوع نگاه کنید که قبلا از Image گرادیان گرفته میشد؛ توی مدل اینا از یه Distance Map .. همین .. این تعریف باعث میشه که مقدار گرادیان در نواحی خارج از آبجکت و در واقع دورتر از اون هم Value داشته باشه و این عاملیه که میتونه مشکل Capture Range رو برطرف کنه .. امــا ما چیزی از مشکل اول نگفتیم .. در واقع این مدل باز هم نتونست دوتا مشکل رو باهم برطرف کنه و فقط متمرکز شد روی یه دونه از اونا .. باز هم مشکل اول سرجاش مونده .. یعنی توی نقاط U_Shape ما هنوز مشکل قبل رو داریم چرا که نتونستیم عنصر جدیدی پیدا کنیم که جهت گرادیان هارو برامون تغییر بده .. هنوز جهت در راستای افق هست و نتونستیم اونهارو به سمت پایین بکشونیم .. فقط و فقط Capture Range بهتر شد .. در واقع یه تبدیلی انجام دادن که فقط روی بالا رفتن اندازه ی گرادیان تاثیر گذاشت و به جهت نیروها کاری نداشت .. شکل زیر این بهتر شدن رو به خوبی نشون میده .. میتونید به دقت اونو ببینید ..


                تا اینجا دوتا مدل از سه تا مدل رو بررسی کردیم .. Traditional و Cohen .. الآن دیگه نوبت GVF هست که در موردش صحبت کنیم .. توی GVF یه اتفاق خیلی خاص افتاده و اون اینکه یه نیروی خارجی جدید برای تابع انرژی تعریف کردن که نامش همون Gradient Vector Flow هست .. این نیرو جانشین چی میشه؟ جانشین همون منفی گرادیان انرژی خارجی ای که توی دوتا مدل قبل روشون صحبت کردیم .. اینجا در واقع توی فرمولیزیشن دست برده شده و این یعنی انتظار برای تغییر در نتیجه ی نهایی .. از اونجایی که V یه مقدار مثبت هست؛ نمیتونه منفی پشت سرخودش توی رابطه ی اویـلـر رو بپذیره و این باعث میشه که رابطه یک مقدار از نظر ظاهر؛ با قبل از این تفاوت داشته باشه ..


                حالا ببینیم از نظر ویژگی این مدل چه خاصیتی داره که باعث شده بتونه مشکل Segmentation رو حل کنه .. کلا توی GVF ما باید دو بخش جداگانه رو بررسی کنیم .. یکی Edge Map و اون یکی هم Gradient Vector Flow .. اول میریم ببینیم این Edge Map چی برای گفتن داره .. این قسمت رو با این بیان شروع میکنیم: رابطه ی تابع انرژی رو به یاد بیارید .. یادتون اومد؟ خــب .. گفتیم که دو قسمت داشت .. یکی انرژی داخلی و دیگری هم انرژی خارجی .. اون قسمت انرژی خارجی رو یادتونه گفتیم برای چی بود؟ برای ..... ؟ برای نزدیک شدن کانتور به Boundary آبجکت .. حالا اگه جای اون انرژی رو با یه تابع Edge Map عوض کنیم؛ چه اتفاقی میوفته؟ یه مقدار فکر کنید ...... خــب .. تابع Edge Map اساسا از چه جنسیه؟ از جنس Edge .. یعنی چی؟ یعنی اینکه تمرکزش روی لبه های تصویره .. حالا اگه جای انرژی خارجی رو با این تابع عوض کنیم, چه اتفاقاتی در مدل ما میوفته؟ اولا: گرادیان این تابع؛ بردارهایی رو به ما میده که به سمت لبه های آبجکت هستن و در واقع راستاشون به صورت نرمال ؛؛ عمود بر مماس خطوط Boundary آبجکت هست .. دوما: بردارهایی که همین الان ازشون گفتیم؛ تنها برای محدوده هایی که نزدیک Boundary آبجکت هستن؛ اندازه ی زیادی دارن .. و سوما اینکه اگه تصویر، (از نظر Color Distribution و البته تقریبی) به صورت یکنواخت باشه؛ گرادیان تابع Edge Map در اون تقریبا صفر میشه ..

                حالا سوال اینه که کدوم یکی از این سه تا اتفاق خوبه و کدوم یکی بده .. اتفاق اول برای ما خوبه چرا که میتونه کانتور ما رو بکشونه به داخل نواحی U_Shape .. پــس این OK هست .. اتفاق دوم خوب نیست؛ چرا که داره Capture Range رو برای ما محدود میکنه .. اتفاق سوم هم خوب نیست؛ چراکه انتظار ما در نواحی یکنواخت اینه که یه Vector Field ای داشته باشیم امــا اینجا اون مقدار برابر صفر میشه و این خوب نیست .. دو اتفاق آخر زیاد تاثیری بر روند Segmentation نداره و میتونیم اونها رو با معادلات Diffusion حل کنیم .. امــا خوبی اتفاق اول به ما کمک میکنه تا مشکل اصلی کانتورهای پارامتریک رو حل کنیم و اون Boundary Concavity شون هست .. این بخشی از کمکی هست که Edge Map میتونه به ما بکنه .. حالا باید ببینیم توی بخش Gradient Vector Flow چه اتفاقی میوفته و باید اونجا به چه چیزهایی توجه کرد ؟ در واقع GVF یه راه حل معادلیه برای رابطه ی زیر ...


                رابطه ی بالا رو یک مقدار بازش کنیم ببینیم چی میگه .. قسمت اول؛ کاملا داره یه نکته رو میگه و اون اینه که اون تیکه نقش یه Smoothing Term رو بازی میکنه .. در واقع این بخش به تنهایی میتونه Vector Field های متغییر تولید کنه و وزنی که برای اون در نظر میگیره بر حسب تابع g بیان میشه .. تابع g ارتباط مستقیم داره با تابع Edge Map ما و کاملا میتونه نشون بده که اگه این مقدار کم یا زیاد بشه؛ چه تغییری توی تولید Vector Field متغییر به وجود میاد .. بخش دوم چی؟ بخش دوم هم نقش Data Term رو بازی میکنه .. یعنی مستقیم با Boundary آبجکت ما سروکار داره .. کاملا هم مشخصه .. تفاضل u با گرادیان تابع Edge Map .. تابع h هم یه وزن برای این بخشه .. در واقع اگه از بالا به فرمول نگاه کنیم دو تا بخش کلی داریم .. یکی مربوط به تولید Vector Field های متغییر با وزن g میشه و اون یکی بخش هم مربوط به حرکت به سمت Boundary میشه .. اون چیزی که توی این رابطه خیلی مهمه وزن هایی هستن که ما برای دو بخش معرفی شده در نظر گرفتیم .. ارتباط مستقیم اونها با Edge Map باعث میشه که با تغییرات Edge Map میزان این وزن ها تغییر کنه و این میتونه از تغییر ناگهانی و شدتی وزن ها به صورت غیر متناسب جلوگیری کنه ..

                برای اینکه بتونن معادله ی بالا رو حل کنن؛ برای ضرایب دوتا مقدار خاص در نظر میگیرن ..


                وقتی که g رو برابر یه مقدار ثابت میگیریم این منظور رو داریم که Smoothing به صورت یکنواخت در همه جا رخ بده (روی Vector Field ها) و وقتی ضریب h رو با اندازه ی گرادیان تابع Edge Map متناظر میکنیم تنها و تنها منظورمون اینه که میخوایم با نزدیک شدن به Boundary میزان این ضریب رو افزایش بدیم .. حالا تحلیل این اتفاق ... نتیجه ای که با داشتن این دو ضریب میتونیم از مدل کانتورمون بگیریم کاملا میتونه مارو به سمت لبه ها حرکت بده و Segmentation رو برامون انجام بده ولی یه مشکل داره و اون اینکه چون ضریب g ثابته؛ در نتیجه Smooth شدن Vector Field ها در همه جا یکسانه و این باعث میشه که اگه دوتا لبه ی نزدیک به هم داشته باشیم؛ مثلا فرض کنید مثال ما حکم یه ناحیه ی U_Shape بسیار تنگ رو داشته باشه و بخوایم کانتورمون وارد اون محدوده بشه .. با فرض Smoothing یکنواحت برای Vector Field هامون، کانتور نمیتونه از اون نقطه ی U_Shape به داخل حرکت کنه و همون وسطا میمونه .. مثالی که میشه زد رو در شکل زیر ببینید .. یکی خود آبجکته و اون یکی هم دیاگرام Vector Field اونه ..


                حالا این اتفاق چطوری بهتر میشه؟ باید اون فرم یکنواخت g رو یه طوری متناسب کنیم با تابع Edge Map به طوریکه وقتی اون تغییر میکنه؛ ضریب g هم عوض بشه و طبیعتا باید کم بشه تا بتونه به داخل ناحیه ی U_Shape وارد بشه .. خـب .. چی فکر میکنید؟ مقدار زیر رو ببینید ..


                الان این مقدار خیلی مقدار خوبیه .. چرا؟ چون به ازای اون جایی که g کم میشه؛؛ h زیاد میشه و برعکس .. این خوبه .. خیلی هم خوبه .. اون ضریب ثابت K هم در واقع یه Trade Off هست بین اینکه شما چقدر براتون Field Smooth مهم باشه و چقدر گرادیان لبه ای .. در پایان هم میتونید نتایج این مدل رو روی مدل تست شده ی معروف ببینید .. دقیق به شکل ها نگاه کنید و سعی کنید براشون توجیه پیدا کنید .. امیدوارم مطالب بتونه کمکتون کنه .. هر جاییش رو من بد توضیح دادم یا شما سوال داشتید بگید تا روش صحبت کنیم .. موفق باشید ..


                دوستان! مدتی کمتر به سایت میام ..

                دیدگاه


                  #83
                  پاسخ : کمک درباره مقاله GVF

                  سلام ..

                  درست هست که این پست کمی قدیمیست؛ امــا بهتر شاید این باشه که چند کد برای جمع بندی مطالب مطرح شده؛ در این پست (و امیدوارانه در پست های بعد) ضمیمه بشن .. امید آنکه این فایل ها بتونن به بحث های مطرح شده، کمک بیشتری کنند .. موفق و سلامت و شاد باشید ..
                  فایل های پیوست شده
                  دوستان! مدتی کمتر به سایت میام ..

                  دیدگاه


                    #84
                    پاسخ : کمک درباره مقاله GVF

                    سلام ..

                    فایل هایی که در انتهای این پست ضمیمه شدند، با هدف جمعبندی مطالب مطرح شده در این تاپیک، در این بخش قرار گرفتند .. کد و رفرنس های مربوط به الگوریتم GVF و البته یک Book Chapter بسیار خوب در این زمنیه که برای پایان نامه ها، سمینار ها و تحقیقات خیلی میتونه مفید باشه اطلاعات مطرح شده در اون به همراه صفحه ی اصلی پیشقدم در این زمینه .. امیدوارم که این فایل ها بتونن برای بحث های مطرح شده مفید باشن .. موفق و سلامت و شاد باشید ..
                    فایل های پیوست شده
                    دوستان! مدتی کمتر به سایت میام ..

                    دیدگاه


                      #85
                      پاسخ : کمک درباره مقاله GVF

                      با سلام و تشکر از مطالب مفیدی که در این تاپیک گذاشتین.
                      موضوع پایان نامه من در رابطه با همین مطالب است. من با برنامه GVF_Source_Code که گذاشتین مشکلی دارم که امیدوارم در حلش به من کمک کنید.
                      من این برنامه را با عکسهای خودم که run میکنم اصلا خوب کار نمیکند. من باید تصاویر مربوط به جنین های انسانی رو segment کنم. موقعیت و اندازه کانتور اولیه روی تصویرم رو تغییر دادم ولی snake درست عمل نمیکند.( تصویر 239*254 پیکسل)
                      کد:
                         x =120 + 110*cos(t);
                         y = 128 + 110*sin(t);
                      نمی تونم بفهمم که مشکلش از چیه :sad: هر چی که هست از تابع snakedeform ناشی شده که نمی دونم به چه دلیلی snake رو درست deform نمیکنه.
                      منتظر کمک شمام
                      چطور میتونم تصویر رو ضمیمه کنم؟!
                      با تشکر

                      دیدگاه


                        #86
                        پاسخ : کمک درباره مقاله GVF

                        سلام ..

                        ممنون از مطرح کردن سوالتون در بخش مناسب .. برای پلود کردن تصاویر نیاز به یک پلود سنتر مانند این آدرس دارید و پس از پلود تصویر؛ لینک مستقیم رو (اولین لینیکی که پس از پلود در آدرس بالا براتون مشخص میشه) پس از انتخاب این گزینه که در زمان نوشتن پاسخ نمایان هست، در بین کدهای ایجاد شده وارد کنید .. برای مثال .. موفق و سلامت و شاد باشید ..

                        چطور میتونم تصویر رو ضمیمه کنم؟!
                        دوستان! مدتی کمتر به سایت میام ..

                        دیدگاه


                          #87
                          پاسخ : کمک درباره مقاله GVF

                          سلام
                          مرسی از راهنماییتون
                          من عکسی که باید سگمنت کنم میذارم. در مورد مشکلی که مطرح کردم، یه سری تغییر در برنامه دادم که باز هم برنامه درست کار نمی کنه. نتیجه ای که گرفتم رو هم می گذارم.
                          تصویر مربوط به جنین



                          نتیجه ای که از برنامه میگیرم!


                          با توجه به اینکه برای تابع GVF، نگاشت لبه را به این صورت استفاده کردم
                          کد:
                          f = gaussianBlur(I,2.5);
                          ممنون از توجه شما

                          با تشکر

                          دیدگاه


                            #88
                            پاسخ : کمک درباره مقاله GVF

                            سلام ..

                            کانتور، باید کدام محدوده رو سگمنت کنه .. پیرامون این سه (تقریبا!) نیم دایره یا اینکه هر کدوم از اونها رو؟ برای مثال، تصویر زیر؛ میتونه حدود حرکت کانتور باشه یا خیر؟ ممنون .. موفق و سلامت و شاد باشید ..

                            دوستان! مدتی کمتر به سایت میام ..

                            دیدگاه


                              #89
                              پاسخ : کمک درباره مقاله GVF

                              سلام
                              بله همونطور که خودتون اشاره کردین غشای پیرامون این سه سلول باید سگمنت شود،تقریبا به این صورت :



                              سلام
                              من کد GVF_Source_Code رو که در پست های قبل گذاشته بودین و برای شکلهای باینری بود با کمی تغییرات اجرا کردم ولی snake رو درست deform نمیکنه.

                              دیدگاه


                                #90
                                پاسخ : کمک درباره مقاله GVF

                                سلام ..

                                از اونجایی که الگوریتم GVF همه ی تلاش و تمرکزش بر روی این موضوع هست؛ که کانتور رو به سوی لبه ها سوق بده؛ شاید جالب نباشه اگر برای این منظوری که شما دارید؛ از اون استفاده کنیم .. منطقی که GVF با اون زندگی میکنه این هست که هر لبه ای که در مسیر گرادیان ها دیده بشه؛ باید تحت تاثیر و پوشش کانتور نهایی قرار بگیره با این منظور که کانتور به نواحی مختلف نفوذ کنه و Segmentation نهایی رو در هر Iteration خودش کامل و کامل و کاملتر انجام بده .. بنابراین؛ اگر از GVF انتظار داشته باشیم؛ که در خارج یک محدوده بمانه و به درون لایه های احتمالی Object نفوذ نکنه؛ یک مقدار سخت هست که بتونیم امیدوار باشیم به نتیجه ی مطلوب .. در طرف دیگه؛ اصل برآیند نیروهای لبه ها که با استفاده از افزایش و کاهش وزن ها؛ منجر به حرکت کانتور به سوی لبه های Concave میشه، همه ی آرزو و امیدش این هست که از نقاط U_shape بتونه کانتور رو عبور بده و به درون حفره ها و/یا نقاط "اینفیمم" پا بذاره و به Segmentation کمک کنه .. بنا به این استدلال، شاید مستقل از Initialization کانتور؛ نتیجه ای که از اجرای این الگوریتم بر روی تصویرتون میگیرید؛ به نوعی منطقی و قابل درک باشه .. الگوریتم های دیگری هم هستن که شاید در نظر اول بتونن این مشکل رو برای ما حل کنن .. برای مثال یک الگوریتم بسیار خوب (نه البته برای Application شما) در زمینه ی کانتورها، PIG یا Poison Inverse Gradient هست که در سال 2008 منتشر شده .. انگیزه ی اصلی این گروه برای کار بر روی کانتورها و البته منتشر کردن این مقاله این بود که اونها ادعا میکردند: نکته ای که در Active Contour ها هنوز به عنوان یک مساله ی باز مطرح هست؛ اینه که چطور کانتور اولیه رو Initialize کنیم .. بیشتر انتقادی که داشتند هم برمیگشت به اینکه کانتور نباید به صورت Manual مقدار دهی اولیه بشه و این کار چه بهتر، هوشمندانه تر و البته معقول تر هست اگر اتوماتیک صورت بگیره .. بنابراین متدی رو در این مقاله پیشنهاد کردند که در نوع خودش بسیار جالب و نوین بود که هم برای تصاویر 2D و هم برای تصاویر 3D قابل اجرا و پیاده سازی بود .. یک الگوریتم دیگر هم هست که یک سال پیش از انتشار مقاله ی بالا، در سال 2007 منتشر شد و یک Challenge بسیار خوب بود برای مقابله و پیشی گرفتن از GVF .. ایده ای که این مقاله با اون آغاز میشه؛ این هست که عنوان میکنن که GVF از نظر محاسباتی؛ هزینه ی بالایی داره؛ و در بسیاری موارد نمیونه اون طور که باید، همگرا بشه بر روی لبه ها و نکته ی آخر و شاید مهمتری که بر روی اون تاکید داشتند هم این بود که GVF در محیط ها و تصاویر نویزی بسیار ضعیف عمل میکنه و باید برای این موضوع فکری کرد و ایده ای داد و این مقاله همون فکرها و ایده هاست .. نام الگوریتم VFC یا Vector Field Convolution هست و در انتهای مقاله؛ نتایج و یک سری مثال هایی بیان شده که مزیت این الگوریتم رو در برابر GVF به خوبی نشون میده ..

                                امــا برای Application ای که مطرح کردید؛ شاید خیلی بهتر این باشه که به Region Segmentation فکر کنیم و البته با استفاده از Active Contour ها (در صورت امکان!) .. در سال 2001؛ ایده ای مطرح شد در این زمینه که Object هایی که لبه های اونها با استفاده از گرادیان شناسایی نمیشن، چطور میتونن توسط کانتورها تشخیص داده بشن و به بیان دیگه detect بشن با این هدف که جزء ناحیه ی Segmentation قرار بگیرن .. این سوال و ایده منجر به انتشار مقاله ای با نام Active Contours Without Edges شد که الگوریتم معرفی شده در اون؛ با نام غیر رسمی Chan-Vese شناخته میشه در بین ایده های کانتورها .. هدف اصلی این الگوریتم؛ به نوعی Region Segmentation هست و از این جهت شاید بتونه به Applicaation شما کمک کنه .. به عنوان مثال؛ با کمی تغییرات و Pre-Processing بر روی تصویر؛ موفق به نتیجه ی زیر میشیم ..


                                اینکه چطور الگوریتم کار میکنه و ایده های احتمالی برای Modify کردن اون و تست های بیشتر شاید با بررسی کد و رفرنس این الگوریتم؛ بهتر مشخص بشه .. در پایان این پست؛ مطالب مربوط به الگوریتم های PIG و VFC (کد و رفرنس) ضمیمه شدند .. دقت کنید که در بین پیاده سازی هایی که این گروه انجام دادن؛ پیاده سازی GVF هم قرار داره و این کار رو انجام دادن برای اینکه بتونن در مقاله ی منتشر شده؛ نتایج مقایسشون رو بهتر و مستدل تر ارائه بدن .. بعلاوه؛ رفرنس و کد مربوط به الگوریتم Chan-Vese هم در کنار فایل های بالا ضمیمه ی انتهایی این پست هستند .. امید که مطالب مطرح شده بتونن براتون مفید باشن .. موفق و سلامت و شاد باشید ..
                                فایل های پیوست شده
                                دوستان! مدتی کمتر به سایت میام ..

                                دیدگاه

                                لطفا صبر کنید...
                                X