![]() |
OpenCV 5.0.0
Open Source Computer Vision
|
本章では、
多くの人は、黒い斑点や傷などが付いた古く劣化した写真を自宅に持っているだろう。それを元に戻して復元したいと思ったことはないだろうか。ペイントツールで単に消すことはできない。なぜなら、黒い構造を白い構造に置き換えるだけで役に立たないからである。こうした場合には、画像インペインティング(image inpainting)と呼ばれる技術が使われる。基本的な考え方は単純で、これらの悪い跡を周囲のピクセルで置き換え、周辺に馴染むようにするというものである。下に示す画像(Wikipedia から引用)を見てみよう:
この目的のためにいくつかのアルゴリズムが設計されており、OpenCVはそのうちの2つを提供している。どちらも同じ関数 cv.inpaint() からアクセスできる
1つ目のアルゴリズムは、2004年にAlexandru Teleaによって発表された論文"An Image Inpainting Technique Based on the Fast Marching Method"に基づいている。これはFast Marching Methodをベースにしている。画像中にインペイント対象となる領域があると考える。アルゴリズムはこの領域の境界から始まり、まず境界部分をすべて徐々に埋めながら領域の内側へと進んでいく。インペイント対象のピクセルの周囲にある小さな近傍領域を取り出す。このピクセルは、近傍内のすべての既知ピクセルの正規化された重み付き和で置き換えられる。重みの選び方は重要な問題である。対象点に近いピクセル、境界の法線に近いピクセル、境界の輪郭上にあるピクセルほど大きな重みが与えられる。あるピクセルがインペイントされると、Fast Marching Methodを使って次の最も近いピクセルへ移動する。FMMにより既知ピクセルに近いピクセルから先にインペイントされるため、ちょうど人手によるヒューリスティックな操作のように動作する。このアルゴリズムはフラグ cv.INPAINT_TELEA を使うことで有効になる。
2つ目のアルゴリズムは、2001年にBertalmio, Marcelo、Andrea L. Bertozzi、Guillermo Sapiroによって発表された論文"Navier-Stokes, Fluid Dynamics, and Image and Video Inpainting"に基づいている。このアルゴリズムは流体力学に基づいており、偏微分方程式を利用する。基本原理はヒューリスティックである。まず既知領域から未知領域へとエッジに沿って進む(エッジは連続しているはずだからである)。インペイント領域の境界で勾配ベクトルを一致させながら、等光度線(同じ輝度を持つ点を結んだ線。ちょうど輪郭線が同じ標高の点を結ぶのと同じ)を延長していく。このために流体力学の手法がいくつか用いられる。それらが得られると、その領域内の分散が最小になるように色が埋められる。このアルゴリズムはフラグ cv.INPAINT_NS を使うことで有効になる。
入力画像と同じサイズのマスクを作成する必要がある。マスクでは非ゼロのピクセルがインペインティング対象の領域に対応する。それ以外はすべて単純である。私の画像は(手作業で加えた)いくつかの黒い傷で劣化している。これに対応する傷を Paint ツールで作成した。
下に結果を示す。1枚目の画像は劣化した入力を示す。2枚目はマスクである。3枚目は1つ目のアルゴリズムの結果、最後の画像は2つ目のアルゴリズムの結果である。