OpenCV
کاربردهای هوش مصنوعی

فیلترهای فتوشاپ در OpenCV

0
زمان مطالعه: ۱۰ دقیقه

فیلترهای عکس همیشه یکی از محبوب‌ترین و جالب‌ترین برنامه‌های پردازش عکس بوده و هستند. و چه برنامه‌ای بهتر از فتوشاپ برای طراحی فیلترهای عکس! در این نوشتار به فیلترهای فتوشاپ در OpenCV خواهیم پرداخت.

یکی از ویژگی‌های جالب فیلترهای فتوشاپ در OpenCV وجود trackbar ها هستند که می‌توان با آن‌ها شدت فیلترها را کنترل کرد و موجب می‌شود جلوه (effect) عالی و مناسبی بر روی عکس اجرا شود. فیلترهای فتوشاپ در OpenCV که در این مقاله اجرا خواهیم کرد، عبارتند از:

  • Brightness (روشنایی)
  • ۶۰’s TV )تلویزیون دهه ۶۰)
  • Emboss (برجسته کردن)
  • Duo-Tone (جلوه‌های رنگی دوتایی)
  • Sepia (رنگ سوبیایی)

۱- روشنایی

منظور از روشنایی شدت نور است. با استفاده از کانال رنگی HSV می‌توان روشنایی را در تصاویر دستکاری کرد. اگر خلاصه بخواهیم بگوییم دومین و سومین کانال رنگی HSV:

  • بُعد saturation مشابه رنگ‌های روشن مختلف است. بُعد Value ترکیبی از این رنگ‌ها با مقادیر مختلفی از رنگ‌های سیاه و سفید شباهت است.

معنای جمله فوق در خودِ جمله نهفته است و به ما نشان می‌دهد چرا استفاده از کانال رنگی HSV برای این مسئله گزینه‌ای عالی و فوق‌العاده است. همان‌گونه که در تصویر مقابل مشاهده می‌کنید همزمان با افزایش معیارهای Saturation و Value از چپ به راست، جلوه‌ها هم تغییر می‌کنند.

OpenCV

مقادیر HSV که در RGB نشان داده می‌شوند و مقادیر Saturation و Value از چپ به راست افزایش پیدا می‌کنند.

 

به تصویر بالا نگاه کنید. همزمان با این‌که مقادیر این معیارها را افزایش می‌دهیم، رنگ‌ها روشن‌تر می‌شوند. برای ویرایش روشنایی و روشن‌تر کردن تصویر، مقادیر Saturation و Value را افزایش دهید.

کد پایتون:

کد C++:

در کد فوق، تصویر را به یک فضای رنگی HSV تبدیل کردیم که نوع داده آن float.64 است. فقط به این دلیل تصویر را تبدیل می‌کنیم که مطمئن شویم حاصل ضرب دو عدد اعشاری در هم  خطایی نخواهد داشت. با اجرای تابع cv2.createTrackbar می‌توانیم track bar ایجاد کنیم.  با استفاده از track bar می‌توانیم مقدار سطوح روشنایی را کنترل کنیم. تابع track bar عدد اعشاری به دست نمی‌دهد. با این حال در این تابع از اعداد بزرگ استفاده می‌شود و این اعداد بر ۱۰۰ تقسیم می‌شوند.

نکته: این فرایند برای تمامی فیلترها یکسان است و می‌توان آن را بر روی سایر فیلترها اجرا کرد.

سپس مقدار به دست آمده در ماتریس‌ها ضرب می‌شود. در نتیجه سقف مجاز رقم  برابر با ۲۵۵ خواهد بود. در گام نهایی مجدداً ماتریس‌ها را به RGB و uint8 تبدیل می‌کنیم.

تماشای ویدیو از طریق آدرس زیر:

https://www.youtube.com/watch?v=H4JCtL_l4w8&feature=youtu.be

۲(تلویزیون دهه ۶۰)

خب من هیچ کدام از برنامه‌های تلویزیونی دهه ۶۰ را تماشا نکرده‌ام. ولی فکر می‌کنم برنامه‌های تلویزیونی آن زمان سیاه و سفید بودند و نویز و برفک داشته‌اند. البته من تنها کسی نیستم که این عقیده را دارم. نسخه موبایلی Adobe Photoshop هم حرف مرا تأئید می‌کند.

تلویزیون دهه 60

اجرای فیلتر ۶۰’s TV بر روی عکس در Adobe Photoshop

 

ساده‌ترین راه اضافه کردن نویز  salt and pepper به عکس است. اگر این نویز را بر روی عکس اعمال کنیم، پیکسل‌های عکس تغییر می‌کنند. پس از آن می‌توانیم یک مقدار به پیکسل اضافه کنیم و یا یک مقدار از آن کم کنیم (که البته یک مقدار خاص و مشخص خواهد بود). این مقدار مشتقی از مقدار اصلی خواهد بود.

