Lesson_8_Smoothing

  |   Source

تنعيم الصور:

الهدف:

  • تغبيش الصورة مع عدة مرشحات للتردد المنخفض

  • تطبيق مرشحات محددة التركيب للصور (الطي)الثنائي

الطي ثنائي البعد - ترشيح الصور:

كما في الاشارات وحيدة البعد يمكن ايضاً فلترة الصور باستخدام مرشحات LPF , HPF الاول يساعد في ازالة الضجيج وتغبيش الصورة والثاني يساعد بايجاد الحواف بالصورة وبالمكتبة هنا لدينا التابع cv2.filter2D لطي قناع مع صورة , وكمثال سنجرب هنا مرشح معدل على صورة , , مرشح توسيطي قد يعرف كالتالي

$$K = \frac{1}{25} \begin{bmatrix} 1 && 1 && 1 && 1 && 1 \\ 1 && 1 && 1 && 1 && 1 \\ 1 && 1 && 1 && 1 && 1 \\ 1 && 1 && 1 && 1 && 1 \\ 1 && 1 && 1 && 1 && 1 \end{bmatrix} $$

وهذا يكافئ حساب المتوسط لمجموعة البكسلات الواقعة ضمن القناع , جرب الكود التالي وقارن النتيجة

In [2]:
import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('opencv_ios.png')

kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img,-1,kernel)

plt.figure(figsize=[10,10])
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()

تنعيم الصورة:

وتستخدم لازالة الضجيج , تحديدا التردادات المرتفعة , وتجعل الحواف اخف , ولكن هناك انواع لا تفعل , عموما المكتبة OpenCV تقدم 4 تقنيات اساسية , للتغبيش كالتالي

التوسيط:

وهذا يطبق تابع الصندوق على الصورة , وهذا يتم من خلال التوابع cv2.blur , cv2.boxFilter ويجب تحديد الطول والعرض للقناع المعدل

ملاحظة:

اذا لم ترد استخدام قناع معدل , يمكنك استخدام التابع الثاني من اعلاه وتمرير normalized = False

الق نظرة , على البرنامج التالي ذو القناع 5,5

In [3]:
# for the above image
blur = cv2.blur(img,(5,5))

plt.figure(figsize=[10,10])
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()

الترشيح الغاوسي:

والان بدلا من قناع صندوق ذو عوامل متساوية سنستخدم مرشح غاوسي , وهذا يتم عبر التابع , cv2.GaussianBlur ويتم ادخال حجم القناع كاعداد مفردة , كذلك الانحراف المعياري على المحورين , وفي حال كان احداهما فقط معطى يكون الثاني مساوياً له , واذا اعطيا القيمة صفرا , يحسبان من حجم القناع , وهذا المرشح مفيد جدا بازالة الضجيج الغاوسي من الصورة واذا اردت يمكنك انشاء القناع الغاوسي بوساطة cv2.getGaussianKernel وبتحوير سطر واحد بالكود السابق

In [4]:
# for the above image
blur = cv2.GaussianBlur(img,(5,5),0)

plt.figure(figsize=[10,10])
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()

الترشيح الاوسطي:

وهنا يحسب التابع , العنصر الاوسط بالقيمة لمجموعة البكسلات تحت القناع ويستبدله بالعنصر المركزي cv2.medianBlur وهذا الترشيح فعال جدا بحالة ضجيج الملح والفلفل , واحدى الملاحظات المثيرة ان المرشحات السابقة دائما ما تستبدل العنصر بقيمة قد لاتكون اصلا في الصورة , على عكس الترشيح الاوسطي , مما يقلص الضجيج بفعالية ,

قياس القناع يجب ان يكون عددا مفردا . وبهذا المثال اخذنا , صورة بضجيج و طبقنا المرشح الاوسطي عليها

In [4]:
img = cv2.imread('noisy1.bmp')
median = cv2.medianBlur(img,5)

plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.show()
plt.imshow(median),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()

Bilateral الترشيح :

كما لاحظنا تميل المرشحات السابقة لتغبيش الحواف , ولكن هذا لايتم بحالة هذا المرشح , وهذا هو غرضه الاساسي , بحيث يزيل الضجيج دون الاضرار بالحواف cv2.bilateralFilter فالمرشح الغاوسي لا يهتم بان البكسلات تحت القناع ذات شدات متقاربة ام لا , مما يغبش الحواف

وهذا المرشح ياخذ قناعا غاوسياً ايضاً ولكن مع مضروب اضافي تابع للفرق بشدات البكسلات , وهو بذلك يحتسب كل من الجوار المكاني والجوار في الشدات , وبذلك يحافظ على الحواف , والكود ادناه يوضح استخدامه :

In [5]:
dst = cv2.imread('PICT0173.jpg')

# change 4 matplotlib
img1 = np.zeros(dst.shape,np.uint8)
img1[:,:,0] = dst[:,:,2]
img1[:,:,1] = dst[:,:,1]
img1[:,:,2] = dst[:,:,0]

blur = cv2.bilateralFilter(img1,9,75,75)

plt.imshow(img1),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.show()
plt.imshow(blur),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()

مراجع اضافية

هناك الكثير من المراجع حول bilateral filtering

تمارين:

خذ صورة واضف لها ضجيج غاوسي ,وايضاً ملح وفلفل لها , راقب الاثر خلال المرشحات السابقة كلها , مع زيادة نسب الضجيج وقارن النتائج ..

ملاحظة

هذا التمرين , يمكن حله بطرق ديناميكية تضمن زيادة الضجيج من خلال اداة سحب مثلا

Comments powered by Disqus