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

التعتيب البسيط "Simple Thresholding"  في OpenCV

Ali Ismael

السؤال

Recommended Posts

  • 1

يقصد بالتعتيب إنشاء قناع (Mask)، لمجال لوني محدد من الصورة بحيث يظهر هذا المجال اللوني بالأبيض (غالباً) وأي لون خارج هذا المجال سيكون أسود (غالباً) وذلك لإظهاره وتحديده بغاية القيام بعمليات معينة على الصورة. وللقيام بعملية التعتيب نستخدم التابع cv2.threshold حيث يتم مقارنة كل بكسل في الصورة مع قيمة محددة نسميها  العتبة (threshold) في حال كانت قيمة البكسل أكبر أو تساوي العتبة يتم استبدال قيمة البكسل ب 255 وإلا تستبدل بالرقم 0 (يمثل اللون الأسود). للقيام بعملية التعتيب نستخدم التابع threshould والذي يأخذ 5 وسطاء، الأول الصورة الأصلية التي نريد تعتيبها مقروءة بالصيغة الرمادية، أما الثاني فهو مصفوفة الخرج(التي نريد وضع الناتج فيها -اختياري-)، أما الثالث فهو قيمة العتبة. ويمثل الرابع القيمة التي يجب تحويل البكسل إليها في حال كانت قيمة البكسل أكبر من العتبة. أما الوسيط الخامس هو نوع العتبة المراد تطبيقها وهناك 6 أنواع مختلفة:

cv2.THRESH_BINARY # تعتيب ثنائي الحالة الافتراضية التي نستخدمها
cv2.THRESH_BINARY_INV # نفس السابق لكن بشكل معكوس
cv2.THRESH_TRUNC  # القيم الأعلى من العتبة يتم ضبطها لتصبح مساوية لقيمة العتبة أما باقي البكسلات تبقى كما هي
cv2.THRESH_TOZERO # ضبط كثافة البكسل على 0 ، لكل كثافة بكسل ، أقل من الحد الأدنى 
cv2.THRESH_TOZERO_INV # معكوس السابق

والصورة التالية توضح الفروقات بين هذه الأنواع:
1.png.cb913d20b609db4a724e8915694a0315.png
وهنا المعادلات التي تعتمد عليها هذه الأنواع:
ex.png.fdc427e6a70983251e84379b343c5124.png
ويعيد هذا التابع قيمة على شكل Tuple،  بحيث القيمة الأولى تمثل قيمة العتبة التي قمت بتحديدها، في حين القيمة الثانية تمثل المصفوفة الناتجة.

cv2.threshold(src, dst, thresh, maxval, type)

في المثال التالي سنقوم بتعتيب صورة واستخدام كل أنواع التعتيب البسيط:

import cv2
import numpy as np
from matplotlib import pyplot as plt
# قراءة الصورة بالصيغة الرمادية
img = cv2.imread(r'C:\Users\Windows.10\Desktop\Safedrive\images.jpg',0)
# THRESH_BINARY تطبيق أول نوع
_,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# THRESH_BINARY_INV
_,thresh2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
# THRESH_TRUNC
_,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
# THRESH_TOZERO
_,thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
# THRESH_TOZERO_INV
_,thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
# الآن سأعطي عناوين للصور للوضوح
titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
# نضع الصور ضمن قائمة
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]
# نقوم بعرضها
for i in range(6):
    #من مكتببة ماتبلوتليب لرسم أكثر من شكل ضمن نفس النافذة subplot أستخدام التابع 
    plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
fig =plt.gcf()
fig.set_size_inches(20.0, 20.0)
plt.show()

والخرج:
index.thumb.png.94b48b4e04b79edad3c03a29502bfb5e.png

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

ببساطة يعتبر التعتيم البسيط هي طريقة لفصل بعض عناصر الصورة عن بعضها الاخر، بحيث يتم وضع قيمة يكون ما قبلها مثلا 0 أي أسود وما بعدها يكون 255 أي ابيض كالكود التالي:

If f (x, y) < T 
   then f (x, y) = 0 
else 
   f (x, y) = 255

where 
f (x, y) = Coordinate Pixel Value
T = Threshold Value.

وتوجد منها الكثير من الأنواع التي تختلف في طريقة عملها وهي كالتالي:
 

cv2.THRESH_BINARY #تكون القيم أما 0 أو 1
cv2.THRESH_BINARY_INV # نفس طريقة عمل السابقة لكن ما يكون أبيض هناك هو أسود هنا والعكس
cv2.THRESH_TRUNC  # تضع الحد الأقصي لقيمة البيكسل وما أكبر منها تجعله يساويها
cv2.THRESH_TOZERO # تقوم بوضع كل كثافة بيكسل أقل من القيمة الموضوعه ل 0 
cv2.THRESH_TOZERO_INV # عكس السابقه بحيث كل كثافة بيكسل أقل من القيمة الموضوعه ب 255

وكمثال لطريقة عمل كل منهم أنظر الكود التالي حيث نقوم بتحميل صورة وتطبيق كل الطرق عليها لملاحظة الفرق:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('gradient.png',0)
ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
ret,thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
ret,thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)

titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]

for i in xrange(6):
    plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])

plt.show()

تكون الفروقات واضحة كالتالي:

threshold.jpg.f88c34d956b64c6374eb05ea67434f98.jpg

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...