در مطلب قبلی مقدمات در مورد ساختار ماتریسی تصاویر در OpenCV و چگونگی ایجاد ماتریس ها صحبت کردیم. در این مطلب می خواهیم چندین مفهوم دیگر شامل عمق تصویر، مفهوم کانال و تصاویر خاکستری و رنگی را توضیح دهیم. همچنین توضیح داده ایم که چگونه ماتریس تصویر در حافظه برنامه ذخیره می شود.

عمق تصویر چیست

عمق رنگ (Color Depth) یا عمق بیت (Bit Depth) به تعداد بیتهایی گفتهمی شود که برای نمایش رنگ در هر پیکسلِ تصویر یا ویدئو استفاده میشود. پیکسل کوچکترین جز تشکیل دهنده یک تصویر است. زمانی که می گوییم رزولوشن نمایشگر  1920x1080 است، به این معنی است که نمایشگر ۱۹۲۰ پیکسل در عرض و ۱۰۸۰ پیکسل در ارتفاع دارد.

در مطالب بعدی توضیح خواهیم داد که در تصاویر خاکستری، هر درایه ماتریس یک تک عدد است که یک پیکسل را نشان می دهد و در تصاویر رنگی هر درایه از سه زیر مقدار تشکیل شده است که هر یک از این سه زیر مقدار معرف یکی از رنگ های قرمز، سبز و آبی (RGB) هستند.

تصویر خاکستری

تصاویر خاکستری (Grayscale Images) از نوع تصاویری هستند که به ازای هر بیت آنها تنها یک کانال وجود دارد. به عبارت دیگر تصویر خاکستری به صورت تک کانالی است که مقدار هر پیکسل عددی از صفر تا ۲۵۵ است. بنابراین طیف تصاویر از سیاه تا سفید است.

بنابراین در ماتریس عددی تصویر خاکستری، هر درایه یک تک مقدار بین بازه عددی صفر تا ۲۵۵ است که شدت روشنایی و طیف رنگ خاکستری را تعیین می کند. سیاه تیره ترین رنگ و قابل نمایش با عدد صفر و سفید روشن ترین رنگ و قابل نمایش با عدد ۲۵۵ استهر درایه که معرف یک پیکسل است می تواند شامل یکی از انواع رایج در OpenCV باشد ولی معولا درایه ها به صورت ۸ بیتی بی علامت CV_8U هستند، که واژه 8U اشاره به ۸ بیتی بی علامت دارد.

تصاویر رنگی

رایانه ها از سیستم RGB برای ایجاد رنگ ها استفاده می کنند. در واقع از ترکیب این سه رنگ، رنگ های دیگر را ایجاد می کند. فرض کنید در یک اتاق تاریک هستید و در این اتاق سه لامپ قرمز، سبز و آبی وجود دارد. حال این سه چراغ را همزمان روشن می کنید، پس مطابق شکل زیر نور سفید ایجاد می شود.

حال تنها دو رنگ قرمز و سبز را روشن می کنید، پس نور زرد ایجاد می شود و اگر هر سه چراغ را خاموش کنید، پس رنگ سیاه (خاموشی) ایجاد خواهد شد. تصاویر رنگی (Color Image) از دید کامپیوتر (و در OpenCV) تصاویری هستند که هر بیت شامل سه کانال است که یک کانال برای رنگ قرمز، یک کانال برای رنگ سبز و یک کانال برای رنگ آبی است.

مقدار عددی هر کانال می تواند از صفر تا ۲۵۵ باشد که هر کدام شدت رنگ (روشنایی) رنگ قرمز، سبز و آبی را نشانمی دهد. اگر هر سه کانال مقدار صفر داشته باشند، یعنی رنگ پیکسل سفید است و اگر هر سه مقدار ۲۵۵ داشته باشند، پس رنگ پیکسل سفید خواهد بود. ترکیب اعداد دیگر، رنگ های دیگر را تولید می کنند.

در مطلب های بعدی توضیح داده ایم که چگونه به هر پیکسل (یا در واقع هر درایه ماتریس) دسترسی داشته باشیم. اما در این مطلب به یاد داشته باشید که هر درایه در ماتریس تصویر خاکستری به صورت یک تک عدد است ولی هر درایه در ماتریس تصویر رنگی به صورت یک بردار (Vector) است.

قطعه کد زیر مثالی از روش پیدا کردن اندازه (ابعاد) تصویر، اندازه عرض (پهنا – Width)، اندازه ارتفاع (Height)، نوع تصویر و عمق بیت تصویر را نشان می دهد. توجه کنید که در خط ۲ و ۳ از دستور using namespace برای معرفی دو فضای نام std و cv به درون فایل برنامه استفاده کرده ایم. فضای نام std مربوط به توابع cout و cin می شود که جز زبان سی پلاس پلاس هستند. در کد زیر متد ()channels تعداد کانال های تصویر را نشان می دهد.

برای نمایش نوع تصویر باید از متد ()type استفاد کنیم. در شکل بالا می بینید که جلوی Image Type عدد ۱۶ چاپ شده است. این عدد در OpenCV دارای معنا است. شکل زیر نگاشت عددهای حاصل از اجرای متد ()type به نوع قابل درک برای ما را نشان می دهد.

بنابراین مطابق با جدول بالا عدد ۱۶ مربوط به تصاویر سه کانالی (C3) است که به هر کانال ۸ بیت بی علامت اختصاص داده شده است. حال اگر فرض کنیم تصویر از نوع خاکستری باشد، پس تعداد کانال های یک و اگر فرض کنیم هر پیکسل از نوع ۸ بیتی بی علامت باشد، پس مطابق جدول بالا عدد مربوط به نوع آن، عدد صفر خواهد بود.از متد ()depth برای پیدا کردن عمق رنگ (عمق بیت) استفاده می شود. (CV_TYPE)