پردازش تصویرمقدمه ای بر فیلترها

در این مطلب به عنوان شروع، می خواهیم در مورد اعمال دو فیلتر ساده بر روی تصویرها صحبت کنیم. در مبحث فیلتر کردن تصویر (Image Filtering) دو فیلتر ساده به نام های Low Pass Filter (فیلتر پایین گذر یا LPF) و High Pass Filter (فیلتر بالا گذر یا HPF) وجود دارندفیلتر LPF معمولا برای حذف نویز (Noise) از تصویر، تار کردن تصویر (Blur) و صاف کردن تصویر (Smoothing) مورد استفاده قرار می گیرند. در مقابل فیلتر HPF در تشخیص لبه ها کاربرد دارد که در مطلب های پیش رو در مورد تشخیص لبه ها (Edge Detection) صحبت شده است.

همانطور که در مطلب فیلتر تصویر و مفهوم کرنل در پردازش تصویر توضیح دادیم، یک کرنل (یا ماتریس کانولوشن)، ماتریسی است که شامل وزن ها (Weight) می شود و به نواحی تدر تصویر اصلی اعمال می شود، تا مقدار یک تک پیکسل در تصویر خروجی محاسبه شود که این محل متناظر با درایه مرکز کرنل استهمچنین توضیح دادیم که هر کاربرد دارای کرنل خاص خودش است ولی تمامی کرنل ها دارای خصوصیت مشترکی هستند و آن اینکه، اندازه آنها باید عددی فرد (۱،۳،۵،۷) باشد و ماتریس آنها به صورت ماتریس مربعی است.

در مطلب های پیش رو در برخی از متدها، آرگومان ksize برابر با Kernel Size است و خواهید دید که اندازه آن باید عددی فرد باشد. همچنین به یاد داشته باشید که ماتریس های کانولوشون (کرنل) به صورت مربعی هستند، به این معنی که اندازه سطر و ستون ها برابر است. پس اگر آرگومان ksize برابر با 3 باشد، پس به معنی کرنل (ماتریس کانولوشن) 3x3 است.

مات کردن تصویر یا Bluring

مات کردن (Bluring) اشاره به محاسبه میانگین پیکسل هایی دارد که در مجاورت یکدیگر قرار دارند. همچنین به Bluring گاهی اوقاوت Low Pass Filter نیز گفته می شود. یک فیلتر Low Pass Filter به فرکانس های پایین اجازه می دهد و فرکانس های بالاتر را بلاک می کند. اما معنی فرکانس (Frequency) در تصویر چیست؟ در زمینه پردازش تصویر، فرکانس به میزان تغییرات مقدار پیکسل اشاره دارد.

بنابراین می توانیم بگوییم که لبه های تیز (Sharp Edge)، محتوایی با فرکانس بالا (High Frequency) هستند زیرا مقادیر پیکسل در آن ناحیه (Region) به سرعت تغییر می کنند. بنابراین با این منطق، می توانیم بگوییم که ناحیه های عادی، دارای فرکانس پایین (Low Frequency) هستند. بنابراین Low Pass Filter (فیلتر پایین گذر) تلاش برای صاف کردن (Smoothing) لبه ها دارد. بنابراین می توانیم نتیجه بگیریم که میزان صاف کردن تصویر، بستگی به اندازه کرنلی دارد که انتخاب کرده ایم. پس کرنل ها با اندازه های متفاوت، اثرات متفاوت نیز دارند.

فیلترهای مات کردن تصویر در کتابخانه OpenCV

تشخیص لبه ها (Edge Detection) توسط کتابخانه OpenCV و پایتون

تشخیص گوشه ها (Corner Detection) توسط کتابخانه OpenCV و پایتون

کارتونی کردن تصویر توسط کتابخانه OpenCV و پایتون

فیلتر MotionBlur بر روی تصویرها توسط کتابخانه OpenCV و پایتون

فیلتر پیش طرح مدادی Pencil Sketch توسط کتابخانه OpenCV و پایتون

کرنل فیلتر LPF

در مورد فیلتر LPF جمع تمامی مقدارهای درایه های کرنل باید برابر با عدد ۱ شود. اگر درایه های جدول همانند ماتریس زیر که توسط ماژول NumPy ایجاد شده است شامل عددهای مثبت و منفی باشد، پس این کرنل برای کاربرد های شفاف سازی (Sharpen) یا Smoothing تصویر کاربرد دارد. توجه کنید که جمع درایه های ماتریس زیر برابر با عدد ۱ است.

