![]() |
OpenCV 4.13.0
Open Source Computer Vision
|
このチュートリアルでは、F変換を用いた画像インペインティングの仕組みを学ぶ。これは次の要素から成る:
このチュートリアルの目的は、逆F変換が画像再構成に利用できることを示すことである。ここで画像再構成とは、破損した画像の再構成を意味し、破損とは元画像に含まれないすべてのものを指す。ノイズ、テキスト、傷などが該当する。提案するのは、近似手法を用いて再構成の問題を解くことである。つまり、与えられた画像に近く、かつ破損と認識されるものを含まない近似画像を探すことになる。このタスクは 画像インペインティング (image inpainting) と呼ばれる。
前のチュートリアルで示したように、F変換は画像処理で非常に有用なファジィ数学のツールである。先に導入したカーネル \(g\) を用いて、この式を書き直してみよう:
\[ F^0_{kl}=\frac{\sum_{x=0}^{2h+1}\sum_{y=0}^{2h+1} \iota_{kl}(x,y) g(x,y)}{\sum_{x=0}^{2h+1}\sum_{y=0}^{2h+1} g(x,y)}, \]
ここで \(\iota_{kl} \subset I\) はピクセル \((k \cdot h,l \cdot h)\) を中心とし、\(g\) はカーネルである。画像処理の目的では、次のようなバイナリマスク \(S\) を用いる
\[ g^s_{kl} = g \circ s_{kl} \]
ここで \(s_{k,l} \subset S\) である。マスク \(S\) の部分領域 \(s\) は、画像 \(I\) の部分領域 \(\iota\) に対応する。演算子 \(\circ\) は要素ごとの行列積(アダマール積)である。式は次のように更新される
\[ F^0_{kl}=\frac{\sum_{x=0}^{2h+1}\sum_{y=0}^{2h+1} \iota_{kl}(x,y) g^s(x,y)}{\sum_{x=0}^{2h+1}\sum_{y=0}^{2h+1} g^s(x,y)}. \]
詳細は関連論文を参照のこと。
以下のサンプルでは、画像のインペインティング (修復) の使い方を示す。同じ入力と3種類の異なる破損を用いて、3枚の人工的な画像を生成する。実際の利用では入力画像はすでに用意されているが、ここでは自分で作成している。
まず、画像と、人工的な破損の生成に用いる3枚のマスクを読み込む必要がある。
マスクは
IMREAD_GRAYSCALEとして読み込む必要がある点に注意する。
次のステップでは、これらのマスクを使って入力画像を破損させる。
マスクを使って、同じ入力画像に3種類の異なる破損を適用した。結果は以下のとおりである。
実際の利用では、画像
input1、input2、input3は自然に生成され、そのまま入力として使われる点を忘れないこと。
続いて出力画像を宣言する。以降の行ではインペインティングのメソッドを適用する。3種類のアルゴリズムを1つずつ説明する。
1つ目は ONE_STEP である。
ONE_STEP アルゴリズムは、破損部分を無視して半径 2 のカーネル (メソッド呼び出しで指定したとおり) を使い、直接F変換を単純に計算する。逆F変換により、近傍の成分の値を使って欠損領域を埋める。十分大きな半径を選ぶかどうかは利用者次第である。
2つ目は MULTI_STEP である。
MULTI_STEP アルゴリズムは同じように動作するが、指定した半径 (この場合は 2) が不十分と判断された場合に自動的に大きくする。穴を埋めたいがどれくらいの半径が必要か分からない場合は、MULTI_STEP を選んでコンピュータに判断させればよい。可能な限り小さい半径が見つけられる。
最後は ITERATIVE である。
大多数の場合に最良の選択は ITERATIVE である。この処理方法は、小さな破損には小さな半径の基底関数を、大きな穴にはより大きな半径を使う。