تغییر کنتراست و روشنایی تصویر با OpenCV

کنتراست (Contrast) به معنی تضاد و تقابل است و در مفاهیم پردازش تصویر به معنی اختلاف یا فاصله میان روشن ترین سفید را با تاریک ترین سیاه تعیین کنیم. برای تغییر کنتراست و روشنایی یک تصویر از تبدیل خطی (Linear Transformation) به صورت معادله زیر استفاده می کنیم. در معادله زیر (معادله ۱) مقدار آلفا بزرگتر از صفر (? > ?) است. ? را ضریب و ? را شیب خط می نامند.

در واقع در معادله بالا تابع fهمان تصویر ورودی و g همان تصویر خروجی است. همچنین ضریب ? را معادل با کنتراست تصویر و پارامتر ? را معادل روشنایی تصویر در نظر می گیرند. بنابراین در این تبدیل خطی ضریب ? نمی تواند صفر باشد و هر چه بالاتر باشد، کنتراست تصویر نیز افزایش پیدا می کند و برای افزایش روشنایی باید پارامتر ? را افزایش دهیم.

در واقع تبدیل خطی پیسکل به پیکسل یک تصویر منبع به تصویر خروجی، به صورت معادله زیر است. توجه کنید در تبدیل خطی پیسکل به پیکسل، هر پیکسل خروجی معادل با یک پیسکل تغییر یافته در پیکسل ورودی است. در معادله زیر (معادله ۲) تابع همان تصویر ورودی و همان تصویر خروجی است و i معادل سطر i ام و j معادل سطر j ام است.

مثال – چگونه میزان کنتراست و روشنایی را تغییر دهیم

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

تصویر و ماتریس در OpenCV – پویش ماتریس

در خط ۱۰ و ۱۱ دو متغیر alpha و beta تعریف شده اند. مقدار متغیر alpha برابر با 1.0 است و به طور کلی برای تبدیل خطی پیسکل به پیسکل، مقدار متغیر alpha نمی تواند صفر باشد. مقدار متغیر beta تعیین نشده بلکه در خطوط ۲۵ و ۲۶ مجدد از کاربر درخواست وارد کردن مقدار برای این دو متغیر را می کنیم.

توجه کنید چون متغیر alpha ضریب است، و چون ممکن است کاربر مقداری برای آن مقدار وارد نکند ما از پیش مقداری پیشفرض را تعیین می کنیم ولی چون متغیر beta جمع می شود، پس اکر مقداری هموارد نشود، پس مشکلی پیش نمی آید. توجه کنید اگر به متغیر نوع int مقدار اولیه ندهیم، پس مقدار صفر در آن ذخیره می شود.

در خطوط ۱۳تا ۱۸ نیز یک متغیر رشته ای ایجاد کردیم. ابتدا آنرا مقداردهی کرده ایم ولی در نظر گرفته ایم که ممکن است کاربر بخواهد تصویری را غیر از تصویر پیشفرض استفاده کند، برای همین منظور توسط خط ۱۵ بررسی کرده ایم که آیا کاربر ورودی را به دستور داده و اگر این طور است، اولین ورودی را به عنوان نام و مسیر فایل در متغیر imageName ذخیره کرده ایم. در نهایت در خط ۲۰ تصویر خوانده شده است.

در خط ۲۱ از تابع ()Mat::zeros استفاده شده تا بتوانیم یک ماتریس را ایجاد کنیم که تمام درایه های آن عدد صفر است . مطابق با مستندات OpenCV دو فرم استفاده از این تابع به صورت زیر است.

تصویر و ماتریس در OpenCV – ماتریس های ویژه

همانطور که در شکل بالا می بینید برنامه نیاز به دریافت دوورودی، یکی برای متغیر alpha و یکی برای متغیر beta دارد. توجه کنید که در معادله های بالا،  ضریب ? (متغیر alpha) بر روی کنتراست و پارامتر ? (متغیر beta) بر روی روشنایی تصویر اثر می گذارد. ورودی های مختلف را وارد و تاثیر هر یک را بر روی تصویر ببینید.

مثال – افزایش وضوح تصویر: تصویر و ماتریس در OpenCV – پیکسل های مجاور

توجه کنید پارامتر ? (متغیر beta) چون عامل جمع در معادله است، پس در صورتی که صفر باشد، به معنی عدم تغییر روشنایی است و ضریب ? (متغیر alpha) چون عامل ضرب در معادله است، پس در صورتی که یک باشد، به معنی عدم تغییر کنتراست است.

مفهوم هیستوگرام و محاسبه آن در OpenCV