برخی ابزارهای denoise کردن در opencv

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

تصویر ورودی نویزی
تصویر ورودی نویزی


اجرای الگوریتم تشخیص لبه Canny بر روی تصویر نویزی
اجرای الگوریتم تشخیص لبه Canny بر روی تصویر نویزی


خوشبختانه کتابخانه opencv ابزار‌های بسیار زیادی برای رفع نویز یا به اصطلاح هموار کردن تصویر (image soothing ) در اختیار ما می‌گذارد.در ادامه یکسری از این ابزار‌ها و الگوریتم‌ها را بررسی می‌کنیم.

cv2.blur:

در این روش یک کرنل(پنجره کوچک) به اندازه دلخواه را بر روی تصویر مورد نظر کانوالو می‌کنیم. در هر مرحله از کانوالو(به زبان ساده یعنی لغزاندن پنجره بر روی تصویر) مقدار پیکسل مرکزی را با مقدار میانگین تمام پیکسل‌های درون کرنل مورد نظر جایگزین می‌کنیم.

نتیجه ی بلور با کرنل ۵‌*۵
نتیجه ی بلور با کرنل ۵‌*۵

cv2.medianBlur:

همانند روش قبل این روش نیز از کانوالو کردن یک کرنل بر روی تصویر به وجود می‌آيد. با این تفاوت که مقدار پیکسل مرکزی حاصل میانه‌ی پیکسل‌های درون کرنل است. این نوع از فیلتر برای از بین بردن نویز‌های salt & pepper بسیار مناسب است چرا که مقدار پیکسل نویز به طور کامل حذف می‌شود.

فیلتر میانه با کرنل ۵*۵
فیلتر میانه با کرنل ۵*۵


cv2.gaussianblur:

یکی از پرکاربردترین فیلتر‌ها فیلتر گاوسی است. در این نوع از فیلتر از کانوالو کردن یک کرنل گاوسی بر روی تصویر استفاده می‌شود. به بیان دقیق‌تر اگر نمودار توزیع نرمال گاوسی را به خاطر بیاوریم:

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

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

تابع گاوسی در دو بعد
تابع گاوسی در دو بعد

زمانی که این فیلتر در دو بعد ایکس و ایگرگ اعمال می‌شود باعث ایجاد سطحی می‌شود که در آن کانتور‌ها (حد فاصل ها) دایره‌های متحدالمرکز با توزیع گاوسی از نقطه‌ی مرکزی فیلتر هستند.

مهم‌ترین کاربرد و وجه تمایز فیلتر گاوسی از بین بردن لبه‌های تیز و کاهش کنتراست تصویر است. لازم به ذکر است که بر خلاف فیلتر‌های میانه و میانگین فیلتر گاوسی یک فیلتر خطی است. (به زبان ساده یک فیلتر به شکل یک تابع خطی است، اگر: (Fm(A+λB)=Fm(A)+λFm(B)

فیلتر گاوسی با کرنل ۵*۵
فیلتر گاوسی با کرنل ۵*۵


cv2.bilateralFilter:

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

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

همانطور که دیده می‌شود، بهترین عملکرد را فیلتر bilateral روی تصویر ورودی دارد. اگر الگوریتم تشخیص لبه بر روی عکس خروجی این فیلتر اجرا شود می‌بینیم که:

فیلتر canny با thresholdهای ۱۰۰ و ۲۰۰
فیلتر canny با thresholdهای ۱۰۰ و ۲۰۰

جمع بندی:

کتابخانه opencv ابزار‌های بسیار زیادی را برای از بین بردن نویز‌ها در اختیار ما می‌گذارد. بسته به نیاز، می‌توان از فیلتر دلخواه استفاده کنیم. به عنوان مثال اگر از بین بردن نویز‌هایی مثل salt & pepper را در نظر داریم میتوانیم از فیلتر‌های میانگین و میانه استفاده کنیم و اگر می‌خواهیم که نویز های حاصل از لبه های تند را از بین ببریم از فیلتر گاوسی.