دسترسی به پیسکل ها در پایتون و OpenCV

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

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

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

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

توجه کنید چون که ماتریس تصویر در OpenCV با پایتون مبتنی بر آرایه های NumPy هستند، پس باید توسط اسلایس بندی آنها استفاده کنیم. همچنین توجه کنید هر پیسکل درون تصویر توسط دو مختصات افقی و عمودی قابل دسترسی است. در کد زیر ابتدا یک تصویر به ابعاد 259x195 را می خوانیم و سپس به پیسکل های آن دسترسی پیدا می کنیم.


در خط های ۶ و ۷ از کد بالا ابتدا اندیس آخرین پیکسل، یعنی پیکسل گوشه سمت چپ پایین را درون متغیرهای image_width_index و image_height_index ریخته ایم. سپس در خط های ۹ و ۱۰ مقدار پیکسل آنها را نمایش داده ایم. توجه کنید چون تصویر بالا رنگی است، پس هر پیکسل از سه کانال RGB ولی به صورت معکوس BGR تشکیل شده است. همچنین برای دسترسی به پیسکل ها ابتدا باید مختصات ارتفاع (محور y) و سپس مختصات عرض (محور x) را تعیین کنید.

در کد زیر و درون یک حلقه for می خواهیم مقدار پیکسل تک تک موقعیت ها را نشان دهیم. توجه کنید ما در کد زیر از متد ()shape از کتابخانه NumPy استفاده کرده ایم که کاربرد همان خصوصیت shape را دارد. توجه کنید هر متغیر از نوع آرایه NumPy، دارای خصوصیت shape است ولی در NumPy متد ()shape نیز وجود دارد که نام یک متغیر از نوع آرایه NumPy را دریافت و همان خروجی خصوصیت shape را برگشت می دهد.

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

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

تغییر رنگ پیسکل ها

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

برای آگاهی بیشتر لطفا مطلب اسلایس بندی آرایه های NumPy را مطالعه کنید زیر کابرد اسلایس بندی آرایه های دو بعدی NumPy در پردازش تصویر را توضیح داده ایم.