تار سازی و image smoothing

  • مدرس: علی بیگدلی
  • تاریخ انتشار: Sep 05, 2020

اهداف این قسمت:

  • تصاویر را با فیلترهای مختلف کم عبور تار کنید
  • فیلترهای سفارشی را روی تصاویر اعمال کنید (کانولوشن 2 بعدی)

2D Convolution (فیلتر کردن تصویر)

همانند سیگنالهای یک بعدی ، تصاویر را می توان با انواع فیلترهای ,پایین گذر (LPF) ، فیلترهای بالا گذر  (HPF) و غیره فیلتر کرد. LPF به حذف نویز ، تار شدن تصاویر و غیره کمک می کند. فیلترهای HPF در یافتن لبه ها درتصاویر یاری می دهند.

OpenCV یک تابع cv.filter2D () را برای ترکیب هسته با تصویر فراهم می کند. به عنوان مثال ، ما یک فیلتر میانگین روی تصویر را امتحان می کنیم. هسته فیلتر به طور متوسط 5x5 مانند زیر است:

عملکرد به این صورت است:

این هسته را بالای یک پیکسل نگه دارید ، تمام 25 پیکسل زیر این هسته را اضافه کنید ، میانگین بگیرید و پیکسل مرکزی را با مقدار متوسط جدید جایگزین کنید. این عملیات برای همه پیکسل های تصویر ادامه دارد. این کد را امتحان کنید و نتیجه را بررسی کنید:

import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('opencv_logo.png')
kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img,-1,kernel)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(dst),plt.title('Averaging')
plt.xticks([]), plt.yticks([])
plt.show()

خروجی قطعه کد بالا:

تاری تصویر (image smoothing)

تاری تصویر با ترکیب تصویر با یک هسته فیلتر پایین گذر حاصل می شود. برای از بین بردن نویز مفید است. در واقع محتوای فرکانس بالا (به عنوان مثال: نویز ، لبه ها) را از تصویر پاک می کند. بنابراین در این عملیات لبه ها کمی تار می شوند (تکنیک های تاری نیز وجود دارد که لبه ها را تار نمی کند). OpenCV چهار نوع اصلی از روش های تاری را فراهم می کند.

1. میانگین گیری یا Averaging

این کار با ترکیب تصویر با فیلتر جعبه نرمال انجام می شود. این به سادگی میانگین تمام پیکسل های زیر هسته را می گیرد و جایگزین عنصر مرکزی می شود. این کار توسط تابع cv.blur () یا cv.boxFilter () انجام می شود. برای جزئیات بیشتر در مورد هسته ، اسناد را بررسی کنید. باید عرض و ارتفاع هسته را مشخص کنیم. یک فیلتر جعبه نرمال 3x3 مانند زیر است:

قطعه کد زیر نمونه ای از انجام Averaging را به شما نشان می دهد.

import cv2 
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('opencv-logo-white.png')
blur = cv2.blur(img,(5,5))
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()

خروجی قطعه کد بالا:

2. Gaussian blur

در این روش به جای فیلتر جعبه ای ، از هسته گوسی استفاده می شود. با تابع cv.GaussianBlur () انجام می شود. باید عرض و ارتفاع هسته را مشخص کنیم که باید مثبت و فرد باشد. همچنین باید به ترتیب انحراف معیار را در جهت X و Y ، sigmaX و sigmaY مشخص کنیم. اگر فقط sigmaX مشخص شده باشد ، sigmaY همان sigmaX است. اگر هر دو به عنوان صفر داده شوند ، از اندازه هسته محاسبه می شوند. تاری گاوسی در از بین بردن نویز گوسی از تصویر بسیار مؤثر است.

اگر می خواهید ، می توانید یک هسته Gaussian با تابع cv.getGaussianKernel () ایجاد کنید.

کد زیر را می توان برای تاری گاوسی استفاده کرد:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('opencv-logo-white.png')
blur = cv2.GaussianBlur(img,(5,5),0)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Gaussian Blurred')
plt.xticks([]), plt.yticks([])
plt.show()

خروجی قطعه کد بالا:

3. Median blur

در اینجا ، تابع cv.medianBlur () میانه تمام پیکسلهای زیر منطقه هسته را می گیرد و عنصر مرکزی با این مقدار متوسط جایگزین می شود. این در برابر نویز یا  نمک و فلفل (salt & pepper) در تصویر بسیار مثر است. جالب است که در فیلترهای بالا ، عنصر مرکزی یک مقدار تازه محاسبه شده است که ممکن است یک مقدار پیکسل در تصویر یا یک مقدار جدید باشد. اما در تاری  ، عنصر مرکزی همیشه با مقداری پیکسل در تصویر جایگزین می شود. این نویز را به طور موثر کاهش می دهد. اندازه هسته آن باید یک عدد مثبت باشد.

در این نسخه ی نمایشی ، من 50٪ نویز به تصویر اصلی خود اضافه کردم و median blur را اعمال کردم. نتیجه را بررسی کنید:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('opencv-logo-white.png')
median = cv.medianBlur(img,5)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(median),plt.title('Median Blurred')
plt.xticks([]), plt.yticks([])
plt.show()

خروجی قطعه کد بالا:

4. فیلتر کردن دو طرفه یا Bilateral Filter

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

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

نمونه زیر استفاده از یک فیلتر دو طرفه را نشان می دهد :

​import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('opencv-logo-white.png')
blur = cv.bilateralFilter(img,9,75,75)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Bilateral Blurred')
plt.xticks([]), plt.yticks([])
plt.show()

​

خروجی قطعه کد بالا:

ثبت دیدگاه
نام *
ایمیل*
دیدگاه *
0دیدگاه