عکاسی محاسباتی

بازسازی و ترمیم تصویر (Image Inpainting)

۴ دقیقه مطالعهOpenCV 5.xبه‌روزرسانی:

هدف#

در این فصل،

  • یاد خواهیم گرفت چگونه نویزهای کوچک، خطوط و لکه‌ها را در عکس‌های قدیمی با روشی به نام این‌پینتینگ (Inpainting یا بازسازی تصویر) حذف کنیم.
  • قابلیت‌های بازسازی تصویر در OpenCV را خواهیم دید.

مفاهیم پایه#

اکثر شما چند عکس قدیمی و تخریب‌شده در خانه دارید که لکه‌های سیاه، خراشیدگی و غیره روی آن‌ها وجود دارد. آیا تا به حال به فکر بازسازی آن‌ها افتاده‌اید؟ ما نمی‌توانیم به سادگی آن‌ها را در یک ابزار نقاشی (مانند Paint) پاک کنیم، زیرا این کار صرفاً ساختارهای سیاه را با ساختارهای سفید جایگزین می‌کند که فایده‌ای ندارد. در این موارد از تکنیکی به نام بازسازی تصویر (Image Inpainting) استفاده می‌شود. ایده اصلی ساده است: جایگزینی آن نشانه‌ها و خراشیدگی‌های نامطلوب با پیکسل‌های همسایه آن، به طوری که شبیه به محیط همسایگی به نظر برسد. تصویر زیر را در نظر بگیرید (گرفته‌شده از ویکی‌پدیا):

بازسازی و ترمیم تصویر (Image Inpainting) — تصویر ۱

الگوریتم‌های متعددی برای این منظور طراحی شده‌اند و OpenCV دو مورد از آن‌ها را ارائه می‌دهد. به هر دوی آن‌ها می‌توان از طریق یک تابع دسترسی داشت: ()cv.inpaint

الگوریتم اول بر اساس مقاله "An Image Inpainting Technique Based on the Fast Marching Method" توسط الکساندرو تلئا (Alexandru Telea) در سال ۲۰۰۴ است. این الگوریتم بر پایه روش پیمایش سریع (Fast Marching Method یا FMM) بنا شده است. ناحیه‌ای از تصویر را که قرار است بازسازی شود در نظر بگیرید. الگوریتم از مرز این ناحیه شروع شده و به تدریج به سمت داخل حرکت می‌کند و ابتدا همه چیز را در مرز پر می‌کند. این الگوریتم یک همسایگی کوچک در اطراف پیکسلی که باید بازسازی شود در نظر می‌گیرد. این پیکسل با مجموع وزندار نرمال‌شده تمام پیکسل‌های شناخته‌شده در همسایگی جایگزین می‌شود. انتخاب وزن‌ها موضوع مهمی است؛ وزن بیشتری به پیکسل‌هایی داده می‌شود که نزدیک‌تر به نقطه، نزدیک به بردار نرمال مرز و روی کانتورهای مرزی قرار دارند. پس از بازسازی یک پیکسل، با استفاده از روش Fast Marching به نزدیک‌ترین پیکسل بعدی می‌رود. روش FMM تضمین می‌کند که پیکسل‌های نزدیک به پیکسل‌های معلوم ابتدا بازسازی شوند، به طوری که دقیقاً مانند یک عملیات مکاشفه‌ای دستی عمل می‌کند. این الگوریتم با استفاده از پرچم cv.INPAINT_TELEA فعال می‌شود.

الگوریتم دوم بر اساس مقاله "Navier-Stokes, Fluid Dynamics, and Image and Video Inpainting" نوشته Bertalmio, Marcelo, Andrea L. Bertozzi, and Guillermo Sapiro در سال ۲۰۰۱ است. این الگوریتم بر پایه دینامیک سیالات بنا شده و از معادلات دیفرانسیل با مشتقات جزئی استفاده می‌کند. اصل اساسی اکتشافی (Heuristic) است؛ ابتدا در امتداد لبه‌ها از نواحی شناخته‌شده به نواحی ناشناخته حرکت می‌کند (زیرا لبه‌ها قرار است پیوسته باشند). این روش خطوط هم‌شدت (Isophotes - خطوطی که نقاط با شدت روشنایی یکسان را به هم متصل می‌کنند، درست همانند خطوط تراز کانتور که نقاط با ارتفاع یکسان را وصل می‌کنند) را در حین تطبیق بردارهای گرادیان در مرز ناحیه بازسازی ادامه می‌دهد. برای این منظور از روش‌هایی از دینامیک سیالات استفاده می‌شود. هنگامی که این خطوط به دست آمدند، رنگ برای کاهش حداقل واریانس در آن ناحیه پر می‌شود. این الگوریتم با استفاده از پرچم cv.INPAINT_NS فعال می‌شود.

کد#

ما باید ماسکی به همان اندازه تصویر ورودی ایجاد کنیم، جایی که پیکسل‌های غیرصفر نشان‌دهنده ناحیه‌ای هستند که باید بازسازی شوند. همه چیز دیگر ساده است. تصویر من با چند خط سیاه تخریب شده است (به صورت دستی اضافه کردم). من خطوط متناظر را با ابزار Paint ایجاد کردم.

import numpy as np
import cv2 as cv

img = cv.imread('messi_2.jpg')
mask = cv.imread('mask2.png', cv.IMREAD_GRAYSCALE)

dst = cv.inpaint(img,mask,3,cv.INPAINT_TELEA)

cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()

نتیجه را در زیر مشاهده کنید. تصویر اول ورودی تخریب‌شده را نشان می‌دهد. تصویر دوم ماسک است. تصویر سوم نتیجه الگوریتم اول و تصویر آخر نتیجه الگوریتم دوم است.

بازسازی و ترمیم تصویر (Image Inpainting) — تصویر ۲

منابع اضافی#

  1. Bertalmio, Marcelo, Andrea L. Bertozzi, and Guillermo Sapiro. "Navier-stokes, fluid dynamics, and image and video inpainting." In Computer Vision and Pattern Recognition, 2001. CVPR 2001. Proceedings of the 2001 IEEE Computer Society Conference on, vol. 1, pp. I-355. IEEE, 2001.
  2. Telea, Alexandru. "An image inpainting technique based on the fast marching method." Journal of graphics tools 9.1 (2004): 23-34.

تمرین‌ها#

  1. کتابخانه OpenCV همراه با یک نمونه تعاملی در مورد بازسازی تصویر ارائه می‌شود: samples/python/inpaint.py، آن را امتحان کنید.
  2. چند ماه پیش، ویدیویی در مورد Content-Aware Fill تماشا کردم که یک تکنیک پیشرفته بازسازی تصویر است که در Adobe Photoshop استفاده می‌شود. با جستجوی بیشتر، متوجه شدم که همین تکنیک از قبل در GIMP با نام دیگری به نام "Resynthesizer" وجود دارد (باید پلاگین جداگانه‌ای نصب کنید). مطمئنم از این تکنیک لذت خواهید برد.