Inpainting とは?
Inpaint は日本語では修復するという意味です.画像処理の分野では,「いらないものを消す」ということでしょうか.では,どのようなことができるのでしょうか.まずはこの論文を見てみてください.
Inpainting, the technique of modifying an image in an undetectable
form, is as ancient as art itself. The goals and applications of inpainting
are numerous, from the restoration of damaged paintings
and photographs to the removal/replacement of selected objects
なんと,引っかき傷や,画像の上に書かれた文字などがナチュラルに復元されているではありませんか!!これは驚きですね. この記事では,どのようにしてこれが実現されているのか,数学的に説明したあと,python のコードにより,実際にInpainting を行ってみたいと思います.
Inpainting の理論
画像$I^0 (i,j)$を初期画像,つまりinpainting する前の状態とし,これをinpainting time $n$によって更新していくことによってinpainting を実現します.具体的には \begin{align} I^{n+1} (i,j) = I^n (i,j) + \Delta t I_{t}^n (i,j),\ \ \forall (i,j) \in \Omega \end{align}
という式を考えます.この更新の仕方$I_t$をどのように与えてやるかが大事です.
上の論文では,
\begin{align} I_t^{n} (i,j) = \delta L^n (i,j) \cdot N^{n} (i,j) \end{align}
としています.ただし,$L^n$は画像のラプラシアンであり,以下の式で与えられます. \begin{align} L^n (i,j) = I^n_{xx} (i,j) + I_{yy}^n (i,j) \end{align}
そして,$N$はinpainting を行っている領域に対する法線方向成分です.
まずここで,画像のラプラシアンとはどのような値なのか,簡単な画像を用いて確認してみましょう. 今回は以下の画像を用いてみます.
この画像から一部分を削ってみます.削る際には,画像処理のアプリケーションであるImageJ を用いると便利です.
import cv2 import numpy as np ##from matplotlib import pyplot as plt im = cv2.imread('01.png',0) cv2.imshow('Orignial',im) cv2.waitKey(0) ## plot image ## Calculate Laplacian lap = cv2.Laplacian(im,cv2.CV_32F) cv2.imshow('Laplacian',lap) cv2.waitKey(0) im_b = cv2.imread('01_b.png',0) cv2.imshow('Inpaint_b',im_b) cv2.waitKey(0) ## plot image ## Calculate Laplacian lap_b = cv2.Laplacian(im_b,cv2.CV_32F) cv2.imshow('Laplacian_b',lap_b) cv2.waitKey(0)