نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
أَللّهُمَّ ارْزُقْنی شَفاعَةَ الْحُسَیْنِ یَومَ الْوُرُودِ

پروژه OpenCV ساخت تصاویر موزاییکی

505

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

پروژه OpenCV ساخت تصاویر موزاییکی

 

کد پروژه :

 

الگوریتم پروژه : بنظرم قبل از هر پروژه ای اگه حوصله کنید و الگوریتم کار رو روی کاغذ بنویسید، کارتون از نظر زمانی سریعتر انجام میشه و فقط کار هم ساده تر؛ الان میخوام الگوریتم پروژه رو یه توضیح مختصری بدم تا موقعی که کدهای پروژه رو بررسی میکنید، روال کار کدها دستتون باشه و راحت تر متوجه بشید.

یه سری تصاویر ورودی داریم با نام tile ( کاشی ) و یه تصویر ورودی با نام target ( هدف )؛ کاری که میخوایم بکنیم اینه که تصاویر tile رو کنار هم قرار بدیم و تصویر target ورودی رو بازسازی کنیم و یه تصویر جدید ( تصویر خروجی، target خروجی ) رو ایجاد کنیم؛ خب هر چی تصاویر tile تعدادشون ( تنوع رنگ ) بیشتر باشه، خب نتیجه کار بهتر میشه؛ بعد از این که تصاویر tile رو خوندیم باید اندازه شون رو مربعی کنیم ( تا موقع کنار هم قرار دادنشون و ساخت تصویر target خروجی، کارمون ساده تر و تصویر target خروجی هم زیباتر بشه ) و بعد اندازه tile هارو تغییر میدیم ( مثلا 50×50 پیکسل )، که خب هر چی اندازه tile ها بزرگتر باشه، تو تصویر target خروجی، وقتی زوم میکنیم، کاشی ها، اندازشون بزرگتر هستش و بطبع کیفیت کارمون هم بهتر میشه ( اندازه کاشی ها به کمک ثابت TILE_SIZE تنظیم میشه ).

خب حالا مثلا اندازه تصویر target ورودی 800×600 هستش، خب بیایم از tile هایی با اندازه 50×50 استفاده کنیم کیفیت خروجی خیلی بد میشه، برا حل این مشکل، اندازه تصویر target ورودی رو چند برابر میکنیم، اینطوری در خروجی تصویر 8000×6000 داریم که وقتی زوم میکنیم کاشی ها رو با کیفیت اصلی میبینیم و تصویر خروجی هم شبیه تصویر target ورودی خواهد بود.

حالا میایم رنگ کاشی ها رو محاسبه میکنیم و در یه آرایه ای ذخیره میکنیم؛ پس تا این جا آرایه ای داریم که حاوی تصاویر tile هستش و آرایه ای داریم که حاوی رنگ میانگین تصاویر tile هستش؛ در مرحله بعد یه حلقه ایجاد میکنیم تا تصویر target ورودی رو پیمایش کنه و کاشی به کاشی تصویر رو پیش بریم، رنگ میانگین اون کاشی ( اون قسمت ) از تصویر target ورودی رو محاسبه میکنیم و بعد با اون آرایه ای که حاوی رنگ میانگین تصاویر tile بود، مقایسه میکنیم و بهترین tile ( که بیشترین شباهت رنگی رو داره ) رو انتخاب میکنیم و ازش استفاده میکنیم؛ تو پروژه من اسمشو گزاشتم suitable_tile ( کاشی مناسب!، مناسب از نظر رنگ! )

خب حالا 2 تا روش داریم ( هنوز تو حلقه هستیم )، یکی این که تصویر tile رو بدون هیچ تغییری داخل تصویر target ( در موقع مربوطه ) قرار بدیم، که اسم تصویری که به این روش ایجاد میشه رو گزاشتم tiles_result؛ که خب وابستگی شدیدی به تعداد tile ها و تنوع رنگیش داره، درواقع روش اصلی کار هم همینه ولی خب چون کیفیت خروجی زیاد جالب نمیشه، میایم یه کار دیگه ای میکنیم و اونم این که میایم و تصویر suitable_tile رو با کاشی متناظر در تصویر target ورودی، جمع وزنی میکنیم ( به کمک تابع addWeighted )، که خب اسم تصوری که به این روش ایجاد میشه رو گزاشتم tile_addWeighted، این روش وابستی زیادی به تعداد tile ها و تنوع رنگیشون نداره، به طوری که اگه حتی از 1 تصویر tile هم استفاده کنید، خروجی قابل قبولی میده، هرچند که با افزایش تعداد tile ها، تصویر خروجی زیباتر میشه و حرفه ای تر بنظر میرسه، این روش وابسته به وزن تصویر tile و تصویر target هستش که تو تابع addWeighted چه وزنی براشون انتخاب میکنید، در ادامه مطلب، نمونه ای از 2 وزن رو قرار میدم تا تفاوت رو حس کنید!

