حذف نویز تصاویر در OpenCv
در سری مقالات آموزش OpenCv, میخواهیم با استفاده از تکنیک هایی نویز تصاویر را حذف کنیم.
بهبود تصاویر به این معنا است که در دید بیننده واضح تر و قابل قبول تر باشند. این بهبود میتواند در تاکید بر لبه ها, کاهش نویز و گاهی ویژگی های محوی تصاویر, تعریف شود. این دسته از تکنیک های بهبود تصاویر, در دسته spatial filtering قرار دارند. عمدتا اعمال filter بر تصاویر دارای استاندارد مشخص و ثابتی نیست و متناسب با تصاویر میزان اعمال filter متفاوت است.
اولین تکنیک برای حذف نویز, افزودن blurring filter است که گاها به آن smoothing نیز گفته میشود. خروجی این filter یک تصویر با نویز کمتر است. در این مقاله به بررسی سه تکنیک averaging, Gaussian و median میپردازیم.
برای استفاده از averaging filtering, مقدار هر pixel را از میانگین pixel های همسایگی آن بدست میآوریم. در واقع یک مربع ۳*۳ که خانه وسط آن بر pixel مورد نظر منطبق است را در نظر میگیریم و مقادیر درون مربع را میانگین گیری میکنیم و برابر با مقدار pixel قرار میدهیم. با استفاده از این تکنیک تصویر به صورت محو تر دیده میشود. هرچه pixel های بیشتری در همسایگی را درگیر کنیم, محو شدن تصویر افزایش مییابد.
در تکنیک Gaussian filtering, وزنی که به pixel های همسایگی اختصاص مییابد با فاصله آنها نسبت به pixel مورد نظر, ارتباط معکوس دارد. به این صورت که هرچه از pixel مرکز دورتر شویم, وزن pixel همسایگی کمتر میشود و نتیجه آن اعمال کمتر filter است. برای درک بهتر میتوانید به اینجا مراجعه کنید.
تکنیک آخر, تکنیک median filtering است. در این روش pixel های همسایگی بر اساس شدت مقدارشان مرتب سازی و مقدار pixel با میانه این دسته از اعداد برابر میشود. این تکنیک برای حذف نویز هایی از دسته salt and pepper بسیار کاربرد دارد.
تا به اینجا مفاهیمی مورد نیاز برای حذف نویز را بررسی کردیم. اکنون باید وارد کد نویسی آن شویم. در ابتدا روش averaging filtering را پیاده سازی میکنیم. پروژه را در ادامه پروژه قبلی مینویسیم. در قسمتی که مقدار boolean را تغییر میدادیم تا بتوانیم اعمال تغییرات را با تصویر اصلی مقایسه کنیم, به این صورت مینویسم:
double ratio = getSize(rgb, points.x, points.y); Imgproc.resize(rgb, image, new Size(), ratio, ratio, Imgproc.INTER_AREA); if (b) { Imgproc.blur(image, image, new Size(6 ,3)); } // display Bitmap bitmap = Bitmap.createBitmap(image.cols(), image.rows(), Bitmap.Config.RGB_565); Utils.matToBitmap(image, bitmap);
در اینجا با استفاده از متد blur, به تصویری که از حافظه خوانده میشود, کمی blurring filtering اعمال میشود. پارامتر سوم متد blur یک object از نوع کلاس Size است که حجم همسایگی را مشخص میکند. در اینجا ما یک مستطیل ۳*۶ تعریف کرده ایم.
برای استفاده از Gaussian Filtering به این صورت عمل میکنیم:
Imgproc.resize(rgb, image, new Size(), ratio, ratio, Imgproc.INTER_AREA); if (b) { Imgproc.GaussianBlur(image, image, new Size(5, 5), 0, 0); } // display Bitmap bitmap = Bitmap.createBitmap(image.cols(), image.rows(), Bitmap.Config.RGB_565); Utils.matToBitmap(image, bitmap);
دو پارامتر انتهایی به ترتیب انحراف از محور x و y را مشخص میکند. وقتی مقدار را صفر قرار میدهیم به این معنا است که در چارچوب تصاویر حرکت میکنیم.
اگر بخواهیم از median filtering استفاده کنیم, به این صورت عمل میکنیم:
Imgproc.medianBlur(image, image, 3);
در اینجا پارامتر سوم تنها یک عدد integer است. زیرا محدوده ای که در این روش در نظر گرفته میشود, یک محدوده مربعی است. بنابراین تنها نیاز است تا یکی از اضلاع آن را مشخص کنیم.
در این مقاله سعی شد تا یکی از روش های حذف نویز تصاویر را بررسی کنیم. این روش با استفاده از سه تکنیک این کار را برای ما انجام میدهد و هر یک از این تکنیک ها متناسب با تصویر و هدف کاربر انتخاب میشود.
سری مقالات آموزش OpenCv ادامه دارد.
با ما همراه باشید.
مطالب زیر را حتما مطالعه کنید
آموزش Gradle – اهمیت Project Automation
درک مفهوم کدنویسی تمیز در اندروید
5 هک ساده برای کاهش سایز فایل APK
آشنایی با RecyclerView در اندروید
Open/Closed Principle در قوانین Solid
توابع در زبان برنامه نویسی Kotlin
2 Comments
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
سلام
بابت مقالتون خیلی ممنونم
خیلی کمکم کرد
سلام. ممنون از همراهیتون دوست عزیز