آستانه گذاری (Thresholding) یکی از روش های بخش بندی تصویر (Image Segmention) است. آستانه گذاری عملیات غیر خطی (Non Linear) است که یک تصویر خاکستری را به یک تصویر دودویی (Binary Image) تبدیل می کند به طوری که دو سطح به پیسکل های تصویر انتساب داده شده است، که این دو سطح، یا پایین تر از مقدار آستانه و یا بالاتر از مقدار آستانه هستند. به طور کلی می توانیم تصویرها را به سه دسته خاکستری (Grayscale)، رنگی (Color) و دودویی دسته بندی کنیم.

هدف از بخش بندی تصویر (یا فریم های ویدیو)، تقسیم کردن تصویر به ناحیه های است که هر کدام از این ناحیه ها به یک شی واقعی درون تصویر اشاره دارند. در بسیاری از کاربردهای پردازش تصویر، سطوح خاکستری پیکسل های متعلق به شی های درون تصویر، کاملا متفاوت از سطوح خاکستری پیکسل های متعلق به پس زمینه (Background) هستند. برای این منظور آستانه گذاری روشی ساده و کارآمد برای جدا شی های سازی پیش زمینه ها (Foreground Objects) از پس زمینه تصویر است.

در واقع آستانه گذاری اگر مقدار یک پیکسل بزرگتر از مقدار آستانه (مانند عدد ۵۰) باشد، مقدار تازه ای (مانند رنگ سفید – عدد ۲۵۵) به پیکسل انتساب داده می شود در غیر این صورت مقدار دیگری (مانند رنگ سیاه – عدد صفر) به پیکسل انتساب داده می شود. برای انجام آن در OpenCV باید از متد ()threshold استفاده کنیم. پارامتر نخست متد ()threshold، نام متغیری است که به ماتریس تصویر تک کانالی – خاکستری (Grayscale) اشاره می کند. بنابراین نخستین کاری که در آستانه گذاری باید انجام دهیم، استفاده از متد ()cvtColor برای تبدیل فضای رنگ تصویر به فضای رنگ Grayscale است.

آموزش و کاربرد متد ()cvtColor: جداسازی کانال تصویر توسط متد split در OpenCV

پارامتر دوم اندازه آستانه را برای دسته بندی (طبقه بندی – Classify) پیکسل های تصویر، مشخص می کند. منظور از دسته بندی پیکسل ها، دسته بندی پیکسل های کوچکتر یا مساوی مقدار آستانه یا پیکسل های بزرگتر از مقدار آستانه است. پارامتر سوم بیشترین مقداری می باشد، که اگر مقدار پیکسلی از مقدار حد آستانه ( Threshold Value ) بیشتر باشد، عدد پارامتر سوم به آن انتساب داده شود. پارامتر چهارم مربوط به نوع آستانه گذاری است که می توانید یکی از چندین نوع پیش فرض زیر باشد که خود OpenCV آنها را آماده کرده است.

cv2.THRESH_BINARY

cv2.THRESH_BINARY_INV

cv2.THRESH_TRUNC

cv2.THRESH_TOZERO

cv2.THRESH_TOZERO_INV

هر یک از مقدارهای پیش فرض بالا دارای یک تعریف و مفهوم ویژه خودشان هستند که می توانید از انیجا بخوانید. شکل زیر نیز تعریف هر کدام از پنج مقدار پیش فرض بالا را نشان می دهد. به طور نمونه در آستانه گذاری BINARY، مطابق شکل زیر اگر مقدار پیکسل (مختصات (x, y)) در تصویر اصلی بیشتر از مقدار آستانه باشد، مقدار پارامتر maxValue جایگزین آن می شود، در غیر این صورت مقدار صفر جایگزین خواهد شد.

در کدهای زیر بر روی این تصیور که به صورت پیش فرض، خاکستری است، گونه های متفاوت آستانه گذاری پیاده شده است. تصویرهای خاکستری به صورت تک کانالی هستند و مقدار هر پیکسل عددی است میان بازه صفر تا ۲۵۵ که صفر به معنی تاریک ترین (سیاه ترین) و ۲۵۵ به معنی روشن ترین (سفید ترین) رنگ است. در کدهای زیر مقدار آستانه در تمامی فراخوانی های متد ()threshold برابر با عدد ۱۲۷، یعنی میان بازه صفر تا ۲۵۵ است. همچنین خروجی متدها که در متغیرهای threshold1 و threshold2 و threshold3 و threshold4 و threshold5 ذخیره می شوند، همگی تصویرهای جدیدی هم اندازه با تصویر اصلی هستند.

