اذهب إلى المحتوى
  • 0

زيادة حدة الصورة sharpening في OpenCV | بايثون

Ali Ismael

السؤال

Recommended Posts

  • 1

كما تعلم فإن مرشحات الحدَ هدفها الأساسي هو العمل المعاكس لمرشحات التنعيم، حيث أن مرشحات التنعيم تقوم بعمل تشويش للصورة وأهم تطبيقاتها هي إزالة الضجيج أو تنعيم الصورة، أما مرشحات الحدَ، فهي بالعكس، حيث أنها تقوم بتوضيح الحواف. كما أنه كنصيحة مني فإنه في حالة كانت الصورة الخاصة بك تحوي بعض الضجيج فلابد من أن تقوم أولاً بتطبيق مرشح تنعيم على الصورة لإزالة الضجيج منها، فالضجيج هو حافة في نهاية الأمر وبالتالي تطبيق مرشح تعزيز (حدَ) سيؤدي إلى تعزيز الضجيج وهذا أمر غير مرغوب فيه.
هناك تقنيات عدة تقنيات لزيادة حدة الصورة وتعتمد كلها على تقنيات الحد sharpening Spatial Filters، وتعتمد على نوعين من المشتقات، مشتقات الدرجة الأولى مثل مرشح سوبل أو الثانية مثل مرشح لابلاسيان، ثم نستخدم المعادلة التالية -مثلاً في حالة استخدام لابلاسيان تكون:

g(x,y)=f(x,y)+c[∇2f(x,y)]
g(x,y): الصورة المعززة
f(x,y): الصورة الأصلية
∇2f(x,y): الصورة بعد تطبيق مرشح الحد(لابلاسيان)

حيث أن قيمة المعامل c هي إما 1 أو -1 وتعتمد على الكيرنل التي استخدمتها في تطبيق لابلاسيان وتساوي إما 1 أو -1 بحيث:

laplacian1=np.array(
  [[0,1,0],
   [1,-4,1],
   [0,1,0]]) # تكون قيمة c=1-
laplacian2=np.array(
  [[1,1,1],
   [1,-8,1],
   [1,1,1]]) # c=1-
laplacian3=np.array([[0,-1,0],
                     [-1,4,-1],
                     [0,-1,0]]) # c=+1
laplacian4=np.array([[-1,-1,-1],
                     [-1,+8,-1],
                     [-1,-1,-1]]) # c=+1

في المثال التالي سنقوم بتطبيق الفكرة السابقة وهي أفضل طريقة لزيادة حدة الصورة بالاعتماد على مشتقات الدرجة الثانية (لابلاسيان) والمعادلة السابقة:

import cv2 as cv
import matplotlib.pyplot as plt
# قراءة الصورة
image = cv2.imread('/content/closedeye1.jpg',1)
# matplotlib هنا فقط سأقوم بتحويل فضاء الألوان لأنني سأقوم بعرض الصورة باستخدام 
image=cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(image)
# سنجرب فلاتر لابلاسيان المختلفة
laplacian1=np.array([[0,1,0],[1,-4,1],[0,1,0]]) # c=-1
laplacian2=np.array([[1,1,1],[1,-8,1],[1,1,1]]) # c=-1
laplacian3=np.array([[0,-1,0],[-1,4,-1],[0,-1,0]]) # c=1
laplacian4=np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]]) # c=1
# تطبيق الفلاتر لنرى نتيجة كل واحد  على الصورة
image_laplacian1=cv.filter2D(src=image, kernel=laplacian1, ddepth=-1)
image_laplacian2=cv.filter2D(src=image, kernel=laplacian2, ddepth=-1)
image_laplacian3=cv.filter2D(src=image, kernel=laplacian3, ddepth=-1)
image_laplacian4=cv.filter2D(src=image, kernel=laplacian4, ddepth=-1)
# تعزيز الصور
image_sharping_1=cv2.subtract(image,image_laplacian1)
image_sharping_2=cv2.subtract(image,image_laplacian2)
image_sharping_3=cv2.add(image,image_laplacian3)
image_sharping_4=cv2.add(image,image_laplacian4)
# عرض النتائج
import matplotlib.pyplot as plt
plt.figure(figsize=(15,30))
plt.subplot(521)
plt.imshow(image)
plt.title("original image")
plt.subplot(522)
plt.imshow(image_sharping_1)
plt.title("sharpenend_image 1")
plt.subplot(523)
plt.imshow(image_sharping_2)
plt.title("sharpenend_image 2")
plt.subplot(524)
plt.imshow(image_sharping_3)
plt.title("sharpenend_image 3")
plt.subplot(525)
plt.imshow(image_sharping_4)
plt.title("sharpenend_image 4")

الخرج:
index.thumb.png.c04b80c0755752483dcf4ab2a22cf999.png

تم التعديل في بواسطة Ali Haidar Ahmad
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

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

لذلك فإنه ولفعل هذا، يجب أن نقوم بتمرير مصفوفة تحدث هذا الفرق، لذا قد نستخدم مثل هذة المصفوفة:

22570Capture.png.33d38190979dbd109db3434bcbbab3f0.png

بحيث تمر المصفوفة على كل بيكسل ونقوم بضربها فيها، لاحظ أن القيمة التي في المنتصف كبيرة بشدة عما حولها، كذلك فانه الصف الأول يشابه الصف الأخير ونفس الموضوع بالنسبة للعمود وهذا حتى نحدث فرقاً واضحاً حول قيمة البيكسل التي في المنتصف لزيادة حدة الصورة.

المثال التالي يوضح كيفية تأثر الصورة بها.

هنا نبدأ بعرض الصورة الأصلية:

import cv2
import numpy as np
image = cv2.imread('C:/Users/ahmed/Pictures/images.jpg', flags=cv2.IMREAD_COLOR)
cv2.imshow('AV CV- Winter Wonder', image)
cv2.waitKey()
cv2.destroyAllWindows()

91190Capture.png.aff667adabaed7fc0414bef67e7c230c.png

بعد ذلك نضيف المصفوفة ونقوم بعملية زيادة الحدة:

kernel = np.array([[0, -1, 0],
                   [-1, 5,-1],
                   [0, -1, 0]])
image_sharp = cv2.filter2D(src=image, ddepth=-1, kernel=kernel)
cv2.imshow('AV CV- Winter Wonder Sharpened', image_sharp)
cv2.waitKey()
cv2.destroyAllWindows()

وتكون النتيجة واضحة هكذا:

97924Capture.png.e7f40f8f2b19d419ac1dbb5a5734532e.png

يمكنك استخدام أي مصفوفة تريدها كمشتقات لابلاس أو غيرها بحيث توصلك الى درجة الحدة التي تريد.

تم التعديل في بواسطة Ahmed Sharshar
رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...