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

استخدام تحويل أوتسو Otsu’s Binarization لحساب قيمة العتبة للصور الثنائية في OpenCV

Ali Ismael

السؤال

Recommended Posts

  • 1

تحويل أوتسو هو تحويل يستخدم لحساب قيمة العتبة في الصور الثنائية (أبيض أسود) فقط (يمكن استخدامه مع باقي أنواع الصور لكن لن يعطي نتائج جيدة فهو مخصص للتعامل مع حالة الصور الثنائية).
في  التعتيب_البسيط يتم اختيار عتبة محددة نستنتجها من خلال التجريب أو إذا كنت محترفاً ستستخدم الهيستوغرام الخاص بها لإيجاد العتبة. أما إذا كانت لديك صورة ثنائية (الصورة الثنائية هي الصورة التي تملك قيمتين في هستوغرامها)  فسنأخذ قيمة وسطة بين هاتين القيمتين وهذا مايفعله أوتسو. ولتطبيقه نقوم بإضافة "+" الخاصية cv2.THRESH_OTSU إلى الخاصية cv2.THRESH_BINARY مع الدالة cv2.threshold:

retValue, thresh=cv2.threshold(source, thresholdValue, maxVal, thresholdingTechnique)
# thresholdingTechnique=cv2.THRESH_BINARY + cv2.THRESH_OTSU
# maxVal=255
# thresholdValue=0

حيث أننا هنا نقوم بتمرير القيمة 0 إلى الوسيط thresholdValue لكي يقوم أوتسو بإيجاد أفضل قيمة للعتبة (يتم تجاهل هذا الوسيط عموماً). وقيمة العتبة التي يجدها أوتسو هي التي سيتم تطبيقها على الصورة  ويتم تخزينها في retValue.
في المثال التالي سيكون لدينا صورة تحوي ضجيج سنطبق عليها تعتيب بسيط ثم تعتيب باستخدام أوتسو ثم سنطبق عليها مرشح غاوصي لإزالة الضجيج ثم سنطبق عليها أوتسو مرة أخرى لنرى النتائج:

import cv2
from matplotlib import pyplot as plt
import numpy as np
# قراءة الصورة
im = cv2.imread('/content/The-original-Gaussian-noisy-image-The-Gaussian-noise-parameters-are-zero-mean-and.png',0)
# global thresholding
ret1,th1 = cv2.threshold(im,127,255,cv2.THRESH_BINARY)
# Otsu's thresholding
ret2,th2 = cv2.threshold(im,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# Otsu's thresholding + Gaussian filtering
blur = cv2.GaussianBlur(im,(3,3),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# نقوم الآن برسم النتائج + الهيستوغرامات
images = [img, 0, th1,img, 0, th2,blur, 0, th3]
# لإعطاء تسميات توضيحية للرسوم
titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)',
'Original Noisy Image','Histogram',"Otsu's Thresholding",
'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]
for i in range(3):
  plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
  plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
  plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
  plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])
  plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
  plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])
fig =plt.gcf()
fig.set_size_inches(20.0, 20.0)
plt.show()

الخرج:
index.thumb.png.7761f2508a1f4372ffc9583fa7cf7757.png

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...