2018年7月5日 更新

画像の一部を消すInpainting という技術とその実装 (python)

Python + OpenCVにより,画像の修復の技術,「Inpainting 」の実装を行います.

2,835 view お気に入り 0

Inpainting とは?

Inpaint は日本語では修復するという意味です.画像処理の分野では,「いらないものを消す」ということでしょうか.では,どのようなことができるのでしょうか.まずはこの論文を見てみてください.

– Image Inpainting –, Marcelo Bertalmio and Guillermo Sapiro and Vicent Caselles and Coloma Ballester

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
 (4847)

Inpainting の例.上の論文のFigure 6 より引用しました.

なんと,引っかき傷や,画像の上に書かれた文字などがナチュラルに復元されているではありませんか!!これは驚きですね. この記事では,どのようにしてこれが実現されているのか,数学的に説明したあと,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$をどのように与えてやるかが大事です

更新の様子.

更新の様子.

上の論文のFigure.7 を引用しています.

上の論文では,

\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 を行っている領域に対する法線方向成分です.

まずここで,画像のラプラシアンとはどのような値なのか,簡単な画像を用いて確認してみましょう. 今回は以下の画像を用いてみます.

 (4855)

この画像から一部分を削ってみます.削る際には,画像処理のアプリケーションであるImageJ を用いると便利です.

 (4857)

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)
code01.py
 (4859)

39 件

関連する記事 こんな記事も人気です♪

画像のFilter をPython で視覚的に理解する (Gaussian, Edge 抽出).

画像のFilter をPython で視覚的に理解する (Gaussian, Edge 抽出).

Python を用いて,画像のFilter を視覚的に理解してみます.コードを載せていますので,実装可能です.
三好 裕之 | 5,786 view
OpenCVで重心を計算する

OpenCVで重心を計算する

重心を計算する方法の紹介です
望月 優輝 | 5,370 view
LP-tech2周年記念#人気記事のまとめ#第5位〜第1位

LP-tech2周年記念#人気記事のまとめ#第5位〜第1位

LP-techが始まってから2周年を迎えました。ここまでLP-techを続けることができたのも読者の皆様のおかげだと思っています。そこで、LP-techの感謝祭ということで、人気の記事を第20位から第1位までをご紹介します。今回は第5位〜第1位までです。
LP-tech2周年記念#人気記事のまとめ#第15位〜第11位

LP-tech2周年記念#人気記事のまとめ#第15位〜第11位

LP-techが始まってから2周年を迎えました。ここまでLP-techを続けることができたのも読者の皆様のおかげだと思っています。そこで、LP-techの感謝祭ということで、人気の記事を第20位から第1位までをご紹介します。今回は第15位〜第11位までです。
医用画像位置合わせの基礎⑥ 〜アフィン変換とは?〜

医用画像位置合わせの基礎⑥ 〜アフィン変換とは?〜

今回は、画像位置合わせに用いられるアフィン変換をご紹介します。
木田智士 | 7,793 view

この記事のキーワード

この記事のキュレーター

三好 裕之 三好 裕之