تصویر و ماتریس در OpenCV – پیکسل های مجاور

در مفاهیم پردازش تصویر اتصال پذیری پیکسل (Pixel Connectivity) به ارتباط میان دو یا چند پیکسل اشاره دارد. در کاربردهای پردازش تصویر متداول است که مقدار یک پیکسل را بر اساس مقادیر پیکسل های مجاور محاسبه مجدد کنیم.

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

۱ – با دو پیکسل کناری خود در همان سطر

۲ – با پیکسل خانه بالایی خود در سطر بالایی

۳ – با پیکسل خانه پایینی خود در سطر پاینتر

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

۱ – تعداد کانال در تصویر خاکستری برابر با یک و در تصاویر رنگی RGB برابر با سه است.

۲ – عمق یک تصویر، تعداد بیت ‌هایی است  که برای نمایش رنگ در هر پیکسلِ تصویر استفاده می‌شود.

۳ – تعداد سطرهای تصویر از طریق خصوصیت rows از شی کلاس Mat بدست می آید.

۴ – تعداد ستون های تصویر از طریق خصوصیت cols از شی کلاس Mat بدست می آید.

۵ –

آشنایی با مفاهیم ابتدایی در OpenCV – تصویر خاکستری و رنگی

مثال – افزایش وضوح تصویر

افزایش وضوح تصاویر (Image Sharpening) یکی از چندین عملیاتی است که بر روی تصاویر انجام می شود. در این تکنیک برای افزایش وضوح و جزئیات تصویر کنتراست پیکسل های لبه ها  را افزایش می دهند. بحث افزایش وضوح تصویر و مباحث مربوط به فلیتر کردن تصویرها و مباحث دیگر مانند،تشخیص لبه ها (Rdge Detection)، عملیات Mask و مفهوم کرنل و عملیات کانولوشن خارج از بحث این مطلب است و در مطلب های بعدی آموزش داده شده اند.

اما هدف از این مطلب و قطعه کد زیر چیست؟ هدف بیان مثالی از کاربرد دسترسی به پیکسل های مجاور در یک تصویر و تغییر مقدار هر پیکسل فعلی (Current Pixel) توسط مقادیر پیکسل های مجاور آن است. در واقع می خواهیم در یک حلقه کنترل for و از طریق مفهوم متد به هر پیکسل دسترسی پیدا کنیم و سپس مقدار آنرا بر حسب مقادیر پیکسل های مجاورش، محاسبه مجدد (Recalculate) کنیم.


در خط ۸ تابعی به نام Sharpen اعلان شده است که دو پارامتر از نوع کلاس Mat را دریافت میکند. پارامتر اول تصویر ورودی و آرگومان دوم تصویر خروجی را نشان می دهد. بدنه تابع در خطوط ۲۳ تا ۴۹ تعریف شده است. در خط ۲۵ دستور زیر از یک ماکرو تعریف شده درOpenCV به نام CV_Assert استفاده کرده است.

CV_Assert ماکرو تعریف شده در OpenCV است که یک عبارت را دریافت و درستی یا نادرستی عبارت را بررسی می کند و در صورت بروز خطا یک استثنا (Exception) را نشان می دهد. در خط ۲۷ توسط متد ()create از کلاس Mat ماتریس تصویر ورودی از طریق پارامتر inputImage درون متغیر outputImage بارگذاری می شود.

توجه کنید هر دو آرگومان به صورت فراخوانی با ارجاع (Call by Reference) هستند. چون نمی خواهیم تصویر ورودی تغییر کند، آنرا به صورت ثابت (const) در نظر گرفتیم ولی چون می خواهیم نتیحه یا همان تصویر خروجی در متغیر outputImage ذخیره شود، دیگر از ثابت استفاده نکرده ایم.

در زبان های برنامه نویسی مانند سی و سی پلاس پلاس، اگر پارامتری به صورت ارسال با ارجاع باشد، به این معنی است که پس از اتمام اجرای تابع، محتوای آن متغیر نیز تغییر می کند. در خطوط ۱۲ و ۱۳ از بدنه تابع ()main می بینید که دو متغیر به نام های inputImage و outputImage تعریف کرده ایم. inputImage ماتریس ورودی به تابع را درر خود دارد و متغیر outputImage تصویر جدید و تغییر کرده حاصل از پردازش تابع را در خود نگه می دارد.

در خط های ۳۱ تا ۴۳ در حلقه for بیرونی در هر گام سه عدد اشاره گر به سه سطر متفاوت ایجاد می شود. اشاره گر current (در خط ۳۴) به پیکسل فعلی و اشاره گر previous به پیکسل سطر بالایی و اشاره گر next به پیکسل پایینی اشاره می کند. در خط ۳۷ و مطابق کد زیر اشاره دیگری به نام output ایجاد شده است. در واقع اشاره گر output به پیکسلی در فایل تصویر خروجی اشاره دارد که این پیکسل متناظر با پیکسل فعلی (اشاره گر current) در تصویر ورودی است.

در خط های ۳۹ ال ۴۲