اما اگر تمامی درایه های کرنل عددهای مثبت باشند و هچنین جمع تمامی درایه ها برابر با عدد ۱ باشد، پس این کرنل همانند ماتریس زیر برای کاربردهای تار کردن تصویر (Blur) استفاده خواهد شد. دومین و سومین کد زیر توسط متد ()ones یک ماتریس 5x5 از عدد ۱ ایجاد می کند و سپس تمامی درایه ها را بر عدد ۲۵ تقسیم می کند تا مشابه ماتریس اولی تمامی درایه ها عدد 0.04 باشند.

در کد زیر می خواهیم از متد ()filter2D برای اعمال دو کرنل 3x3 و 5x5 به یک تصویر استفاده کنیم و همچنین می خواهیم یک کرنل دیگر که فاقد ویژگی کرنل LPF است را نیز اعمال کنیم تا در نهایت به شما مفهوم کاربرد فیلتر LPF برای برطرف سازی نویز و مات کردن تصویر را آموزش دهیم و همچنین شما کاربرد متد ()filter2D را نیز یاد خواهید گرفت.

جمع تمامی درایه های سه کرنل تعریف شده در بالا که به ترتیب kernel_identity و kernel_3x3 و kernel_5x5 نام دارنذ، برابر با عدد یک است. همچنین دو کرنل به نام های kernel_3x3 و kernel_5x5  از تقسیم بر اعداد 9.0 و 25.0 بدست آمده زیرا کرنل اول شامل ۹ درایه (کرنل 3x3) و کرنل دوم دارای ۲۵ درایه (کرنل 5x5) استاما درایه های کرنل kernel_identity حاصل از تقسیم (Average) نیستند و شما خواهید دید که این کرنل با این که ویژگی جمع تمامی درایه هایش برابر با عدد ۱ را دارد ولی برای فیلتر LPF کاربردی ندارد.

شکل زیر خروجی اجرای هر کدام از متدهای ()filter2D را نشان می دهد. اگر به کد دقت کنید، آرگومان نخست این متد همان تصویر اصلی، آرگومان دوم آن عدد صحیح -1 و آرگومان سوم آن یک متغیری است که به یک کرنل اشاره دارد. در نهایت خروجی تصویر جدیدی است که حاصل اعمال کرنل به تصویر آرگومان اول است.

 بنابراین با توجه به شکل بالا می توانید ببینید که عملا کرنل (ماتریس) kernel_identity هیچ تاثیری مبنی بر مات کردن (Bluring) تصویر نداشته است ولی دو کرنل دیگر که تمامی درایه های آنها (که ۱ بودند) بر اندازه کل ماتریس تقسیم شده اند، می توانند برای مات کردن تصویر مورد استفاده قرار بگیرند.

کرنل فیلتر HPF و تشخیص لبه ها بوسیله فیلتر HPF

در فیلتر HPF درایه های کرنل می توانند عددهای منفی و مثبت باشند، به طوری که جمع تمامی درایه ها برابر با عدد صفر شود. در کد زیر ماتریسی ایجاد شده است که شامل عددهای منفی و مثبت می شود و مجموع تمامی درایه های آن برابر با عدد صفر است. دومین ماتریس زیر کرنل 5x5 برای فیلتر HPF را نشان می دهد.

در کد زیر از دو ماتریس 3x3 و 5x5 که در بالا گفتیم درون متد ()filter2D استفاده کرده ایم تا بتوانیم دو تصویر جدید را ایجاد کنیم که هر یک لبه های تصویر اولی را نشان می دهند. توجه کنید هم در مات کردن تصویر توسط LPF و هم در تشخیص لبه ها در HPF، هر چه کرنل بزرگتر باشد، به ترتیب مات کردن تصویر و تشخیص لبه ها نیز دقیق تر خواهد شد.

در مطلب های پیش رو ویژگی های OpenCV در مورد تشخیص لبه ها و دیگر فلیترهای تصویر را آموزش می دهیم.  در Opencv متدهای ()Sobel و ()Laplacian وجود دارند که از آنها برای تشخیص لبه های تصویر و ویدیوها استفاده می شود. توجه کنید که با وجود کتابخانه OpenCV، قرار نیست ما نگران پیاده سازی فیلترها و کرنل های آنها باشیم، بلکه OpenCV آنها را پیاده سازی کرده است و ما تنها باید از ویژگی های آن استفاده کنیم.

دانلود سورس برنامه این مطلب OpenCV LPF HPF filters

کد اعمال کرنل 5x5 فیلتر HPF بر روی فریم های دوربین