کد پایتون:

کد C++:

در گام اول عکس، سیاه و سفید می‌شود. در این فرایند از دو track bar کشویی استفاده می‌کنیم. در اولین track bar حداکثر تعداد نویزی که باید به عکس اضافه شود و یا از عکس کم شود، ذخیره می‌شود. دومین track bar نشان‌دهنده درصد پیکسل‌هایی است که نویز بر روی آن‌ها اجرا می‌شود. در زمان جمع و تفریق، اگر مقدار یک پیکس بیشتر از ۲۵۵ و یا کمتر از ۰ باشد، به ترتیب بر روی ۲۵۵ یا ۰ تنظیم می‌شود.

تماشای ویدیو از طریق آدرس زیر:

https://youtu.be/GY-FVfwABr0

۳برجسته سازی

فیلتر برجسته سازی موجب می‌شود قسمتی از شی برجسته‌تر سایر بخش‌های آن شود. طبق تعریفی که ویکی‌پدیا از آن ارائه داده:

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

اعمال این فیلتر در OpenCV ساده است. در OpenCV با استفاده از کرنل‌های خاصی می‌توان این فیلتر را اجرا کرد. البته بسته به اندازه کرنل‌ها، جهت فیلتر برجسته سازی متغیر است.

فیلتر برجسته سازی

کرنل‌های متفاوتی که می‌توان از آن‌ها استفاده کرد

 

ایجاد یک کرنل کافی است. با دوران  آن به اندازه کافی کرنل به دست می‌آوریم. تغییر اندازه کرنل بر شدت برجستگی تأثیر می‌گذارد. هرچه اندازه کرنل بیشتر باشد، تأثیر برجستگی هم بزرگ‌تر خواهد بود. توجه داشته باشید که حداقل اندازه کرنل ۲×۲ است.

کد پایتون:

کد C++:

همان‌گونه که پیشتر نیز گفتیم، در این فرایند از دو track bar کشویی استفاده می‌کنیم. یک track bar اندازه کرنل را کنترل می‌کند. دومین track bar جهتی را که فیلتر برجسته سازی روی آن اعمال می‌شود را کنترل می‌کند. سپس یک ماسک اضافی (روی متغیر y) ایجاد می‌شود که همه مقادیر آن ۱۲۸ هستند تا یک پس‌زمینه خاکستری ایجاد کند.

مولد کرنل یک نوع کرنل پایین  ایجاد می‌کند. فرض کنید i ردیف‌ها و j ستون‌ها را نشان می‌دهد. سپس برای تمام   مقدار ۱ و برای تمامی  مقدار ۱-  را مشخص می‌کنیم و زمانی که برابر باشند از ۰ استفاده می‌کنیم. برای ایجاد یک کرنل پایین-راست (bottom-right) باید یک بار عکس را در جهت خلاف عقریه‌های ساعت بچرخانیم. برای ایجاد کرنل‌ بالا-راست (top-right) عکس را دوبار و برای ایجاد کرنل بالا-چپ (top-left) عکس را سه بار دوران می دهیم. مقادیر گزینه‌ای (switch) که نوع کرنل را کنترل می‌کند با استفاده از np.rot90 تنظیم می‌شوند، به نحوی که یک ماتریس را در جهت خلاف عقربه‌های ساعت می‌چرخاند، ماتریس مورد نیاز را در اختیار ما می‌گذارد.

با استفاده از cv2.filter2D هم کرنل با نسخه سیاه و سفید عکس ورودی می‌چرخد. آرگومان میانی عمق مورد نیاز برای ماتریس خروجی را نشان می‌دهد. در این حالت اگر یک مقدار منفی برای مثال ۱- تعیین شود، عمق ثابت باقی می‌ماند و تغییر نمی‌کند.

تماشای و.یدئو از طریق آدرس زیر:

https://youtu.be/t3j5ujVlZ84

سمت چپ: تصویر اصلی / سمت راست: نتیجه اعمال فیلتر Emboss بر روی عکس. عکس از Anastase Maragos در Unsplash

۴- Duo-Tone

همانند فیلتر ۶۰s TV این فیلتر هم از Adobe Photoshop الهام گرفته شده است. این فیلتر چه کاری انجام می‌دهد؟

کاربرد هوش مصنوعی در موسیقی و سه دلیل برای استفاده از آن در این صنعت

Duo-Tone

همان‌گونه که در gif فوق مشاهده می‌کنید، فیلتر duo-tone یک سایه رنگی بر روی عکس اعمال می‌کند. برای به دست آوردن این جلوه، کانال رنگی گزینه‌ای برای افزایش مقدار خواهد داشت. در نتیجه افزایش مقدار هم سایه روشن‌تر خواهد شد. مقادیر سایر کانال‌ها را می‌توان کاهش داد و یا بر روی صفر تنظیم کرد تا یک سایه روشن‌ یا یک‌دست بر روی تصویر اعمال شود.

