در قسمت قبل با نحوهی بدست آوردن برشی از تصویر، حذف کانال های مورد نظر، تغییر مقدار پیکسل های قسمت انتخاب شده از تصویر در پایتون آشنا شدیم. در این قسمت از آموزش میخواهیم با Array Indexing نحوهی تولید ماسک دایروی و حلقوی را یاد بگیریم. با استفاده از این ماسک ها میتوان در تصویر (ماتریس دو بعدی) ناحیه ی دایره ای مورد نظر را انتخاب کرد. همچنین برای پیاده سازی فیلتر در حوزه ی فرکانس (برای فیلتر کردن تصویر) میتوان از این روش استفاده کرد.
کد های پایتون نوشته در این آموزش، در یک فایل ژوپیتر نوت بوک نوشته شده اند. لینک دانلود فایل ژوپیتر نوت بوک مربوط به این آموزش در انتهای صفحه قرار داده شده است.
برای تعریف آرایه ها کتابخانه numpy، برای ترسیم نمودار کتابخانه matplotlib و برای خواندن تصویر کتابخانه cv2 را import میکنیم.

یک تصویر سیاه با ارتفاع 200 و عرض 300 پیکسل ایجاد کنیم. میخواهیم در وسط این تصویر یک دایره به شعاع 30 پیکسل با رنگ قرمز رسم کنیم. برای اینکار کافیست پیکسل هایی که فاصلهشان از مرکز تصویر کمتر مساوی 30 پیکسل (شعاع دایره) هست را پیدا کنیم. ابتدا فاصلهی هر پیکسل از مرکز تصویر را پیدا کرده و سپس با آستانه گذاری، پیکسل هایی که در شرط صدق میکنند را پیدا میکنیم.
برای محاسبهی فاصلهی هر پیکسل از مرکز تصویر از تابع meshgrid استفاده میکنیم. به این تابع در یک آرایه همهی اندیس های ستون ها و در یک آرایه همهی اندیس های سطر ها را ارسال میکنیم. این تابع اندیس ستون ها را در راستای سطر ها تکرار میکند و اندیس سطر ها را در راستای ستون ها تکرار میکند. در خروجی، تابع meshgrid دو ماتریس بر میگرداند. در اندیس های متناظر این دو ماتریس، اندیس سطر و ستون هر یک از پیکسل ها قرار میگیرد. در خروجی اول (X) اندیس ستون هر یک از پیکسل ها و در خروجی دوم (Y) اندیس سطر هر یک از پیکسل ها قرار میگیرد.


در این حالت مبدا (0, 0) در گوشهی سمت چپ بالا قرار دارد.

میخواهیم در مرکز تصویر دایره را رسم کنیم. نصف عرض تصویر را از X و نصف ارتفاع تصویر را از Y کم میکنیم. این کار باعث میشود مختصات (0, 0) در مرکز تصویر قرار بگیرد.

حال میتوان از روی X و Y بدست آمده فاصلهی هر پیکسل از مرکز تصویر را محاسبه کرد. برای محاسبهی فاصلهی هر پیکسل از مرکز تصویر، ابتدا X و Y را به توان دو رسانده و رادیکال حاصل جمع آن ها را محاسبه میکنیم. در ماتریس بدست آمده (dist) فاصله هر پیکسل از مرکز قرار میگیرد.
میخواهیم یک دایره به شعاع 30 پیکسل رسم کنیم. ماتریس فاصلهها را با 30 (شعاع دایره) مقایسه میکنیم و پیکسل هایی که فاصلهشان از مرکز تصویر کمتر مساوی 30 هست را پیدا میکنیم. نتیجهی مقایسه یک ماتریس دو بعدی شامل مقادیر True و False بدست میآید. در اندیس هایی از ماتریس که شرط برقرار هست مقدار True و در بقیهی اندیس ها مقدار False قرار میگیرد. این ماسک دو بعدی را با imshow نمایش میدهیم. چون ماتریس ماسک، دو بعدی است به آرگومان cmap تابع imshow مقدار gray را ارسال میکنیم تا ماتریس دریافتی را به صورت یک تصویر سیاه و سفید در نظر گرفته و رسم کند.


توانستیم با موفقیت محل پیکسل هایی که فاصلهشان از مرکز مقدار مشخصی هست را بدست آوریم.
برای رسم دایره در تصویر (img) از ماسک mask1 استفاده میکنیم تا قسمت مورد نظر از تصویر را انتخاب کنیم. میخواهیم رنگ دایره قرمز باشد، بنابراین کانال قرمز (اندیس صفر در بعد سوم) را انتخاب کرده و در این اندیس ها مقدار 255 را قرار میدهیم. با نمایش تصویر خروجی مشاهده میکنیم که در مرکز تصویر یک دایره با رنگ قرمز و شعاع دلخواه رسم شده است.


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


با مشاهده ماسک رسم شده، میتوان دید ناحیهی حلقوی که میخواستیم را بدرستی توانستهایم انتخاب کنیم.
از این ماسک استفاده کرده و این ناحیه از تصویر قبلی را انتخاب میکنیم و در کانال سبز قسمت انتخاب شده مقدار 255 را مینویسیم تا در اطراف دایرهی قرمز که رسم کرده بودیم یک حلقه به رنگ سبز نمایش داده شود.


میخواهیم یک ماسک مربعی که در وسط آن یک حفرهی دایروی وجود دارد را ایجاد کنیم (در وسط تصویر). طول ضلع مربع را 150 و شعاع حفره را 50 پیکسل در نظر میگیریم. از ماتریس های X و Y استفاده کرده و ناحیهی مربعی مورد نظر را انتخاب میکنیم. برای اینکار قدر مطلق X را با نصف طول ضلع مربع مقایسه کرده و x هایی که در شرط صدق میکنند را پیدا میکنیم. این کار را برای Y هم انجام داده و دو نتیجهی بدست آمده را با هم and میکنیم. با اینکار ناحیهی مربعی در مرکز تصویر با طول ضلع 150 پیکسل را بدست میآوریم.


سپس یک ماسک دیگر تعریف کرده و ناحیهی دایروی با شعاع 50 پیکسل را انتخاب میکنیم. ماسک ناحیهی مربع را با not ماسک دایره که بدست آوریم and کرده و نتیجه را در mask3 ذخیره میکنیم. با این ماسک یک ناحیهی مربعی که شامل حفره است را میتوانیم انتخاب کنیم.
در روش دیگر می توانستیم ناحیهای که فاصلهی آنها از مرکز بزرگتر از 50 هست را انتخاب کرده و آن را با ماسک ناحیهی مربع and کنیم (بدون اینکه نیاز باشد not ماسک را محاسبه کنیم).


از mask3 استفاده کرده و این ناحیه از تصویر قسمت قبلی را انتخاب میکنیم و در کانال آبی قسمت انتخاب شده مقدار 255 را مینویسیم.


برای اینکه دایره را در مرکز دیگری رسم کنیم کافیست پس از اینکه X و Y را از تابع meshgrid بدست آوردیم، از آن ها مقدار x و y مرکز مورد نظر برای دایره را کم کنیم. سپس فاصله هر پیکسل را حساب کرده و با آستانه گذاری ناحیهی دایروی یا حلقوی مورد نظر را در آن نقطه انتخاب کنیم.
در مثال زیر یک دایره به شعاع 40 پیکسل را در نقطهی 100 و 50 رسم میکنیم.


در همان مرکز یک دایره به شعاع 90 پیکسل را رسم میکنیم.


فایل کد های این آموزش را می توانید از لینک گیت هاب زیر دانلود نمایید:
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.