اطلاعیه

Collapse
No announcement yet.

پردازش تصویر،از صفر تا هر جا که همکاری کنین ...

Collapse
این موضوع برجسته شده است.
X
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    #31
    پاسخ : پردازش تصویر،از صفر تا هر جا که همکاری کنین ...

    >> reza1b=medfilt2(reza1n);
    ??? A must be a 2-D real uint8, uint16, or double array.

    Error in ==> C:\MATLAB6p1\toolbox\images\images\private\ordfa.d ll
    Error in ==> C:\MATLAB6p1\toolbox\images\images\ordfilt2.m
    On line 67 ==> B = ordfa(A, order, offsets, [padSize padSize] + 1, originalSize);

    Error in ==> C:\MATLAB6p1\toolbox\images\images\medfilt2.m
    On line 53 ==> b = ordfilt2(a, order, domain, padopt);


    اگه میشه بگین دستور من چه ایرادی داره که این پیقامو داده

    و بگین چه جوری میشه با مطلب از پورت پرینتر خروجی گرفت
    واقیاتش یه موضوع در این مورد تو سایت بود که نتونستم بازش کنم

    دیدگاه


      #32
      پاسخ : پردازش تصویر،از صفر تا هر جا که همکاری کنین ...

      از hist هم میتونید کمک بگیرید

      دیدگاه


        #33
        پاسخ : پردازش تصویر،از صفر تا هر جا که همکاری کنین ...

        نوشته اصلی توسط reza_sakhavati
        >> reza1b=medfilt2(reza1n);
        ??? A must be a 2-D real uint8, uint16, or double array.

        Error in ==> C:\MATLAB6p1\toolbox\images\images\private\ordfa.d ll
        Error in ==> C:\MATLAB6p1\toolbox\images\images\ordfilt2.m
        On line 67 ==> B = ordfa(A, order, offsets, [padSize padSize] + 1, originalSize);

        Error in ==> C:\MATLAB6p1\toolbox\images\images\medfilt2.m
        On line 53 ==> b = ordfilt2(a, order, domain, padopt);


        اگه میشه بگین دستور من چه ایرادی داره که این پیقامو داده

        و بگین چه جوری میشه با مطلب از پورت پرینتر خروجی گرفت
        واقیاتش یه موضوع در این مورد تو سایت بود که نتونستم بازش کنم
        سلام.
        میشه بگید شما میخواهید چیکار کنید؟ این دستوری که شما استفاده کردید نیاز به دو تا ماتریس دیگه هم داره برای همین ایراد میگیره.(من تا حالا ازش استفاده نکردم میشه بیشتر توضیح بدید؟)
        موفق باشد.
        شأن انسان در ایمان و هجرت و جهاد است و هجرت، مقدمهآ‌ی جهاد فیآ‌سبیلآ‌الله.
        هجرت، هجرت از سنگینیآ‌هاست و جاذبهآ‌هایی که تو را به خاک میآ‌چسباند.
        چکمهآ‌هایت را بپوش، رهآ‌توشهآ‌ات را بردار و هجرت کن.

        دیدگاه


          #34
          پاسخ : پردازش تصویر،از صفر تا هر جا که همکاری کنین ...

          این دستور تو صفحه 1 همین تایپیک بود
          اون قسمتی که دونه های برنج رو فیلتر میکنه . من قدم به قدم دستورها رو انجام داده(کپی - پست کردم) ولی به اونجا که رسید ارور داد


          و بگین چه جوری میشه با مطلب از پورت پرینتر خروجی گرفت
          دستوراشو میخاما !!

          دیدگاه


            #35
            پاسخ : پردازش تصویر،از صفر تا هر جا که همکاری کنین ...

            سلام.
            قبل از اینکه اون فیلتر رو اعمال کنید باید ماتریس دو بعدی باشه نه سه بعدی، اگه سه بعدی هست با دستور rgb2gray اون رو دو بعدی کنید بعد فیلتر رو اعمال کنید.
            ----
            در مورد پورت موازی هم یه زمانی یکی از دوستان پگیرش بود خاطرم نیست توی انجمن و کامپیوترم میگردم ببینم چیزی پیدا میکنم یا نه.
            موفق باشید.
            شأن انسان در ایمان و هجرت و جهاد است و هجرت، مقدمهآ‌ی جهاد فیآ‌سبیلآ‌الله.
            هجرت، هجرت از سنگینیآ‌هاست و جاذبهآ‌هایی که تو را به خاک میآ‌چسباند.
            چکمهآ‌هایت را بپوش، رهآ‌توشهآ‌ات را بردار و هجرت کن.

            دیدگاه


              #36
              پاسخ : پردازش تصویر،از صفر تا هر جا که همکاری کنین ...

              سلامی گرم خدمت اساتید.
              از مدیریت محترم تقضا دارم اگر می شود به فایل pdf که در سایت قرار دادید یک مثال عملی در برنامه ی مطلب نیز اضافه کنید خیلی بهتر و عملی تر می باشد.
              ار تمام اساتید که در این بحث یاری جوی مبتدیان بودن کمال تشکر را دارم. :bye
              دکتر چمران در 1311 در تهران متولد شد
              وی در زمان اقامت در آمریکا انجمن اسلامی آمریکا را تأسیس کرد که منجر به قطع بورسیه وی توسط شاه شد.
              او با اینکه یکی از دانشمندان مطرح آمریکا به حساب می آمد بدون توجه به مدرک به مصر رفت و آموزش نظامی دید.

              دیدگاه


                #37
                پاسخ : پردازش تصویر،از صفر تا هر جا که همکاری کنین ...

                سلام.... مبحث خیلی خوبیه از دوستانی که زحمت تهیه اش رو کشیدن ممنونم و امیدوارم ادامه پیدا کنه :job:

                دیدگاه


                  #38
                  پاسخ : پردازش تصویر،از صفر تا هر جا که همکاری کنین ...

                  سلام ..

                  در بسیار ی از کاربردها و طرح های پردازش تصویر؛ اولین مرحله ای که برای پیاده سازی معمولا به اون فکر میکنیم این هست که به صورتی تصویرمون رو از ظاهری که داره تغییر بدیم؛ و تا حدودی اون رو به کاربردی که در ذهنمون هست، نزدیک کنیم .. برای مثال؛ گاهی تصویر ما بسیار تاریک هست (Brightness تصویرمون کم هست) و دنبال این هستیم که کمی تصویر رو روشن تر کنیم .. یا برخی مواقع لازم هست که تصویرمون رو نرم (Smooth) کنیم؛ به این معنا که تصویر رو از حالتی که در اون لبه ها خیلی تیز (Sharp) هستن به تصویری که در اون توزیع پیکسل ها به نحوی تغییر کردن و همین موضوع باعث نرم شدن لبه ها و تغییر در شدت میزان رنگی پیکسل ها (Contrast پیکسل ها) و در نتیجه نرم شدن تصویر میشه؛ تغییر بدیم .. یا برخی مواقع لازم هست که عکس این عمل رو انجام بدیم و به نوعی ارزش لبه های موجود در تصویر برای ما مهم هست و همه ی تلاش و امیدمون این هست که با پیاده سازی دستوراتی؛ لبه ها رو مشخص تر و قابل تشخیص تر کنیم و در اصطلاح به Sharpness تصویر کمک کنیم .. در چنین شرایطی که میتونه هر قسمت طرح هامون اتفاق بیوفته (بیشتر مواقع در آغاز کار بر روی تصاویر؛ به عنوان پیش-پردازش یا Pre-Processing) میتونیم از فیلترها کمک بگیریم تا ما رو به این هدف برسونن .. هر تصویر (دیجیتال) تشکیل شده از پیکسل هایی که دارای اطلاعات رنگی هستن (به فضای رنگی فعلا کاری نداریم) و اگر خیلی خاص بر روی تصاویر خاکستری یا Gray Scale صحبت کنیم؛ (--که از نظر ابعاد ماتریس؛ ماتریس های دو بعدی هستن--) به هر درایه ی ماتریسی که تصویر ما در اون ذخیره شده؛ یک عدد یا شناسه ی رنگی متناظر میشه (بین 0 تا 255) که هویت و شخصیت اون پیکسل رو تشکیل میده و با در کنار هم قرار گرفتن این درایه ها (با مقادیر رنگی متفاوت) هست که تصویر ما شکل میگیره و ساخته میشه؛ یعنی اون چیزی که ما به عنوان تصویر دیجیتال میبینیم و قرار هست که با اون کار کنیم؛ تشکیل شده از ماتریسی از شنایه های رنگی، که هر کدام برای خودشون معنا و تعریفی دارن و نبود هرکدام از اونها میتونه به تصویر آسیب بزنه و درکیفیت نهایی تصویر تاثیرگذار باشه .. برای مثال؛ در تصویر زیر، بخشی از ماتریس تصویر نمونه ی سمت چپ رو میتونیم با هم مشاهده کنیم ..


                  از آنجایی که تصاویر دیجیتال؛ از پیکسل هایی با مقادیر مشخص تشکیل شدن؛ این امکان برای ما فراهم هست تا هــر تابعی رو که در نظر داریم، بتونیم بر روی تصویر اعمال کنیم، با این معنا که مقادیر پیکسل؛ ورودی های تابع ما هستن (--جای X می نشینن--) و خروجی تابع هم؛ مقادیر تازه برای پیکسل های تصویر خروجی (نتیجه) محسوب میشن .. همین نوع نگاه به مساله رو اگر کمی بچرخونیم و به نوعی تعمیم بدیم؛ میتونیم به سمت اعمال فیلتر بر روی تصاویر حرکت کنیم .. فرض کنیم؛ این بار قصد اعمال کردن تابع بر روی نه تنها یک پیکسل (پیکسل Xi) رو داشته باشیم، بلکه بر روی پیکسل هایی که در همسایگی همین پیکسل (پیکسل Xi) هستن، هم تمرکز کنیم، به این معنا که پیکسل نمونه ی Xi رو با پیکسل های در همسایگی اون؛ همگی رو باهم در نطر میگیریم .. اتفاقی که پیش میاد اکنون رو معمولا به پردازش پیسکل های همسایه یا Neighborhood Processing تعبیر میکنن و میشناسن و علتش هم به اینگونه استدلال میکنن که قرار هست "هــر" (--به صورت ایده آل؛ به این معنا که در همسایگی پیکسل نونه ی Xi؛ پیکسل های دیگری هم باشن در هـمـه ی اطراف--) پیکسل نمونه ی Xi که انتخاب میشه؛ از اطلاعات پیکسل های همسایه ی خودش به نحوی استفاده کنه و در مختصات مشابه در تصویر خروجی؛ این نــوع استفاده اعمال بشه .. ایده ی اصلی این کار هم که معمولا در پردازش تصویر از اون به وفور استفاده میکنند و خیلی هم پر طرفدار هست؛ استفاده از یک پنجره یا Mask متحرک بر روی تصویر و اسکن کردن تصویر با اون ماسک هست .. (--منظور از اسکن کردن هم، حرکت دادن این پنجره از گوشه ی آغازین سمت چپ، تا گوشه ی پایانی سمت راست تصویر هست--) .. خاصیت های مرسوم (--و نــه الـزامـی--) این ماسک؛ طول و عرضی با ابعاد فرد، و شکلی مستطیل یا مربع (ایده آل) هست .. با حرکت دادن این ماسک بر روی تصویر، و محاسبه ی پیکسل های خروجی که از در نظر گرفتن پیکسل های همسایه و مشخصات ماسک به دست میان؛ نتایج ما المنت به المنت تولید میشن و از در کنار هم قرار دادن این المنت ها (پیکسل های نتیجه)؛ تصویر خروجی ما به دست میاد و ساخته میشه .. مهم: ترکیب ماسک و تابعی که بر روی پیکسل ها اعمال میشه رو در ادبیات پردازش تصویر؛ "فـیـلـتـر" نامگذاری میکنن .. برای روشن شدن بهتر موضوع؛ شاید تصاویر زیر بتونن خیلی مفید باشند ..


                  دقت کنید که در تصویر بالا، شکل سمت چپ، پیکسل نمونه ی Xi به همراه پیکسل های همسایه و مجاور اون نمایش داده شدن و در شکل سمت راست هم، مقدار خروجی و نهایی پیکسل نمونه ی تولید شده ی Xi پس از اعمال فیلتر (حرکت ماسک و اعمال تابع) مشخص شدند .. یک نکته ی کوتاه و مهم دیگر هم اینکه در ماسکی که در شکل بالا مشخص شده، هیچ عددی (ضریبی/تابعی) نوشته نشده و این امر هرگز به اون معنا نیست که این ماسک فقط و فقط یک پنجره ی معمولی متحرک (--همانند یک شیشه ی شفاف و بدون تاثیر--) بر روی تصویر هست .. خـیـر! در ادامه ی همین پست؛ این تصویر کاملتر مورد بررسی قرار میگیره که میتونه به جمعبندی بهتر مطالب کمک کنه .. نکته ی کوتاه دیگری که شاید بتونه فرصت مطرح شدنش وجود داشته باشه؛ این هست که اگر تابعی که بر روی پیکسل ها (مقادیر رنگی "خاکستری" --تصویر Gray Scale منظور هست--) اعمال میکنیم؛ خطی باشه، فیلتر رو خطی مینامیم و اگر این تابع غیرخطی باشه؛ فیلتر رو غیرخطی .. دقت مهم: اگر المنت های ماسک (همون عددها/ضرائبی که در بالا ازشون صحبت کردیم) رو با پیکسل های همسایه ای که الان ماسک بر روی اونها قرار داره (--مثل یک ابر مستطیل شکل که بر بالای پیکسل نمونه ی Xi و پیکسل های در همسایگی اون سایه انداخته--)؛ المنت به المنت ضرب کنیم و در پایان؛ مقادیر به دست آمده رو با هم جمع کنیم و به عنوان مقدار تازه ی پیکسل Xi در تصویر خروجی اعلام؛ این زمان هست که موفق به پیاده سازی یک فیلتر خطی بر روی تصویرمون شدیم .. امــا برگشت به ضرائب ماسک و حرکت به سوی جمعبندی مفاهیم فیلتر .. فرض کنیم ماسکی که به عنوان نمونه داریم؛ ضرائب اون رو با مقادیر زیر کدبندی کرده باشیم (--خیلی معمولی؛ قصد داریم که اونها رو به صورت پارامتری نشون بدیم--) ..


                  در پیاده سازی واقعی؛ مقادیر پارامتری بالا، به ازای هر i و j یک ضریب یا عدد دریافت میکنن که در ادامه ی همین پست (بخش پیاده سازی) چند نمونه از اونها رو هم باهم میبینیم .. تصویر بالا؛ ماسک مورد نظر ما .. تصویر پایین؛ 15 پیکسلی که این ماسک بر روی اونها قرار گرفته و به تعبیری سایه انداخته ..


                  و در پایان هم، رابطه ای که از اون صحبت کردیم؛ ضرب المنت به المنت مقادیر ماسک با پیکسل های متناظر که در زیر هر المنت ماسک قرار دارند و در نهایت هم جمع همه ی این ضرب ها (--مرور نحوه ی محاسبه ی مقادیر تازه برای هر پیکسل در رابطه ی بالا--) ..


                  و این رابطه باید برای همه ی پیکسل های تصویر تکرار بشه تا فیلتر دیجیتال (گسسته) بتونه بر روی تصویر خروجی ما اثر خودش رو به صورت کامل بگذاره .. امــا کمی دقیقتر اگر به رابطه ی بالا نگاه کنیم؛ شاید سریع به یاد یک رابطه ی دیگر بیوفتیم که خیلی شباهت زیادی داره با این رابطه .. در حقیقت رابطه ای که در بالا تعریف کردیم؛ با کانولوشن (Convolution) به نوعی هم راستا و هم مسیر هست با این تفاوت که در کانولوشن؛ پیش از هر کاری؛ لازم هست که فیلتر رو 180 درجه بچرخونیم و سپس مراحل ضرب و جمع کردن مقادیر باهم رو انجام بدیم .. بر طبق Notation های بالا؛ میتونیم خروجی کانولوشن، با ماسک مشابه (نامبرده شده در دو تصویر قبل) رو برای پیکسل نمونه ی Xi به صورت زیر تعریف کنیم:


                  و امــا مثال: فرض کنید که قصد این رو داشته باشیم که یک فیلتر مـیـانـگـیـن گـیـر (average) با پنجره ی 3*3 بر روی تصویر اعمال کنیم .. کاری که این فیلتر انجام قرار هست که بده؛ این هست که از پیکسل هایی که در زیر (سایه ی ابــر) ماسک ما قرار میگیرند؛ میانگین بگیره و خروجی رو به عنوان پیکسل نهایی اعلام کنه .. طبق تعریف میانگین 9 عدد در علم حساب (--چراکه پنجره ی ما اکنون 3*3 هست و درنتیجه تعداد پیکسل ها 9 خواهد بود--)؛ باید جمع کنیم همه ی این پیکسل ها رو با هم و در نهایت هم بر 9 تقسیم .. این تعریف محاسباتی ای هست که انتظار اون رو داریم .. همین تعریف رو لازم هست که با تعریف فیلتر که در بالا از او صحبت کردیم؛ وفق بدیم و پیاده سازی و اجرا کنیم .. در اون رابطه امــا چیزی به نام تقسیم نداریم؛ هرچه که هست ضرب هست و جمع .. بنابراین لازم هست که از تکنیکی استفاده کنیم که تنها با عملیات ضرب و جمع بتونه میانگین رو به عنوان خروجی برای ما تولید کنه؛ روشی مشابه تصویر زیر:


                  رابطه ی بالا رو اگر کمی باز کنیم و تعمیم بدیم؛ به این نکته میرسیم که "ضریب" 1/9 در پیکسل اول ضرب میشه؛ "ضریب" 1/9 در پیکسل دوم ضرب میشه؛ "ضریب" 1/9 در پیکسل سوم ضرب میشه و همینطور تا "ضریب" 1/9 در پیکسل نهم لازم هست که ضرب بشه و در پایان همه ی این اعداد با هم جمع بشن .. این ایده دقیقا معادل این هست که ما از ماسکی شبیه زیر استفاده کنیم (به واژه های "ضریب" در جملات قبل خوب دقت کنید .. شاید بهتر این باشه که این ماسک رو با ماسک پارامتری بالا مقایسه کنید و طبق رابطه ی تعریف شده ی فیلتر، المنت به المنت محاسبات رو برای یک پنجره انجام بدید) ..


                  اتفاقی هم که در عمل پیش میاد برای پیکسل های تصویر وقتی که ماسک بر روی اونها قرار میگیره؛ رو به صورت شهودی در تصویر زیر میتونید مشاهده کنید .. در این تصویر؛ مستطیل آبی رنگ؛ همون ماسک ما هست؛ اعداد، مقادیر رنگی پیکسل های تصویر خاکستری ما هستن و "ضرایب" 1/9 قید نشدن در این تصویر و مرور اونها در ذهن باید انجام بشه .. (--شش مرحله ی ابتدایی، در این تصویر نشون داده شدند، امــا روند حرکت پنجره به همین ترتیب ادامه پیدا میکنه تا ماسک به گوشه ی پایین، در سمت راست ماتریس تصویر برسه--) ..


                  با اجرای دستورات زیر در نرم افزار MATLAB همه ی مطالبی رو که در بالا به اونها اشاره کردیم، میتونیم به زبان پیاده سازی شده ببینیم .. (--در تصویر بعد هم؛ نتیجه ی اعمال دستورات رو میتونید مشاهده کنید--) ..


                  نـتـیـجـه ی اعـمـال دسـتـورات

                  به عنوان مثال دوم؛ تصویرمون رو با ایـن مـاسـک (Kernel) فیلتر میکنیم .. همونطور که در این تصویر مشاهده میکنید؛ این بار؛ Mask ای که از اون استفاده میکنیم؛ متفاوت با ماسک میانگین گیر هست و در نتیجه؛ تصویر خروجی ما هم متفاوت خواهد بود با مثال قبل .. امــا در ابتدا دستورات و بعد هم مشاهده ی نتیجه ..


                  نـتـیـجـه ی اعـمـال دسـتـورات

                  تا به اینجا؛ مفهوم فیلتر و اون چیزی که در حقیقت اتفاق میوفته بر روی تصویر؛ وقتی که از فیلتر صحبت میکنیم در پردازش تصویر؛ رو بررسی کردیم و شاید خیلی بهتر این باشه که به برخی از دستورات پایه ای و تعریف شده ی اون در نرم افزار MATLAB هم اشاره کنیم .. دستوراتی که این کار رو برای ما انجام میدن؛ filter2 و imfilter هستن .. تفاوتی که بین filter2 و imfilter هست (جدای از جابه جا شدن کرنل و تصویر)؛ در مرحله ی اول، نوع پارامترهایی هست که هر کدام از اینها دریافت میکنن و در مرحله ی دوم هم اینکه خروجی imfilter همیشه کلاسی مشابه کلاس سیگنال ورودی هست امــا خروجی filter2 همیشه double .. به عنوان نمونه؛ اولین مثالی رو که در بالا انجام دادیم (فیلتر میانگیر گیر) رو میتونیم مستقیما با این دستورات هم پیاده سازی کنیم و نتیجه ی مشابهی هم بگیریم ..


                  نـتـیــجـه ی اعـمـال دسـتـورات

                  نکته ی خیلی کوتاه در مورد تصاویر بالا و پارامتر same .. اگر دستورات بالا رو اجرا کردید؛ امــا در تصویر نتیجه؛ خطوطی شبیه کادر، اطراف تصویرتون به وجود آمد؛ به اون معنا نیست که خطا پیش آمده در کار شما یا اجرای دستورات .. در حقیقت هر دوی دستورات؛ تصویر رو زمانیکه فیلتر میکنن؛ با سایز هم اندازه ی تصویر ورودی؛ خروجی رو بر میگردونن و از این جهت؛ در دور تصویر بالا؛ به این دلیل که یک بخش ماسک، بیرون تصویر قرار میگیره و در نتیجه پیکسل های همسایه ای نداره (--در چند خط بالاتر هم در این مورد صحبت کردیم خیلی کوتاه--)؛ فیلتری هم صورت نمیگیره؛ و به همین دلیل برای جبران این نواحی خالی؛ تابع اونها رو با مقدار صفر مقدار دهی میکنه و به همین دلیل هم کادری رو در تصویر خروجی میبینیم .. امــا در دو تصویر بالا؛ این کادر رو حذف کردیم (--در زمان نشان دادن نتیجه، از مختصاتی خاص تا مختصاتی خاص، نمایش رو انجام دادیم--) به این منظور که بتونیم مقایسه ی بهتر و دقیق تری داشته باشیم با نتایجی که با دستورات مستقیم ابتدای این پست به دست آمدند .. برای انتخاب kernel هم آزاد هستیم و میتونیم هم خودمون اونها رو تعیین کنیم و هم از برخی kernel های پیش فرض نرم افزار MATLAB استفاده کنیم .. دستوری که در اینجا میتونه به کمک ما بیاد؛ دستوریست با نام fspecial که میتونیم با اون کرنل های پیش فرض مختلفی رو تعریف کنیم .. آرگومان هایی که این تابع به عنوان ورودی دریافت میکنه؛ نام kernel و مشخصات احتمالی اونها هست (--کرنل ها میتونن برای مثال average یا laplacian یا LoG یا Gaussian و یا نمونه های دیگری باشن--).. به عنوان مثال میتونیم از کرنل میانگیر گیر (فیلتر) استفاده کنیم؛ امــا این بار با استفاده از تابع fspecial ..


                  نـتـیـجـه ی اعـمـال دسـتـورات

                  همانطور که در بالا هم اشاره کردیم؛ از kernel های دیگری هم میتونیم استفاده کنیم (جستجوی fspecial در Help نرم افزار MATLAB رو حتما انجام بدید) که شاید تست اونها؛ به نوعی تمرین خوبی باشه برای تسلط بیشتر بر این دستورات و همچنین مشاهده و بررسی نتایج اونها .. و نکته ی آخر در مورد فیلترهای غیر خطی .. در نرم افزار MATLAB دستوری هست برای این کار با نام nlfilter (سرعت اجرای آهسته ای داره، البته) .. آرگومان هایی که نیاز داره این تابع؛ ماتریس تصویر هست + سایز پنجره یا ماسک + نوع تابعی قصد اعمال اون رو داریم .. برای مثال؛ دستورات و نتیجه ی پیاده سازی اونها بر روی تصویر نمونه ی بالا؛ میتونن امیدوارانه به جمعبندی مطالب این پست کمک کنن .. به عنوان جمعبندی انتهایی؛ انتخاب kernel مناسب برای اعمال بر روی تصویر، بسیار بستگی به این موضوع داره که قصد انجام چه کاری رو داشته باشیم و هدفمون از اعمال فیلتر چه چیزی لازم هست که باشه .. آیا نرم شدن تصویر برای ما مهمه؛ آیا تیز شدن بیش از پیش لبه ها؛ آیا حفظ بافت تصویر و سوال هایی از همین قبیل .. موفق و سلامت و شاد باشید ..


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

                  دیدگاه


                    #39
                    پاسخ : پردازش تصویر،از صفر تا هر جا که همکاری کنین ...

                    سلام ..

                    در پست قبل؛ به معرفی مفهوم فیلتر و نحوه ی پیاده سازی اون بر روی تصویر پرداختیم و در این پست؛ چند مثال رو در ادامه ی مبحث بالا مطرح میکنیم تا امیدوارانه بتونن به جمعبندی مطالب این تاپیک کمک کنن ..

                    *مـثـال اول: در این مثال؛ تصویر نمونه ای که داریم رو با کرنل های مختلف (تولید شده با استفاده از دستور fscpecial) فیلتر کردیم و نتایج اونها رو میتونیم در تصویر زیر باهم مشاهده کنیم ..



                    *مـثـال دوم: در این مثال؛ تصویر نمونه ای که داریم رو این بار یا فیلتر میانگیر گیر (average)، فیلتر میکنیم با این تفاوت که در هر مرحله؛ سایز پنجره ی ماسک رو تغییر میدیم .. یک بار 3*3 هست سایز این ماسک؛ یک بار 5*5 هست و به همین ترتیب تا 11*11 .. نتایج اونها رو هم میتونیم در تصویر زیر مشاهده کنیم ..



                    *مـثـال سـوم: در این مثال؛ تصویر نمونه ای رو که داریم؛ با کرنل دیسک (disk) فیلتر میکنم؛ امــا در هر مرحله شعاع این دیسک رو تغییر میدیم و بزرگ و بزرگ و بزرگتر میکنیم .. نتایج این تغییرات رو هم میتونیم باهم در تصویر زیر مشاهده کنیم ..



                    *مـثـال چـهـارم: در این مثال؛ تصویر نمونه ای که داریم رو با فیلتر بسیار کاربردی LoG یا (Laplacian of Gaussian) فیلتر میکنیم با این تفاوت که در هر مرحله؛ سایز پنجره ی ماسک رو تغییر میدیم .. نتیجه ای هم که در هر مرحله به عنوان خروجی دریافت میکنیم رو میتونیم در تصویر زیر باهم ببینیم ..



                    *مـثـال پـنـجـم: در این مثال؛ تصویر نمونه ای که داریم رو با فیلتر مشابه بالا فیلتر میکنیم؛ امــا با یک تغییر دیگه .. کیفیت این فیلتر با دو خاصیت قابل تغییر و کنترل هست؛ اول: سایز ماسک و دوم: پارامتر سیگما که مربوط میشه به فیلتر Gaussian .. در حقیقت فیلتر LoG ساخته میشه از دو مرحله؛ در مرحله ی اول، تصویر رو با فیلتر Gaussian نرم یا Smooth میکنیم و در مرحله ی دوم، تابع (عملگر) Laplacian رو بر روی تصویر حاصل اعمال میکنیم .. نتیجه ای که به عنوان خروجی دریافت میکنیم پس از پایان این دو عملیات؛ دقیقا مثل این هست که تصویر رو با فیلتر LoG کانوالو کنیم .. به همین دلیل هم هست که فیلتر LoG دارای دو پارامتر کنترلی هست .. در این مثال؛ پارامتر سیگما رو تغییر میدیم و نتایج اون رو هم میتونیم باهم مشاهده کنیم ..



                    *مـثـال شـشـم: در این مثال؛ یکی از ماسک هایی که فوق العاده شناخته شده هست در Edge Detection رو به عنوان kernel انتخاب میکنیم و بر روی تصویر، اعمال .. وظیفه ای که بر عهده ی این کرنل هست؛ شناسایی یا Detect کردن لبه های عمودی تصویر هست .. پیش از اعمال این فیلتر بر روی تصویر نمونه ی بالا؛ شاید بهتر این باشه که در ابتدا؛ نتیجه ی اعمال این کرنل بر روی تصویر نمونه ی زیر رو باهم بررسی کنیم ..


                    و در پایان این مثال هم دستورات و نتیحه ی اعمال این کرنل بر روی تصویر "مکعب" مثال های قبل ..


                    نـتـیـجـه ی اعـمـال دسـتـورات بالا

                    دلیلی که شاید سایر لبه ها هم شناسایی شدن (هر چند ضعیف) این هست ضخامت اونها بیش از یک پیکسل هست و در نتیحه مولفه ای در راستای عمودی دارن که سبب شناخته شدن اونها توسط این کرنل میشه ..


                    *مـثـال هـفـتـم: در این مثال؛ از کرنل دیگه ای استفاده میکنیم مشابه کرنل بالا؛ امــا تلاش اون تشخیص لبه ها در راستای افقی هست .. امــا در ابتدا تصویر نمونه ی زیر و بعد هم نتیجه ی اعمال این کرنل بر روی تصویر "مکعب" ..



                    نـتـیـجـه ی اعـمـال دسـتـورات بالا


                    *مـثـال هـشـتـم: در این مثال؛ از کرنلی استفاده میکنیم که وظیفه ی نرم کردن تصویر؛ امــا در حالتی خیلی ساده رو بر عهده داره .. دو نوع متفاوت این کرنل؛ چنین مسئولیتی رو انجام میدن؛ یکی در راستای افقی و دیگری هم در راستای عمودی .. این کرنل؛ یک بردار واحد به طول سه؛ یا یک ماتریس 3 در 1 با درایه هایی برابر 1 هست .. ترکیب این کرنل با کرنل های بالا رو میتونیم در این مثال بررسی کنیم .. در تصاویر زیر؛ دستورات و نتیجه ی اعمال اونها رو باهم مشاهده میکنیم ..

                    فـیـلـتر لـبـه هـای عـمـودی

                    نـتـیـجـه ی اعـمـال دسـتـورات بالا

                    فـیـلـتـر لـبـه های افـقـی

                    نـتـیـجـه ی اعـمـال دسـتـورات بالا

                    نکته ی کوتاه در مورد کرنلی که در بالا از اونها استفاده کردیم اینکه؛ در پردازش تصویر از این دو کرنل به فیلتر prewitt در جهت افقی و عمودی (در راستای X و Y) نام میبرن که در مثال اول هم یک نمونه از اون ها رو باهم بررسی کردیم .. امید که مطالب این پست بتونن به جمعبندی موضوعات مطرح شده در این تاپیک کمک کنن .. موفق و سلامت و شاد باشید ..
                    فایل های پیوست شده
                    دوستان! مدتی کمتر به سایت میام ..

                    دیدگاه


                      #40
                      پاسخ : پردازش تصویر،از صفر تا هر جا که همکاری کنین ...

                      سلام ..

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

                      دیدگاه


                        #41
                        پاسخ : پردازش تصویر،از صفر تا هر جا که همکاری کنین ...

                        سلام ..


                        یکی دیگر از مواردی که در پردازش تصویر بسیار پرطرفدار هست و الگوریتم های متفاوتی هم در مورد اون مطرح میشه؛ Segmentation یا لبه یابی تصویر هست .. هدف از Segmentation تقسیم بندی تصویر به نواحی یا قسمت های مشخص یا جداسازی و لبه یابی آبجکت های درون تصویر هست .. نکته ی اولی که در ابتدای این مبحث خیلی مهم هست اشاره به اون؛ آستانه یابی یا Thresholding میتونه باشه که معمولا همیشه به عنوان پله ی اول این مبحث از اون صحبت میکنن .. روش و منطقی که Thresholding بر مبنای اون کار میکنه این هست که با قرار دادن یک مقدار آستانه در تصویر Gray Scale؛ پیکسل هایی که مقداری بالاتر از این آستانه یا Threshold رو دارند رو به پیکسل سفید و پیکسل هایی هم که مقادیر اونها کمتر از این آستانه هست؛ رو به پیکسل سیاه تبدیل میکنیم .. در نتیجه؛ فضای تصویر ما از حالت خاکستری به حالت باینری تغییر وضعیت میده (--منظور از سفید و سیاه هم مقادیر صفر و یک هستن در تصویر باینری جدید) .. از نظر نوع نگاه و نحوه ی عملکرد؛ شاید مقایسه ی خوبی باشه اگر Thresholding رو با "اشمیت تریگر" همزاد و همانند بدونیم (--یکی نرم افزاری و دیگری سخت افزاری--) چرا که هر دو تلاششون بر این امر هست که از یک آستانه ای به بعد، یک مقدار بیشینه (کمینه) قرار بدن برای خروجی و از یک مقدار آستانه به قبل، یک مقدار کمینه (بیشینه) رو در خروجی اعلام کنن .. Thresholding یکی از مراحل مهم در Segmentation هست، چرا که ما معمولا به دنبال این هستیم که آبجکت هایی که در تصویر هستند رو از تصویر زمینه (Background) جدا کنیم (--وابستگی اونها رو از یکدیگر از بین ببریم--) و به نوعی یک پله به Segmentation آبجکت ها نزدیک تر بشیم .. به این دلیل که برخی مواقع، زمینه ی رنگی آبجکت ها با زمینه ی رنگی تصویر، بسیار نزدیک به هم هستن؛ شاید استفاده از یک آستانه ی مناسب؛ کمی مشکل باشه (و در برخی موارد نادر، غیر ممکن) و از این جهت هست که نیاز به اطلاعات رنگی پیکسل ها داریم؛ به این معنا که توزیع رنگی پیکسل ها رو در تصویر بتونیم بررسی کنیم .. یکی از روش هایی که برای این امر در پردازش تصویر وجود داره؛ استفاده از Histogram هست .. هیستوگرام؛ یک داده ی آماری از وضعیت توزیع پیکسل هاست؛ با این تعریف که محور افقی اون؛ بازه ی تغییرات مقادیر پیکسل ها از 0 تا 255 هست (تصاویر خاکستری) و محور عمودی اون هم تعداد پیکسل هایی رو نشون میده که همگی دارای مقدار عددی یکسانی در تصویر هستن .. بنابراین؛ هر زمان که به نمودار هیستوگرام نگاه میکنیم؛ میتونیم تا حدود بسیار خوبی؛ نگاهمون رو به تصویر تغییر بدیم و از این نمودار میله ای، اطلاعات ارزشمندی رو استخراج کنیم .. نحوه ی اجرای دستوری که در نرم افزار MATLAB برای هیستوگرام تعریف شده؛ در تصاویر زیر میتونیم با هم ببینیم ..


                        نـتـیـجـه ی اعـمـال دسـتـورات

                        همونطور که در تصویر نمونه ی بالا هم میبینیم؛ زمینه ی رنگی تصویر به نوعی جملات ما رو نا مفهوم کردن و شاید اولین ایده ای که به ذهنمون برسه این باشه که با استفاده از Thresholding تصویرمون رو باینری کنیم با این امید و هدف که حروف سازنده ی کلمات ما؛ بمانن و زمینه ی رنگی تصویر از بین بره .. بنابراین لازم هست که یک مقدار آستانه برای این تصمیم گیری انتخاب کنیم .. این مقدار هر مقداری از 0 تا 255 میتونه باشه و تصمیم با ماست که چه مقداری رو انتخاب کنیم .. با توجه به نمودار هیستوگرام بالا؛ این انتخاب برای ما ساده تر میشه؛ چرا که تجمع پیکسل هایی که مقادیر رنگی اونها بین 130 تا 250 هست؛ در سمت راست نمودار بسیار بیشتر و چگال تر هست و این موضوع به ما نشان میده که اگه قصد انتخاب مقدار آستانه ای رو داریم، میتونیم این مقدار رو حدود 120 انتخاب کنیم؛ چرا که پیکسل های حروف ما چنین مقادیری رو دارن (به احتمال زیاد) .. از این جهت مقدار آستانه رو 120 انتخاب میکنیم و با دستورات زیر؛ نتیجه ی نهایی رو به عنوان خروجی نمایش میدیم ..


                        نـتـیـجـه ی اعـمـال دسـتـورات

                        تصویر بالا رو میتونیم با تکنیک های Morphology بهتر و بهتر و بهتر کنیم؛ امــا در اینجا شاید سبب پراکندگی مطالب بشه اگر در مورد نحوه ی این کار صحبت کنیم .. علاوه بر روشی که در بالا به اون اشاره کردیم؛ در نرم افزار MATLAB دستورات پیش فرضی هم وجود دارن که میتونیم از اونها استفاده کنیم .. یکی از این دستورات که خیلی میتونه برای کارهای Thresholding سودمند باشه؛ دستور graythresh هست .. این دستور مقدار بهینه ی آستانه ای رو که تصویر میتونه با اون باینری بشه؛ به عنوان خروجی تحویل کاربر میده و به عنوان ورودی هم تصویر Gray Scale رو دیافت میکنه .. یکی از کاربردهای مهم این دستور؛ در طرح هایی هست که نیاز به مقادیر آستانه ی متفاوتی داریم و این قصد رو داریم که برای باینری کردن هر مجموعه از تصاویر، یک مقدار آستانه استفاده کنیم؛ به این جهت که مجموعه ی تصاویر ما از نظر توزیع رنگی با هم متفاوت هستن و هر نمونه تا حدودی با نمون ی بعدی فرق میکنه .. به همین دلیل هم نمیتونیم از یک مقدار ثابت و دائمی برای باینری کردن جمیع تصاویرمون استفاده کنیم چرا که ممکن هست اطلاعات تصویر رو از دست بدیم، به ازای یک آستانه ی مشخصی برای مجموعه ای از تصاویر .. به همین دلیل؛ خیلی بهتر این هست که مقدار آستانه ای که در نطر میگیریم رو در اصطلاح؛ دینامیک (متغییر/منعطف) تعریف کنیم به این معنا که با تغییر تصویر؛ این مقدار آستانه هم به تطابق توزیع رنگی پیکسل های تصویر، تغییر میکنه (--و شاید به نوعی بهتر باشه که بگیم پدیت میشه--) و امیدواری ما برای حفظ اطلاعات تصویر (--کدام اطلاعات؟ در مثال های بعدی بررسی میکنیم اونها رو--) در زمان باینری کردن اون، بیش از پیش افزایش پیدا میکنه .. یک دستور دیگر هم هست با نام im2bw که مستقیم تصویر ورودی (--رنگی یا خاکستری تفاوتی برای این تابع نداره؛ چرا که طبق روتین تعریف شده، در ابتدا تصاویر رو به فضای خاکستری تبدیل میکنه--) رو به تصویر باینری تبدیل میکنه .. ورودی این دستور؛ تصویر + مقدار آستانه هست و خروجی اون هم تصویر باینری شده .. دقت کنید که اگر مقدار آستانه رو در این دستور به کار نبریم؛ این تابع به صورت پیشفرض یک مقدار ثابت و بخصوص رو برای آستانه انتخاب میکنه که شاید مناسب برای تصویر ما نباشه (--و شاید هم انتخاب خوبی باشه؛ امــا همه ی تلاش این دستور این هست که این مقدار؛ مقداری متناسب برای تصویر باشه .. در کد نوشته شده برای این تابع؛ مقدار level رو با 0.5 مقدار دهی اولیه کردن--) .. بنابراین هر زمانی که قصد استفاده از این دستور رو داریم؛ چه بهتر این هست که قبل از اون؛ مقدار آستانه ی مناسب رو با دستور graythresh پیدا کنیم ("مـعـمـولا" تصویر باینری بهتر خواهد شد با این روش؛ امــا نه همیشه) و به نوعی این دو تابع رو همیشه باهم؛ به عنوان دو دوست، در کنار هم استفاده کنیم .. در تصاویر زیر نحوه و نتیحه ی پیاده سازی این دستورات رو میتونیم باهم مشاهده کنیم ..


                        نـتـیـجـه ی اعـمـال دسـتـورات

                        به این منظور که اهمیت این کار رو در پردازش برخی تصاویر خاص بهتر متوجه بشیم؛ خوب هست که مثال زیر رو با هم بررسی کنیم .. تـصـویـر زیر به عنوان ورودی به ما داده شده و از ما خواسته شده تا بررسی کنیم که آیا این یک تصویر معمولی هست یا یک تصویر به نوعی "کـد" شده، به این معنا که اطلاعاتی هرچند جزئی، درون تصویر قرار دارند که با بررسی اولیه قابل تشخیص نیستن .. دقت کنید که در این مثال؛ یک حالت معمولی از این نوع خاص تصاویر رو بررسی میکنیم امــا هر نوع اطلاعاتی میتونن جایگزین اونها بشن و البته با روش هایی مختلف که شاید مورد بحث این تاپیک نباشن .. امــا در ابتدا تصویر ورودیمون رو با هم بررسی میکنیم:


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


                        در شکل زیر؛ ابتدا تصویرمون رو با دستور معمول im2bw باینری میکنیم و مشاهده میکنیم که هیچ نوع اطلاعات خاصی به عنوان خروجی؛ به دست نمیاریم ..


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


                        نـتـیـجـه ی اعـمـال دسـتـورات

                        همونطور که در نتیجه ی خروجی بالا هم مشخص هست؛ این اطلاعات در تصویر ما نهفته بودن و ما تونستیم با یک روش معمول آستانه گذاری بر روی مقادیر پیکسل ها (Thresholding) این اطلاعات خروجی رو به دست بیاریم .. تا به اینجا مطالب مربوط به آستانه گیری و مفهوم اون در تصاویر خاکستری و تبدیل اونها به تصاویر باینری رو با هم بررسی کردیم .. در مراحل بعدی؛ امیدوارانه به بررسی متدهای Edge Detection می پردازیم .. امید که مطالب بتونن برای جمعبندی موضوعات مطرح شده در این تاپیک مفید باشن .. پیروز باشید ..
                        فایل های پیوست شده
                        دوستان! مدتی کمتر به سایت میام ..

                        دیدگاه


                          #42
                          پاسخ : پردازش تصویر،از صفر تا هر جا که همکاری کنین ...

                          سلام. سایز ماسک بر حسب چی تعیین میشه ؟

                          دیدگاه


                            #43
                            پاسخ : پردازش تصویر،از صفر تا هر جا که همکاری کنین ...

                            سلام ..

                            سایز ماسک محدودیت و یا استاندارد بخصوصی نداره .. بر حسب نوع کاربرد، نوع تصویر و نوع نتیجه ای که لازم هست به دست بیاریم؛ سایز ماسک رو میتونیم تغییر بدیم .. در برخی از فیلترها؛ تغییر سایز ماسک میتونه کمک و ایده ی خوبی باشه؛ زمانیکه قصد داریم پارامتر دیگه ی فیلتر رو ثابت نگه داریم .. امــا اینها همه، به کاربردی که در پردازش به اون فکر میکنیم و نوع فیلتری که استفاده میکنیم، بستگی پیدا میکنن .. پیروز باشید ..
                            دوستان! مدتی کمتر به سایت میام ..

                            دیدگاه


                              #44
                              پاسخ : پردازش تصویر،از صفر تا هر جا که همکاری کنین ...

                              سلام
                              یه سوال ، من یک فایل با فرمت eps. دارم که می خواهم آن را به mfileدر matlab تبدیل کنم . شما می توانید در این زمینه راهنمایی ام کنید .
                              چون فایلی با فرمت eps دارم ، و به نظرتون این فایل همان برنامه اصلی می تواند باشد؟؟؟ نیازی به تبدیل ندارد؟؟؟؟؟؟؟با wordpadکه باز میکنم برنامه با کلی توضیح می آید اما فکر می کنم برنامه متلب تبدیل به این فرمت شده درسته ؟؟؟؟؟؟؟؟؟؟!

                              دیدگاه


                                #45
                                پاسخ : پردازش تصویر،از صفر تا هر جا که همکاری کنین ...

                                سلام ..

                                EPS یا Encapsulated Postscript یک فرمت گرافیکی هست (--تا اونجایی که میدونم--) و برای ذخیره سازی و فرمت های گرافیکی در MATLAB استفاده میشه .. راه هایی برای تبدیل EPS به فرمت های JPG و یا PNG و ... وجود داره امــا خواندن مستقیم اونها در MATLAB یا تبدیل اونها به m.file فکر نمیکنم ایده ی قابل انجامی باشه .. اگر دوستان اطلاعات کاملتری در این زمینه دارن؛ حتما در ادامه ی این پست مطرح کنن تا بتونیم به جمعبندی مطالب کمک کنیم .. پیروز باشید ..
                                دوستان! مدتی کمتر به سایت میام ..

                                دیدگاه

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