البته تصاویری که تو این مطلب گزاشتم رو با فوتوشاب اندازه و حجمشون رو اصلاح کردم، چون تو تستی که من کردم برا تصویر ورودی 800×500 و حدود 200 تا tile، اندازه tile حدود 200×200 پیکسل و ضریب افزایش تصویر target ورودی هم 20، با این شرایط، حجم هریک از تصاویر خروجی تقریببا 200 میگ شد!

 

نتیجه پروژه : در زیر نمونه ای از نتیجه کد بالا رو مشاهده میکنید؛ نتایج زیر به ازای TILE_SIZE = 200 و RATIO_SIZE = 5 هستند؛ تصویر ورودی با تصاویر خروجی اندازشون فرق داره، چون همونطور که قبلا گفتم، تصویر ورودی برش میخوره و اندازش اصلاح میشه تو پروژه؛ در ضمن تصاویر خروجی رو هم با فوتوشاب اندازه و حجمشون رو اصلاح کردم ( هر تصویر 15 میگ تقریبا به 300 کیلوبایت کاهش دادم ) :

پروژه OpenCV ساخت تصاویر موزاییکی
تصویر target ورودی
پروژه OpenCV ساخت تصاویر موزاییکی
تصویر tiles_result، زمانی که فقط از 1 تصویر tile استفاده کنیم!
پروژه OpenCV ساخت تصاویر موزاییکی
تصویر tiles_addWeighted_result، زمانی که فقط از 1 تصویر tile استفاده کنیم؛ وزن تصویر tile برابر 0.2 و تصویر target برابر 0.8 تنظیم کردم.
پروژه OpenCV ساخت تصاویر موزاییکی
تصویر tiles_result؛ زمانی که از 275 تصویر tile استفاده کردم؛ همونطور که میبینید کیفیت کار بهتر شده نسبت به زمانی که فقط از 1 تصویر tile استفاده میکردیم ولی خب کیفیت کماکان قابل قبول نی.
پروژه OpenCV ساخت تصاویر موزاییکی
تصویر tiles_addWeighted_result؛ زمانی که از 275 تصویر tile استفاده کردم؛ وزن تصاویر tile و تصویر target، برابر 0.5 هستش؛ همونطور که میبینید این روش وابستی زیادی به وزن داره، هرچی وزن تصویر target بیشتر باشه، کیفیت کار بهتر میشه؛ اصلا هم به تعداد تصاویر tile وابسته نی.
پروژه OpenCV ساخت تصاویر موزاییکی
تصویر tiles_addWeighted_result؛ زمانی که از 275 تصویر tile استفاده کردم؛ وزن تصاویر tile برابر 0.2 و وزن تصویر target برابر 0.8 هستش؛ همونطور که میبینید کیفیت کار بهتر شده.

 

امیدوارم این مطلب جالب بوده باشه براتون، تا مطلب بعد اگه زنده بودیم و قسمت شد ( که یه مطلب دیگه بنویسیم! )، یا علی.

برچسب ها : برچسب/تگ یی پیدا نشد!
تعداد مطالب : 362 تا
جنگ ما فتح قدس را به همراه خواهد داشت. [ امام خمینی (ره) ]
بقیه جلسات : پروژه OpenCV
ارسال دیدگاه
1

1) نظرات غیر فارسی به صورت خودکار حذف میشوند ( حداقل 5 حرف فارسی وارد کنید ).

2) پسورد فایل های سایت : www.dmf313.ir

3) نظرات حاوی کد برنامه نویسی تایید نمیشوند ( قالب سایت بهم میریزه )

  1. مهمان

    AVR64.com

    لبیک یا خامنه ای
    تشکر از شما دوست گرانقدر برای سایت بسیار زیبا و مطالب کاربردی