آموزش پردازش تصویر – فصل سوم کتاب پردازش تصویر گنزالس

آموزش پردازش تصویر – فصل سوم کتاب پردازش تصویر گنزالس

تبدیل های شدت و فیلترهای مکانی

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

 

بخش اول : تبدیلات مکانی

دستور imadjust

با کمک این دستور می توان بازه شدت تصویر را تغییر داد ، مثلا فرض کنید مقادیر شدت یک تصویر خاکستری بین 50 تا 200 است ، یعنی حداقل مقدار شدت موجود در تصویر 50 و حداکثر آن 200 است. حالا اگر بخواهیم مقدار شدت تمام پیکسل ها را با نسبت یکسان به گونه ای تغییر دهیم تا حداقل آن صفر و حداکثر آن 255 شود ، این دستور به راحتی کار را برای ما انجام می دهد.

فرمت کلی دستور به صورت زیر است :

 

توجه شود مقادیر باید بین صفر و یک باشد.

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

پیاده سازی توضیحات بالا به صورت زیر می شود:

 

چند حالت استفاده از دستور به صورت زیر آمده است :

 

 

این دستور کابردهای زیادی دارد که در آینده این بخش را تکمیل خواهم کرد.

 

تبدیل لگاریتمی

تبدیل لگاریتمی یکی از تبدیل های پرکاربرد است که یکی از کابردهای اصلی ان این است که تصویر تاریک را روشن می کند. فرمت کلی آن به صورت زیر است :

g=c*log(1+double(f))

در اینجا f تصویر ورودی و g تصویر خروجی است. c یک عدد ثابت است.

تبدیل لگاریتمی در متلب به صورت زیر است ، فقط باید دقت کرد که بعد از تبدیل باید مقادیر را از حالت فشرده به صورت رنج کامل نمایش داد که با mat2gray و im2uint8 صورت می گیرد:

دستور imhist(f)

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

برای مثال هیستوگرام دو تصویر بالا را به صورت زیر است:

دستور histeq(f)

یکی از دستورات کاربردی و مفید دستور histeq است که هیستوگرام تصویر را تعدیل می کند. به این معنا که اگر مقادیر شدت در قسمتی تجمع دارد مقادیر را به گونه بسط می دهد تا توزیع شدت تقریبا یکسان شود، برای نمونه تصویر زیر را قبل و بعد از تعدیل سازی مقایسه کنید :

نحوه تعدیل سازی و روابط ریاضی حاکم بر این دستور از حوصله این بحث خارج است.

 

بخش دوم : فیلترهای مکانی

فیلترهای مکانی یا spatial filter ، به گونه ای روی تصویر اعمال می شود که مقدار پیکسل با توجه به مقدار پیکسل های همسایگی آن تغییر می کند. مثلا می توان مقدار یک پیکسل را با اعمال یک فیلتر میانگین ، برابر مقدار میانگین هشت پیکسل همسایگی آن قرار داد. فیلترها به دو نوع خطی و غیرخطی تقسیم می شوند ، نوع خطی را کانولوشن مکانی هم می گویند.

فیلترهای خطی

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

این کار باید برای تک تک پیکسل های تصویر صورت بگیرد ، که این کار را متلب به سادگی با دستور imfilter انجام می دهد، ضرب ماسک در تصویر به دو روش correlation و convolution صورت می گیرد ، که تنها تفاوت این دو قرینه بودن خروجی آن ها نسبت به یکدیگر است. استفاده از دستور به صورت زیر است :

g=imfilter(f,w)

f تصویر اصلی و w ماسک است. این دستور پارامترهای دیگری را دریافت می کند که در اینده آن را مفصل تر بررسی خواهم کرد.

یک راه برای ساخت ماترس ماسک ، مقدار دهی به صورت دستی است. و راه دوم استفاده از دستور متلب برای تولید ماسک های پرکاربرد برای محو کردن تصویر ، حذف نویز، حالت موشن و… است. که از دستور fspecial استفاده می کنیم:

 

type نوع ماسک و param پارامترهای آن را معلوم می کند. انوع ماسک های پرکاربرد در جدول زیر آمده است:

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

برای مثال با دستور زیر از فیلتر sobel برای پیدا کردن لبه استفاده کرده ایم :

 

 

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

فیلترهای غیرخطی

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

g=ordfilt2(f,order,domain)

fتصویر ، order رتبه و domain ماتریس ماسک را مشخص می کند.

اگر تمام پیکسل های همسایگی را به ترتیب از کوچک به بزرگ مرتب کنیم و به آن یک رتبه بدهیم ، به این رتبه order می گویند. بنابراین برای پیداکردن مقدار ماکزیمم کافی است به جای domain یک ماسک شامل یک و به جای order ، ابعاد ماتریس ماسک را قرار دهیم تا بالاترین مقدار مشخص شود چون از کوچک به بزرگ مرتب شده است.

به مثال زیر دقت کنید :

 

خروجی به صورت زیر می شود (خروجی سمت راست):

 

  1. با سلام
    چگونه برچسب گذاری روی پیکسلهایی با مشخصات خاص ایجاد کنیم . و سپس چگونه بقیه نواحی را حذف کنیم؟
    با تشکر از سایت خوبتون

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

دیدگاه شما

( الزامي )

(الزامي)