کد پایتون:

کد C++:

 

از اولین track bar برای به دست آوردن یک مقدار بین ۰ تا ۱۰ استفاده می‌کنیم. سپس مقادیر نرمال‌سازی می‌شوند تا بین ۰ و ۱ باشند. سپس مقدار ۱ اضافه می‌شود که یک مقدار نمایی خواهد بود. سپس تابع نمایی با استفاده از cv2.LUT بر روی عکس اجرا می‌شود. این تابع یک کانال را دریافت می‌کند و با استفاده از یک جدول مراجعه (lookup table) ان را تبدیل می‌کند. سپس سه گزینه ایجاد می‌شوند و مقادیر آبی، سبز و قرمز به آن‌ها اختصاص داده می‌شود. البته گزینه دوم یک گزینه اضافی none هم دارد. گزینه سوم مشخص می‌کند که آیا حالت تاریک باید استفاده شود یا حالت روشن. تمامی این گزینه‌ها این امکان را برای ما فراهم می‌کنند تا از میان ۶ پالت رنگی مختلف یکی را انتخاب و بر روی عکس اعمال کنیم.

با توجه به رنگی که کاربر انتخاب کرده، مقادیر آن بر اساس تابع نمایی افزایش می‌یابند. در غیر این صورت مقدار بر روی صفر تنظیم می‌شود و کاهش می‌یابد.

تماشای ویدئو از طریق آدرس زیر:

https://youtu.be/eN2KlZVx5RE

۵Sepia (رنگ سوبیایی)

فیلتر sepia رنگ عکس اصلی را به رنگ قرمز متمایل به قهوه‌ای (سوبیایی) تغییر می‌دهد. با استفاده از این فیلتر می‌توان ظاهر نمای کلی تصویر را تغییر دارد. فیلتر Sepia فیلتر رایج و متدوالی است و تقریباً در تمامی نرم‌افزارهای ویرایش عکس یافت می‌شود.

اجرای این فیلتر در OpenCV آسان است. رنگ این فیلتر ثابت است و تغییر نمی‌کند. علاوه بر این، این فیلتر یک ماتریس استانداردسازی‌شده دارد که می‌توان به عنوان پیش‌فرض از آن استفاده کرد. البته توجه داشته باشید که OpenCV از فرمت رنگی BGR استفاده می‌کند، اما ماتریسی که به صورت آنلاین در دسترس شما قرار می‌گیرد برای فضای رنگی RGB است. بنابراین باید آن را به RGB تبدیل کنیم و پس از پردازش و پیش از نمایش دادن تصویر،  آن را مجدداً به فرمت BGR برگردانیم.

کد پایتون:

 کد C++:

پیش از اینکه از cv2.transform استفاده کنیم تا جلوه دلخواه را بر روی عکس اجرا کنیم، نوع داده تصویر به float تغییر می‌کند. هر مقداری که بیشتر از ۲۵۵ باشد به ۲۵۵ محدود می‌شود. سپس نوع داده به np.uint8 و فضای رنگی به BGR تغییر می‌کند.

نتیجه اعمال فیلتر Sepia

سمت چپ: تصویر اصلی / سمت راست: نتیجه اعمال فیلتر Sepia بر روی عکس. عکس از Quino AI در Unsplash

ممکن است این سؤال برای‌تان پیش بیاید که چرا ویدئویی برای این فیلتر تهیه نکردیم و شدت آن را به وسیله trach bar کنترل کردیم؟ برای اینکه فیلتر Sepia یک رنگ ثابت دارد و با یک آرایه ثابت می‌توان آن را به دست آورد.

چکیده

در این مقاله به شما نشان دادیم که چگونه می‌توان با استفاده از توابع OpenCV، ۵ فیلتر مختلف ایجاد کرد. Track barها این امکان را برای کاربران فراهم می‎کنند تا شدت فیلتر را بر اساس نیاز و سلیقه خود تنظیم کنند. در این مقاله فقط گوشه کوچکی از قابت‌های بی‌شمار OpenCV را به شما معرفی کردیم.

انواع کاربردهای هوش مصنوعی در صنایع مختلف را در هوشیو بخوانید

این مطلب چه میزان برای شما مفید بوده است؟
[کل: ۰ میانگین: ۰]

دانشگاه هاروارد برگزار می‌کند: دوره‌ کاربردهای یادگیری ماشین کوچک

مقاله قبلی

ماژول Coral USB Accelerator گوگل

مقاله بعدی

شما همچنین ممکن است دوست داشته باشید

نظرات

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد.