در قسمت قبل با نحوهی ایجاد کردن ماسکهای دایره ای و حلقوی آشنا شدیم. از این روش برای پیاده سازی فیلتر در حوزه فرکانس و فیلتر کردن تصویر می توان استفاده کرد. در این قسمت ابتدا نحوهی بدست آوردن طیف تصویر در حوزهی فرکانس را بررسی کرده و سپس با استفاده از روشی که در قسمت قبلی مطرح کردیم فیلتر طراحی کرده و تصویر را در حوزهی فرکانس فیلتر میکنیم.
کد های پایتون نوشته در این آموزش، در یک فایل ژوپیتر نوت بوک نوشته شده اند. لینک دانلود فایل ژوپیتر نوت بوک مربوط به این آموزش در انتهای صفحه قرار داده شده است.
برای تعریف آرایه ها کتابخانه numpy، برای ترسیم نمودار کتابخانه matplotlib و برای خواندن تصویر کتابخانه cv2 را import میکنیم.

از تصویر cameraman استفاده میکنیم. موقع خواندن تصویر در آرگومان دوم مقدار 0 را ارسال میکنیم تا تصویر به صورت سیاه و سفید خوانده شود.


تصویر خروجی:

برای بدست آوردن طیف تصویر در حوزهی فرکانس از تابع fft دو بعدی (fft2) استفاده میکنیم. این تابع در خروجی، یک ماتریس دو بعدی شامل مقادیر مختلط بر میگرداند. میتوان مقدار دامنه یا فاز این مقادیر مختلط را بدست آورده و نمایش داد. اگر دامنهی طیف را بدست آورده و ترسیم کنیم، یک تصویر سیاه مشاهده میکنیم. دامنه مقادیر مختلط بدست آمده در طیف می تواند dynamic range بزرگی داشته باشد. موقع نمایش، مقادیر غیر مجاز (برای مقدار پیکسل) را تابع imshow برش می دهد و این موضوع باعث میشود نتوانیم نتیجه را بدرستی نمایش دهیم. برای حل این مشکل طیف را در مقیاس لگاریتمی نمایش میدهیم. با محاسبهی مقدار لگاریتم هر پیکسل، dynamic range را فشرده میکنیم.
اندازه مقدار مختلط میتواند بزرگتر مساوی صفر باشد. تابع لگاریتم به ازای مقدار صفر تعریف نشده است (به منفی بی نهایت میل میکند). برای اینکه موقع نمایش اندازهی طیف در مقیاس لگاریتمی، خطایی به خاطر مقادیر صفر رخ ندهد، قبل از محاسبهی لگاریتم به آن یک واحد اضافه میکنیم.

طیف تصویر (بدون شیفت دادن) در مقیاس لگاریتمی:

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

طیف تصویر (شیفت یافته) در مقیاس لگاریتمی:

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

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

خروجی:

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

خروجی:

برای ایجاد کردن فیلتر میان گذر کافیست ماتریس فاصله ها را با دو مقدار آستانه گذاری کرده و حاصل and آن ها را بدست آوریم.

خروجی:

برای ایجاد کردن فیلتر میان نگذر می توان ابتدا فیلتر میان گذر را تعریف کرده و سپس با not کردن آن، فیلتر میان نگذر را بدست آوریم.

خروجی:

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

طیف خروجی:

در حوزهی فرکانس تصویر مورد نظر را فیلتر کردیم. حال میخواهیم از روی طیف تصویر، خود تصویر را بدست بیاوریم. برای اینکار از تابع fft2 معکوس یا همان ifft2 استفاده میکنیم. توجه داشته باشید، چون پس از محاسبهی طیف از fftshift برای انتقال فرکانس صفر به مرکز استفاده کرده بودیم، قبل از محاسبهی تبدیل فوریهی معکوس ابتدا با ifftshift، طیف را به فرمت اولیه برگردانده و بعد از آن از ifft2 استفاده میکنیم.
در خروجی تابع ifft2 مقادیر از نوع مختلط میباشند. چون سیگنال ما حقیقی است، قسمت حقیقی خروجی ifft2 را انتخاب میکنیم. در ماتریس خروجی ifft2 مقادیر منفی هم میتواند وجود داشته باشد. میدانیم مقدار مجاز برای پیکسل ها بازهی 0 تا 255 است برای همین در خروجی بدست آمده، مقادیر منفی را انتخاب کرده و مقدار آن ها را به صفر تغییر میدهیم (مقادیر منفی را حذف میکنیم). نوع دادهی مقادیر خروجی float میباشد، با استفاده از astype نوع مقادیر را به integer تبدیل میکنیم.

تصویر خروجی:

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

طیف خروجی:

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

تصویر خروجی:

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