پیاده سازی تابع فیلتر بر روی تصویر

سلام دوستای گلم !!

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

پیکسل های آرام اونایی هستن که اختلاف سطح روشنایی شون با همسایه هاشون کمه و پیکسل های تیز برعکس یعنی اختلاف سطح روشنایی شون با همسایگانشون زیاده ! مشخصه که به درد لبه های تصویر می خورن . در حوزه ی مکان دو مدل فیلتر داریم : فیلتر های آرام کننده و فیلتر های تیز کننده . مدل اول باعث آرام شدن تصویر میشه و بخشی از اطلاعات تصویر رو از بین می بره ، مثل فیلتر های میانگین که با اعمال یه ماسک m*n باعث آرام شدن تصویر میشن . فیلتر های تیز کننده تغییرات رو بر روی پیکسل های آرام انجام می دن و باعث میشن جزییات بیشتر مشخص بشه .

اعمال فیلتر در نرم افزار متلب با fspecial و imfilter انجام میشه ، fspecial یه تابع فیلتر دو بعدی از پیش تعریف شده  ست که نوع فیلتر رو مشخص می کنه و اونو داخل یه متغییر مثل h قرار می ده یعنی : h=fspecial (type)

که این type نوع فیلتر رو مشخص می کنه که انواعش داخل جدول زیر هست.

خروجی fspecial رو داخل یه متغییر مثل h  قرار می دیم و با استفاده از تابع imfilter فیلتر مورد نظر مونو رو تصویر اعمال می کنیم .

مثال :

 یه تصویر خونده میشه ، می خوایم فیلتر disk رو با شعاع 5 رو تصویر اعمال کنیم .

تصاویر زیر اجرای یه برنامه ی ساده در مورد فیلتر کردن تصویره ، کل فیلتر هایی که تو جدول بالا بود رو پیاده سازی کردم ( بچه ها سوتی رو !!! نام واسه m فایل درست حسابی انتخاب نکردم !!! untitled1 ) 

 

 

پیاده سازی فیلتر بالا گذر حوزه ی فرکانس

سلام دوستای خوبم !

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

چه شکلی میشه یه تصویر رو از حوزه ی مکان به فرکانس برد ؟ کافیه از تصویر FFT بگیریم ، اونوقت تصویر میشه فرکانسی . این خروجی بدست اومده می گه چه مقدار پیکسل تو تصویر بوده که اختلاف سطح شدت هاشون 200 شده مثلا ، اما نمی گه این پیکسل ها کجای تصویر بودن ؟ 

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

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

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

یه تصویر انتخاب می کنی و از رنگی به gray می بریم .

 کادر قرمز رنگ : ابتدا یه ماسک به اندازه ی تصویر ورودی ایجاد می کنیم ، چون فیلتر بالا گذر انتخاب شده پس ones باید باشه ، حالا باید یه دایره تعریف کنیم به شعاع 200 یا بیشتر ، اگه مقادیر کوچک تر بود می ره داخل دایره . اجراشو ببین .

 الان می خوایم تصویر رو ببریم به حوزه ی فرکانس ، یعنی از FFT باید استفاده کنیم . 

اجراش اینه ، گفتم تو حوزه ی فرکانس نباید انتظار یه تصویر مثل حوزه ی مکان رو داشت !!! پیکسل بی پیکسل 

الان دیگه باید بریم سراغ عملیات فیلترینگ : وقتی از FFTshift استفاده می کنی یعنی داری فرکانس های کوچک رو از بزرگ جدا می کنی . 

اجراش این بود ، می تونی از تصویرت قدر مطلق بگیری تا مشخص تر بشه ..............



پیاده سازی الگوریتم های لبه یابی تصویر - قسمت دوم

سلام دوستای گلم

یه فایل خوب واسه الگوریتم های لبه یابی برای دانلود گذاشتم ، دوست داشتی بررسی کن

لینک دانلود

از الگوریتم های لبه یابی هنوز چند موردی باقی مونده که الان واست می گم .

zerocross

 

Prewitt

خیلی شبیه sobel می مونه ، اما ضرایب ماسکش با اون فرق داره . ببین اجراشو

Roberts

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

 