شکل بالا تصویر اصلی به کار رفته در کدهای بالا را نشان می دهد. از سمت چپ ترین تصویر تاریک ترین و سمت راست آن روشن ترین پیکسل است، بنابراین با اعمال آستانه گذاری BINARY اولا خروجی متد یک تصویر دودویی است و همچنین مطابق شکل زیر می بینید که تصویر خروجی (متغیر threshold1) به دو بخش تقسیم شده اند. یک بخش پیکسل های کوچکتر از عدد ۱۲۷ (مقدار آستانه) که در مقدار صفر را دریافت کرده اند و همگی سیاه شده اند و دسته دیگر بالای مقدار آستانه که مقدار پارامتر maxValue، یعنی عدد ۲۵۵ را دریافت کرده ند که همگی سفید شده اند. همچنین به عنوان نمونه دیگر می توانید ببینید که آستانه گذاری BINARY_INV عکس (Inverse) آستانه گذاری BINARY است.

آستانه گذاری تطبیقی

در بخش قبلی ما یک مقدار سراسری (Global) را به عنوان مقدار آستانه استفاده کردیم. اما ممکن است در تمام شرایطی که در آن تصویر دارای شرایط روشنایی متفاوت در مناطق مختلف باشد، استفاده از مقدار سراسری مناسب نباشد. در این موارد، باید به دنبال استفاده از آستانه گذاری تطبیقی (Adaptive Thresholding) برویم. در این الگوریتم، آستانه را برای ناحیه های کوچک تصویر محاسبه می کنیم. بنابراین آستانه گذاری های متفاوت را برای ناحیه های متفاوت از یک تصویر بدست می آید، که نتیجه بهتری را به ما برای تصویرهایی با روشنایی متفاوت به ما می دهد.

در کدهای بالا عدد ۱۲۷ مقدار آستانه سراسری بود که دروت تمام تصویر، پیکسل ها را به دو دسته تقسیم می کند. بنابراین می توانیم نتیجه بگیریم که دو روش آستانه گذاری سراسری (Global Thresholding) و آستانه گذاری محلی (Local Thresholding) وجود دارد و همچنین متد ()threshold در OpenCV همراه با ۵ مقدار پیش فرض آن، روش آستانه گذاری سراسری را پیاده سازی می کند.

در OpenCV برای انجام آستانه گذاری تطبیقی باید از متد ()adaptiveThreshold استفاده شود. پارامتر نخست متد، نام متغیری است که به ماتریس تصویر خاکستری اشاره می کند. پارامتر دوم بیشترین مقداری (maxValue) را تعیین می کند، همانند آنچه که در مورد متد ()threshold توضیح داده ایم. پارامتر سوم یکی از دو گونه آستانه گذاری تطبیقی زیر را دریافت می کند. در واقع این پارامتر مشخص می کند که مقدار آستانه چگونه محاسبه شود (منظور عدم استفاده از آستانه سراسری).

  • cv2.ADAPTIVE_THRESH_MEAN_C : مقدار آستانه برابر است با میانگین (Mean) ناحیه مجاورها (Neighborhoods)
  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C : مقدار آستانه، مجموع وزن مقدارهای مجاور است که مقادیر وزن توسط توزیع گاوسی (Gaussian Distributions) محاسبه می شوند.

پارامتر چهارم نوع آستانه گذاری را مشخص می کند که می تواند یکی از پنج موردی باشد که بالاتر توضیح داده بودیم. به طور مثال می توانیم از cv2.THRESH_BINARY استفاده کنیم. پارامتر پنجم (Block Size)، اندازه ناحیه مجاور را تعیین می کند. پارامتر پنجم تنها یک ثابت (Constant) است که از میانگین یا میانگین وزنی محاسبه شده استخراج می شود.

در کدها و شکل زیر به ترتیب آستانه گذاری سراسری (متد ()threshold) و آستانه گذاری تطبیقی (متد ()adaptiveThreshold) با یکدیگر مقایسه شده اند.