بایگانی برچسب برای: کد برنامه تصویر پانوراما در پایتون

ایجاد یک پانوراما با استفاده از چندین عکس:

چسباندن(دوختن) چند تصویر

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

بنابراین دوخت تصویر چگونه است؟ به عبارت ساده، برای یک گروه ورودی از تصاویر، خروجی تصویر مرکبی است به طوری که آن، نقطه اوج صحنه است. ضمناً، جریان منطقی بین تصاویر بایستی حفظ شود.

به عنوان مثال، مجموعه ی تصاویر زیر را در نظر بگیرید(گرفته شده از نمونه های MATLAB). از یک گروه از یک سری عکس های بهم پیوسته ورودی، ما اساسا یک تصویر چسبانده شده منفرد ایجاد می‌کنیم. یکی که صحنه کامل را در جزئیات توضیح می دهد. این یک الگوریتم واقعاً جالب است!

panorama

panorama

مباحث تحت پوشش پیاده سازی پانوراما در زبان برنامه نویسی پایتون انجام خواهد شد.

خواندن چندین عکس (به ترتیب)

پیدا کردن سازگاری های منطقی در تصاویر (این کار با استفاده از هموگرافی انجام میشود).

دوختن تصاویر

شروع کنیم …

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

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

راه اندازی محیط

لطفا توجه داشته باشید که سیستم شما با پایتون 2.7 راه اندازی شده است (پیاده سازی کد در python2.7 است اگر شما نسخه های دیگر را دارید، بنابراین لطفا کد را تغییر دهید) و OpenCV 3.0. ما از خدمات OpenCV Helper برای خواندن تصاویر، نوشتن تصاویر و تبدیل فضاهای رنگ استفاده خواهیم کرد. هنگامی که تصاویر به دست می آید، کل محاسبات پانوراما با استفاده از یک تابع اختلاط خانه انجام می شود. این مقاله به سه قسمت عمده تقسیم شده است.

  • ورود، خواندن و پردازش تصاویر: مسیرهای تصویری از فایل های متنی. هر متن فایل حاوی لیست مسیرهای هر تصویر است. اطمینان حاصل کنید که مسیرها به ترتیب جهت چپ به راست هستند.
  • محاسبه جهت نسبی تصاویر w.r.t با یکدیگر: جفت
  • ماژول دوختن/ترکیب و مطابقت: که اساسا دو تصویر  را در یک زمان پیوند می دهد.

الگوریتم

الگوریتم برای انجام دوخت تصویر بسیار ساده است.

  images []  < -- Input images Assuming, that the center image is no_of_images/2 let centerIdx = length(images)/2 for each images[] at positions 0 - >   centerIdx :
        perform leftward stitching

    for each images[] at positions centerIdx   -  >   length(images):
        perform rightward stitching

خروجی یک موزاییک کامل از تصاویر ورودی خواهد بود.

بعضی محدودیت ها الگوریتم وقت گیر است به دلیل تعداد تکرارهای درگیر، بهتر است که تعداد تصاویر ورودی hte چندان زیاد نباشد یا نه از وضوح بسیار بالا (به عنوان مثال 4000×3000). پیاده سازی من بر روی رایانه 2 گیگابایتی دارای پردازنده Intel i3 (بر روی دستگاه من آزمایش نشده است) مبتنی است. به راحتی می توانید این مدل را با استفاده از مشخصات بالاتر یا شاید GPU ارتقا دهید/مقیاس کنید. هیچ وقت برای سعی کردن خیلی دیر نیست.

معماری پروژه:

|_ code -|
    |        |-- pano.py
    |        |-- txtlists-|
    |                     |--files1.txt .... 
    |   
    |_ images - |
    |           |- img1.jpg
    |           |- abc.jpg 
    |           .... and so on ...

معماری پروژه به شرح زیر است. دایرکتوری کد شامل فایل اصلی pano.py است. همچنین شامل یک فهرست / دایرکتوری است که حاوی فایل هایی است که دارای مسیر هایی به تصاویر در پانوراما هستند. این تصاویر بصورت جداگانه داخل تصاویر / فهرست ذخیره می شوند.

در این آموزش، من از تصاویر مجموعه داده های PASSTA استفاده خواهم کرد. این شامل 2 مجموعه داده، رستوران غذاهای مختصر و ترکیبی است. همچنین برای تست، من از تصاویری از وبلاگ بینایی رایانه Mare استفاده خواهم کرد. من از تست تصاویر تپه دیون نیز استفاده خواهم کرد. و هم چنین تی شرلوک !! (برای کاربرد و استنادات مربوطه، نگاهی به منابع بیندازید.)

اکنون قسمت واقعی

برای درک هر دو ماژول دوخت چپ یا راست، اول اجازه دهید برخی مفاهیم بینایی را مستقیماً دریافت کنیم. آنها بودند:

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

هم نگاشتی

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

تصاویری که در شکل بالا نشان داده شده است را در نظر بگیرید. هر تصویر حاوی بعضی قسمت معمولی با تصاویر دیگر است. با توجه به این عادت ما می توانیم بگوییم که تصویر x یا به سمت سمت راست یا چپ تصویر y در می آید.

به هر حال، اکنون که من آن را روشن کرده ام، ادامه دهید تا چگونگی محاسبۀ هموگرافی را انجام دهیم. بگویید شما یک جفت از تصاویر I1، I2 را دارید. شما تصویر اول را ضبط میکنید. سپس شما تصمیم به چرخش دوربین خود می‌گیرید، و یا شاید کمی از برگردان را انجام دهید و یا شاید ترکیبی از حرکت چرخش/برگردان. سپس با به روز رسانی موقعیت دوربین جدید خود، تصویر دوم را ضبط کنید. مشکلی که اکنون وجود دارد این است که چگونه شما برای سیستمی که در آن به ایجاد یک تغییر نیاز خواهید داشت که به طور موثر یک نقطه را که در هر دو تصویر پیش بینی می شود حل کنید. یا به عبارت ساده، چگونه شما یک تصویر w.r.t دیگر از منظره را تجسم می کنید، با توجه به اطلاعات موجود که در مورد هر دو نقطه منظره شما وجود دارد.

هم نگاشتی

انواع تغییرات

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

تصویر زیر را که ببینید، درک میکنید که من در مورد چه چیزی صحبت میکنم.

 

انواع تغییرات

آنچه که در بالا می بینید، می تواند یک خروجی از اعمال هم نگاشتی از I1 = H × I2 باشد. چگونه از هم نگاشتی(Homography) برای تبدیل تصاویر در OpenCV استفاده کنیم؟(این پاسخ را نیز بررسی کنید. این عکس ها از پست مزبور گرفته شده است.)

شما می توانید از روش ()openCV findhomography برای حل مسئله برای هم نگاشتی استفاده کنید. برای پیدا کردن I1 = H × I2 شما نیاز خواهید داشت که مختصات نقاط را در صفحه اصلی تصویر 1 و مختصات نقاط هدف در تصویر 2 را به روش عبور دهید. پس از گذشت زمان، متد، ماتریس هموگرافی را از بین خواهد برد.

نحوه شناسایی نقاط برای محاسبه هموگرافی!

یکی از روش های مستقیم به شرح زیر است:

  Compute similar features in both images

    Out of them , filter out good features (you'll find plenty of tutorials on these )

    Make an array sorts of ; featuresofI1   = =  >   [srcPoints], featuresofI2   = =  >  [dstPoints] (using opencv nomenclature)

    Compute Homography matrix using RANSAC algorithm