در نوشته های پیشین در مورد تغییر اندازه بوسیله تابع ()resize گفتگو کرده ایم. در این نوشته می خواهیم در مورد هرم (Pyramid) تصویر گفتگو کنیم. در پردازش تصویر و بینایی ماشین نیاز داریم تا بتوانیم یک تصویر را به اندازه متفاوت از اندازه اصلی آن تبدیل کنیم. برای این مورد دو حالت وجود دارد. ۱) اینکه تصویر را افزایش اندازه (Upsize) دهیم که اصطلاحا Zoom in گفته می شود و یا ۲) اینکه تصویر را کاهش اندازه (Downsize) دهیم که اصطلاحا Zoom Out گفته می شود.

تغییر اندازه تصویر در OpenCV

هرم تصویر یا Image Pyramid به طور گسترده در بسیاری از کاربردهای بینایی ماشین کاربرد دارد. یک هرم تصویر مجموعه ای از تصویرها است که همگی ناشی از یک تصویر اصلی هستند به طوری که به صورت پیوسته تا یک نقطه دلخواه به چندین نمونه کاهش (Downsample) پیدا می کنند. به طور کلی دو دسته از هرم های تصویر به نام گوسی (Gaussian) و لاپلاسین (Laplacian) وجود دارد.

واژه Downsampled به فرایندی گفته می شود که تصویرهای کوچکتر و قاعدتا با ابعاد کوچکتر از تصویر اولیه ساخته می شود و این کاهش ابعاد تا یک نقطه دلخواه صورت خواهد گرفت. ولی بلعکس، Upsampled فرایندی است که در آن تصویرهای بزرگتر و قاعدتا با ابعادی بزرگتر از تصویر کوچکتر ساخته می شود.

هرم گوسی که در این نوشته در مورد آن گفتگو می کنیم برای انجام Downsampled به کار گرفته می شود. در OpenCV از تابع ()pyrDown برای انجام هرم گوسی به گونه شکل زیر استفاده می شود. در شکل زیر هر لایه از هرم از پایین به بالا عدد گذاری می شود. برای آنکه بتوانیم هرم گوسی لایه i + 1 را بدست آوریم، نخست باید کرنل (ماتریس کانالوشن) زیر را بر روی لایه i اعمال کنیم و سپس تمامی سطرها و ستون های با شماره زوج (Even) را پاک کنیم.

فیلتر تصویر و مفهوم کرنل در پردازش تصویر

تابع ()pyrDown

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

پارامتر دوم اندازه تصویر خروجی است که به صورت پیش فرض بر اساس (src.cols+1)/2, (src.rows+1)/2) محاسبه می شود ولی معادله شکل زیر نیز می تواند برای تعیین اندازه تصویر خروجی به کار برود. با استفاده از معادله زیر، اندازه تصویر خروجی نزدیک به یک دوم تصویر ورودی است. در کد زیر از این فرمول استفاده شده است. پارامتر سوم نیز نوع Border را مشخص می کند. به یاد داشته باشید که BORDER_CONSTANT پشتیبانی نمی شود.

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

در OpenCV با پایتون، ویژگی shape از متغیری که تصویر را در خود نگه می دارد، اندیس شماره صفر، یعنی [image.shape[0  اندازه ستون ها (یا cols در معادله بالا) و اندیس شماره یک، یعنی [image.shape[1  اندازه سطرها (یا rows در معادله بالا) را برگشت می دهند.

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

در OpenCV با پایتون، ویژگی shape از متغیری که تصویر را در خود نگه می دارد، اندیس شماره صفر، یعنی [image.shape[0  اندازه ستون ها (یا cols در معادله بالا) و اندیس شماره یک، یعنی [image.shape[1  اندازه سطرها (یا rows در معادله بالا) را برگشت می دهند.

انجام Zoom Out و Zoom In در OpenCV

در برنامه های نمایش یا ویرایش تصویر دیده اید که می توانید روی یک تصویر Zoom Out یا Zoom In  کنید. Zoom In به معنی ایجاد تصویر بزرگتر در یک ناحیه و Zoom Out به معنی ایجاد تصویر کوچکتر است. در کد زیر می خواهیم برنامه ای به زبان پایتون بنوسیم که تصویری را بوسیله تابع ()imread بخواند و سپس یک کلید را از ورودی بخواند.

اگر کلید ورودی برابر با کلید i بود، به معنی Zoom In است و برابر با معادله های بالا برای اندازه تصویر، تصویر در هر تکرار فشردن کلید i باید دو برابر بزرگتر شود. ولی اگر کلید ورودی برابر با کلید o باشد، پس به معنی Zoom Out  است و برابر با معادله های بالا برای اندازه تصویر، تصویر در هر تکرار فشردن کلید o باید دو برابر کوچکتر شود.

دانلود سورس کد این نوشته OpenCV Image Pyramid