آستانه سازی

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

آستانه سازی Threshold در OpenCV

در این آموزش، ما آستانه (threshold) را برای تحلیل تصویر و ویدئو را پوشش خواهیم داد. ایده آستانه سازی این است که داده های بصری را برای تجزیه و تحلیل کوچکتر، ساده کنیم. در قدم اول تصویر به grayscale تبدیل خواهد شد، اما می بایست در نظر داشته باشید که هنوز مقیاس رنگی 255 ارزش عددی را خواهد داشت. thresholding و یا آستانه سازی می تواند این مقایس را به سیاه و سفید ببرد و فقط از 0 و 1 برای مشخص کردن وجود نور و یا رنگ مورد نظر استفاده کند. تصور کنید که می خواهید آستانه عددی را برابر با 125 قرار دهید، بنابر این هر ارزش عددی که بالای 125 قرار داشته باشد را برابر 1 (یا سفید) و هر ارزش عددی که کم تر از آستانه مشخص شده باشد برابر با 0 (یا سیاه) خواهد بود. اگر قبل از آستانه سازی تصویر شما grayscale باشد تصویر نهایی شما سیاه و سفید خواهد بود ،اما در صورتی که تصویر شما grayscale نباشد آستانه سازی تصویر حالت رنگی خواهد بود. در حالی که این کار ساده به نظر می رسد اما در واقع این طور نیست. کار هایی که با این ایده انجام می گیرد از انعطاف بالایی برخوردار است و در بیشتر زمینه های تشخیص اشیا و حتی حرکت و به خصوص خواندن نوشته از روی عکس کاربرد های فراوانی دارد. برای درک بهتر به سراغ مثال هایی برای شفاف سازی این عملکرد با تصویر نمونه زیر خواهیم رفت. تابع cv2.threshold وظیفه آستانه سازی برای تصویر را بر عهده دارد و دارای موارد شخصی سازی بسیاری در این زمینه نیز می باشد. این تابع به دلیل ایجاد خروجی دوگانه نیاز به تخصیص دو متغیر دارد و همچنین در آرگومان های ورودی آن اعدادی برای ایجاد محدوده آستانه سازی و ارزش میانی به چشم می خورد. اما قسمت مهم این آستانه سازی به مدل آن نیز بر می گردد.

name1, name2 = cv2.threshold(source, 'threshold value', 'highest thresh value','threshold model')

برای انجام تست های مربوط به threshodling در opencv از نمونه تصویر زیر استفاده می کنیم.

مدل های مختلف (اولیه و ثابت) آستانه سازی:

cv.THRESH_BINARY
cv2.THRESH_BINARY_INV
cv2.THRESH_TRUNC
cv2.THRESH_TOZERO
cv2.THRESH_TOZERO_INV

در این نمونه کد با مشخص کردن آستانه 100 و بالاترین مقداری که 255 است به آستانه سازی با مدل باینری می پردازیم.برای درک بهتر کد کامنت های مربوطه را مشاهده نمایید.

# اضافه کردن کتابخانه پردازش تصویر و ماتریس ریاضی
import cv2
import numpy as np

#خواندن ورودی عکس و تخصیص به متغیر
img = cv2.imread('sample.jpg')
#استفاده از تابع استانه سازی با فرمت زیر
#name1, name2 = cv2.threshold(source, 'threshold value', 'highest thresh value','threshold model')
retval, threshold = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)
#نشان دادن تصویر اصلی
cv2.imshow('original',img)
#نشان دادن تصویر آستانه سازی شده
cv2.imshow('threshold',threshold)
#منتظر ماندن برای دریافت کلید ورودی و اتمام
cv2.waitKey(0)
#بستن تمام پنجره های ورودی
cv2.destroyAllWindows()

نکته: نمونه بالا تنها ساده ترین حالت ممکن برای آستانه سازی تصویر می باشد که می توانید با تغییر دادن مقدار آستانه از 100 به مقادیر دیگر در بازه 0-255 تست کنید. نکته: می توانید با جایگزینی هر یک از موارد مدل های آستانه سازی به تست و شناخت هر یک از آن ها بپردازید. تصویر زیر ایجاد تغییرات شناسایی آستانه را به شما نشان می دهد.

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

cv.ADAPTIVE_THRESH_MEAN_C 
cv.ADAPTIVE_THRESH_GAUSSIAN_C

همچنین از نمونه های معروف استانه سازی می توان به الگوریتم OTSU اشاره کرد که مقدار یک آستانه را از هیستوگرام تصویر برای یک تصویر دوبعدی محاسبه می کند. هیستوگرام تصویر چیست؟ (Histogram) هیستوگرام نموداری است که بازه‌ی رنگسایه‌ی فعلیِ تصویر را نشان می‌دهد. منظور از بازه‌ی رنگسایه ، شدت روشنایی تصویر است. هیستوگرام به ما نشان می‌دهد که چه میزان از تصویر در حال حاضر سایه خالص (در تاریکترین قسمت تصویر) و چه میزان سفید خالص (در روشنترین قسمت تصویر) است.

قطعه کد زیر نمونه ای از Adabtive Thresholding را به شما نشان می دهد:

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

img = cv2.imread('sudoku.png',0)
img = cv2.medianBlur(img,5)
ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,2)
th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
titles = ['Original Image', 'Global Thresholding (v = 127)','Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]
for i in xrange(4):
    plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

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

 

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