このプロジェクトは Google Summer of Code 2019 の一環であった。
学生: Muskaan Kularia
メンター: Sunita Nayak
アルファマッティングは、背景画像から滑らかな境界を持つ前景を抽出する問題である。抽出した前景は、画像の背景を変更するなどのさらなる処理に利用できる。
入力画像とそれに対応するトライマップが与えられたとき、背景から前景を抽出する。以下はその例である。
入力画像:
入力画像はRGB画像であることが望ましい。
入力トライマップ:
トライマップ画像はグレースケール画像であり、前景(白いピクセル)、背景(黒いピクセル)、未確定(灰色)のピクセルに関する情報を含む。
出力アルファマット:
計算されたアルファマットはグレースケール画像として保存され、ピクセル値は抽出された前景オブジェクトの不透明度を示す。これらの不透明度の値を用いて、以下に示すように前景オブジェクトを別の背景に合成できる。 
以下にさらにいくつかの結果を示す。 
1列目は入力RGB画像、2列目は入力トライマップ、3列目は抽出されたアルファマット、最後の2列は新しい背景に合成された前景オブジェクトを示す。
このプロジェクトは [9] の実装である。また、他の論文[2,3,4]の一部の実装も必要とした。
ビルド
このモジュールはEigenパッケージを使用する。
buildフォルダ内で以下の2つのcmakeコマンドを実行して、alphamatモジュールのサンプルコードをビルドする。
cmake -DOPENCV_EXTRA_MODULES_PATH=<path to opencv_contrib modules> -DBUILD_EXAMPLES=ON ..
cmake --build . --config Release --target example_alphamat_information_flow_matting
必要に応じて、さらに詳しい情報はOpenCVのビルドチュートリアルを参照すること。
テスト
ビルドしたターゲットは以下のようにテストできる。
<path to your opencv build directory>/bin/example_alphamat_information_flow_matting -img=<path to input image file> -tri=<path to the corresponding trimap> -out=<path to save output matte file>
サンプルのソースコード
19 "{img || input image name}"
20 "{tri || input trimap image name}"
21 "{out || output image name}"
22 "{help h || print help message}"
25int main(
int argc,
char* argv[])
28 parser.about(
"This sample demonstrates Information Flow Alpha Matting");
30 if (parser.has(
"help"))
32 parser.printMessage();
37 string img_path = parser.get<std::string>(
"img");
38 string trimap_path = parser.get<std::string>(
"tri");
39 string result_path = parser.get<std::string>(
"out");
43 || img_path.empty() || trimap_path.empty())
45 parser.printMessage();
53 image = imread(img_path, IMREAD_COLOR);
56 printf(
"Cannot read image file: '%s'\n", img_path.c_str());
61 tmap =
imread(trimap_path, IMREAD_GRAYSCALE);
64 printf(
"Cannot read trimap file: '%s'\n", trimap_path.c_str());
72 if (result_path.empty())
76 imshow(
"result alpha matte", result);
83 printf(
"Result saved: '%s'\n", result_path.c_str());
Designed for command line parsing.
Definition utility.hpp:890
n-dimensional dense array class
Definition mat.hpp:840
bool empty() const
Returns true if the array has no elements.
void infoFlow(InputArray image, InputArray tmap, OutputArray result)
Compute alpha matte of an object in an image.
void imshow(const String &winname, InputArray mat)
Displays an image in the specified window.
int waitKey(int delay=0)
Waits for a pressed key.
void namedWindow(const String &winname, int flags=WINDOW_AUTOSIZE)
Creates a window.
bool imwrite(const String &filename, InputArray img, const std::vector< int > ¶ms=std::vector< int >())
Saves an image to a specified file.
Mat imread(const String &filename, int flags=IMREAD_COLOR_BGR)
Loads an image from a file.
int main(int argc, char *argv[])
Definition highgui_qt.cpp:3
Definition alphamat.hpp:25
参考文献
[1] Yagiz Aksoy, Tunc Ozan Aydin, Marc Pollefeys, Designing Effective Inter-Pixel Information Flow for Natural Image Matting, CVPR, 2017.
[2] Roweis, Sam T., and Lawrence K. Saul. Nonlinear dimensionality reduction by locally linear embedding, Science 290.5500 (2000): 2323-2326.
[3] Anat Levin, Dani Lischinski, Yair Weiss, A Closed Form Solution to Natural Image Matting, IEEE TPAMI, 2008.
[4] Qifeng Chen, Dingzeyu Li, Chi-Keung Tang, KNN Matting, IEEE TPAMI, 2013.
[5] Yagiz Aksoy, Affinity Based Matting Toolbox.