در قسمت قبلی با کرنلها و نحوه کارکرد آنها و استفاده از آنها برای ایجاد فیلتر روی تصاویر آشنا شدیم؛ حال با اعمال فیلتر روی تصاویر با استفاده از کتابخانه Open CV و توابع مربوطه آشنا میشویم.
اعمال فیلترهای دو بعدی رو تصویر
با استفاده از Open CV اعمال فیلترهای دو بعدی توسط کرنل بر روی تصاویر توسط تابع زیر انجام میشود:
1 |
cv2.filter2D(src, ddepth, kernel[, ...]) → dst |
این تابع یک تصویر را به عنوان اولین و یک ماتریس کرنل را به عنوان سومین ورودی خود گرفته و تصویر حاصل از اعمال کرنل بر روی تصویر داده شده را به عنوان خروجی برمیگرداند.
فیلتر محوی (Blur Filter)
همانطور که در پست قبل دیدیم برای محو کردن تصویر میتوانیم یک کرنل Moving Average را بر روی تصویر اعمال کنیم. این کرنل یک ماتریس با مجموع جملات ۱ است و هرچه کرنل بزرگتر باشد میزان تاری تصویر بیشتر خواهد شد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import cv2 import numpy as np image = cv2.imread('images/input.jpg') cv2.imshow('Original Image', image) cv2.waitKey(0) # Creating our 3 x 3 kernel kernel_3x3 = np.ones((3, 3), np.float32) / 9 # We use the cv2.fitler2D to conovlve the kernal with an image blurred = cv2.filter2D(image, -1, kernel_3x3) cv2.imshow('3x3 Kernel Blurring', blurred) cv2.waitKey(0) # Creating our 7 x 7 kernel kernel_7x7 = np.ones((7, 7), np.float32) / 49 blurred2 = cv2.filter2D(image, -1, kernel_7x7) cv2.imshow('7x7 Kernel Blurring', blurred2) cv2.waitKey(0) cv2.destroyAllWindows() |
کرنلی که در دفعه قسمت اول برای تاری استفاده شده است یک ماتریس ۳*۳ با عناصر ۱ است که از آنجا که مجموع عناصر ماتریس باید ۱ باشد تقسیم بر ۹ شده است. همچنین برای قسمت دوم از ماتریس بزرگتر ۵*۵ استفاده شده و تقسیم بر ۲۵ شده است.
برای اعمال فیلتر Blur میتواند از تابع اختصاصی زیر نیز استفاده کرد:
1 2 3 |
cv2.blur(src, ksize[, ...]) → dst Exapmle: Blur = cv2.blur(image, (3,3)) |
این تابع یک تصویر را به همراه سایز ماتریس کرنل مورد نظر گرفته و تصویر محو شده را با عنوان خروجی برمیگرداند.
دیگر فیلترهای Blur
در Open CV علاوه بر کرنل Box (کرنل Moving Average مورد استفاده تا الان) برای محو کردن تصویر لکرنلهای گوسین (Gaussian)، مدین (Median) و دوجانبه (Bilateral) نیز پشتیبانی میشوند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import cv2 import numpy as np image = cv2.imread('images/input.jpg') cv2.imshow('original', image) cv2.waitKey(0) # Averaging done by convolving the image with a normalized box filter. # This takes the pixels under the box and replaces the central element # Box size needs to odd and positive blur = cv2.blur(image, (3,3)) cv2.imshow('Averaging', blur) cv2.waitKey(0) # Instead of box filter, gaussian kernel Gaussian = cv2.GaussianBlur(image, (7,7), 0) cv2.imshow('Gaussian Blurring', Gaussian) cv2.waitKey(0) # Takes median of all the pixels under kernel area and central # element is replaced with this median value median = cv2.medianBlur(image, 5) cv2.imshow('Median Blurring', median) cv2.waitKey(0) # Bilateral is very effective in noise removal while keeping edges sharp bilateral = cv2.bilateralFilter(image, 9, 75, 75) cv2.imshow('Bilateral Blurring', bilateral) cv2.waitKey(0) cv2.destroyAllWindows() |
فیلتر Gaussian Blur
این فیلتر محو کردن را به گونهای انجام میدهد که پیکسلهای نزدیکتر سهم بیشتری در نتیجه عملیات کراسکرولیشن و در نتیجه تصویر تار شده نهایی داشته باشند.
فیلتر Median Blur
این فیلتر متوسط مقدار پیکسلهایی که درون کرنل قرار میگیرند را به عنوان مقدار نهایی پیکسل قرار میدهد.
فیلتر Bilateral Blur
این فیلتر سعی میکند درحالی که تصویر را محو میکند لبههای تصویر را تیز و دست نخورده نگاه دارد. به دلیل همین ویژگی این فیلتر در حذف نویز کاربرد زیادی دارد.
حذف نویز تصویر
برای حذف نویز تصویر میتوان از تابع زیر که از روش میانگین گیری استفاده میکند کمک گرفت:
1 |
fastNlMeansDenoisingColored(InputArray src, OutputArray dst, float h=3, float hColor=3, int templateWindowSize=7, int searchWindowSize=21 ) |
پارامترهای تابع عبارتاند از:
- src : عکس مورد نظر برای حذف نویز
- dst : متغیری برای ذخیره کردن عکس خروجی – با دادن none به این پارامتر، خروجی تابع عکس خروجی خواهد بود.
- h : این پارامتر قدرت فیلتر را برای میزان شدت نور تنظیم میکند. هرچه مقدار این پارامتر بزرگتر باشد علاوع بر حذف نویز ممکن است از جزئیات تصویر نیز بکاهد و هرچه کوچکتر باشد جزئیات تصویر را نمیکاهد اما ممکن است نویزها را به درستی کاهش ندهد (بازه ۵ تا ۱۰ برای این پارامتر مناسب است).
- hcolor : همانند h برای مولفههای رنگی
- templateWindowSize : سایز گیره محاسبه کننده وزنها (باید عددی فرد باشد).
- searchWindowSize : سایز کرنل محاسبه کننده میانگین وزندار برای هر پیکسل (باید عددی فرد باشد).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import numpy as np import cv2 image = cv2.imread('images/taj-rgb-noise.jpg') # Parameters, after None are - the filter strength 'h' (5-10 is a good range) # Next is hForColorComponents, set as same value as h again # dst = cv2.fastNlMeansDenoisingColored(image, None, 6, 6, 7, 21) cv2.imshow('Fast Means Denoising', dst) cv2.imshow('original image', image) cv2.waitKey(0) cv2.destroyAllWindows() |
بر اساس نوع تصویر چهار تابع محتلف برای کاهش نویز توسط روش میانگین گیری وجود دارد
- ()cv2.fastNlMeansDenoising : یا یک تصویر Grayscale کار میکند.
- ()cv2.fastNlMeansDenoisingColored : با یک تصویر رنگی کار میکند.
- ()cv2.fastNlMeansDenoisingMulti : با رشتهای از عکسهای Grayscale که با فاصله زمانی کم گرفته شدهاند کار میکند.
- ()cv2.fastNlMeansDenoisingColoredMulti : مانند قبلی برای عکسهای رنگی.
شبکه های اجتماعی