Log

اون لگاریتمی نیست که فکر می کنیا !! نه معنیش اینه : laplacian of Gaussian method

حالا بیا اجرای همشونو باهم داخل یه پنجره ببینیم :

اولا واسه هر کدوم از عملگر ها یه تابع بنویس . بلدی دیگه ؟

واسه تعریف تابع تو متلب اول کلمه ی کلیدی function بعد پارامتر های خروجی سپس نام تابع و دست آخر آرگومان های ورودی ( تصویری که می خوای عملر لبه یابی روش اعمال بشه )

این تابع کارش اینه که باید تصویر رو از حالت rgb به gray تبدیل کنه و بعد edge رو روش اعمال کنه . خروجی تابع مقدار موجود در BW1 ، که به صورت یه تصویر logic قابل نمایشه.

ما 6 مورد عملگر لبه یابی داشتیم پس واسه هرکدوم یه تابع بنویس . واسه اجراش برو تو محیط command window و ابتدا تصویر مورد نظر رو با دستور imread بخون . حالا کافی این تصویر رو واسه هر کدوم از تابع ها بفرستی و خروجی رو دریافت کنی . اما واسه نمایش هر 6 تا تصویر خروجی در یک figure از subplot(m,n,p) استفاده می کنی ، subplot چی کار می کنه ؟ یه تقسیم بندی بین تصاویر مورد نظر انجام می ده با ساختن یه ماتریس m*n

مثلا ما 6 تا تصویر خروجی داریم پس یه ماتریس دو در سه می خوایم .

 

 

پیاده سازی الگوریتم های لبه یابی تصویر - قسمت اول

سلام دوستای گلم 

این پست رو می خوام کاملا پردازش تصویری کنم ! اصلا تو فکرم یه آموزش پردازش تصویر با متلب راه بندازم و هرچی بلدمو و هرچی یاد می گیرمو داخلش بنویسم ، چه طوره ؟

ببین قول بهت می دم یه جور خوب توضیح بنویسم . 

الان می خوام راجب لبه یابی در پردازش تصویر بگم : لبه تصویر در واقع نقاطی از تصویره که در اونا شدت روشنایی به طور ناگهانی ( یهویی ) تغییر کرده !

الگوریتم های متفاوتی در این زمینه داریم که ابتدا از sobel شروع می کنیم . چه طوری کار می کنه ؟ الگوریتم سوبل دو تا ماسک یکی عمودی و دیگری افقی با ضریب های مشخص ( ضریب پیکسل های قبلی منفی و ضریب پیکسل های بعدی مثبت و همچنین همسایگی های قطری مقدار 1 و همسایگی های عمودی مقدار 2 ) رو تصویر اعمال می کنه . این الگوریتم واسه لبه یابی عمودی خیلی مناسبه مثلا برای تشخیص پلاک خودرو .

ابتدا تصویر مورد نظر رو می خونیم ، حواست باشه تصویر باید برای برنامه قابل دسترس باشه یعنی باید در مسیر patch باشه یا در پوشه ایی که در حال حاضر برنامه به اون دسترسی داره باشه. مثلا با دستور dir می تونی متوجه بشی متلب الان به کدوم پوشه ها دسترسی داره.

اوکی ، بعد از خوندن تصویر باید اونو از رنگی به سطح خاکستری ببری با دستور rgb2gray

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

خروجی تابع edge یه تصویر logic ، تصاویر زیر رو دنبال کن.

 

Canny یکی دیگه از الگوریتم های لبه یابی ست ، چه طوری کار می کنه ؟ معمولا الگوریتم های لبه یابی مثل canny یک سطح آستانه دارن ، این آستانه از کجا می یاد ؟ از تفاضل سطح شدت ها

هر جا سطح شدت روشنایی کم باشه ، لبه یابی ضعیف میشه هرجا سطح روشنایی زیاد باشه لبه یابی قویه. زمانی که نیاز به لبه یابی قویی باشه با در نظر گرقتن شیب ها از canny استفاده می کنیم.

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

 

یه مقایسه بین خروجی ها مشخص می کنه الگوریتم canny عملکرد بهتری داره ، تصویر سمت راست