此项目是 Google Summer of Code 2019 的一部分。
学生: Muskaan Kularia
导师: Sunita Nayak
Alphamatting 是从背景图像中提取具有柔和边界的前景的问题。提取的前景可用于进一步操作,例如更改图像中的背景。
给定输入图像及其对应的 trimap,我们尝试从背景中提取前景。以下是一个示例
输入图像:
输入图像最好是 RGB 图像。
输入 Trimap:
trimap 图像是一个灰度图像,包含有关前景(白色像素)、背景(黑色像素)和未知(灰色)像素的信息。
输出 alpha Matte:
计算出的 alpha matte 作为灰度图像保存,其中像素值指示提取的前景对象的透明度。这些透明度值可用于将前景对象混合到不同的背景中,如下所示:
以下是一些更多结果。
第一列是输入 RGB 图像,第二列是输入 trimap,第三列是提取的 alpha matte,最后两列显示混合在新背景上的前景对象。
此项目是 [7] 的实现。它还需要实现其他论文 [2,3,4] 的部分内容。
构建
此模块使用 Eigen 包。
使用以下两个 cmake 命令在 build 文件夹中运行,构建 alphamat 模块的示例代码
cmake -DOPENCV_EXTRA_MODULES_PATH=<opencv_contrib 模块的路径> -DBUILD_EXAMPLES=ON ..
cmake --build . --config Release --target example_alphamat_information_flow_matting
如有必要,请参阅 OpenCV 构建教程以获取更多详细信息。
测试
构建的目标可以按如下方式测试
<opencv 构建目录的路径>/bin/example_alphamat_information_flow_matting -img=<输入图像文件的路径> -tri=<对应 trimap 的路径> -out=<保存输出 matte 文件的路径>
示例的源代码
20 "{tri || 输入 trimap 图像名称}"
25int main(
int argc,
char* argv[])
28 parser.about(
"此示例演示信息流 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(
"无法读取图像文件:'%s'\n", img_path.c_str());
61 tmap =
imread(trimap_path, IMREAD_GRAYSCALE);
64 printf(
"无法读取 trimap 文件:'%s'\n", trimap_path.c_str());
72 if (result_path.empty())
76 imshow(
"result alpha matte", result);
83 printf(
"结果已保存:'%s'\n", result_path.c_str());
用于命令行解析。
定义 utility.hpp:820
bool empty() const
如果数组没有元素,则返回 true。
void infoFlow(InputArray image, InputArray tmap, OutputArray result)
计算图像中对象的 alpha matte。
void imshow(const String &winname, InputArray mat)
在指定的窗口中显示图像。
int waitKey(int delay=0)
等待按下键。
void namedWindow(const String &winname, int flags=WINDOW_AUTOSIZE)
创建一个窗口。
CV_EXPORTS_W bool imwrite(const String &filename, InputArray img, const std::vector< int > ¶ms=std::vector< int >())
将图像保存到指定的文件。
CV_EXPORTS_W Mat imread(const String &filename, int flags=IMREAD_COLOR)
从文件加载图像。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
与磁盘上的文件关联的文件存储的“黑盒”表示。
定义 core.hpp:102
参考资料
[1] Yagiz Aksoy, Tunc Ozan Aydin, Marc Pollefeys, 为自然图像抠图设计有效像素间信息流, CVPR, 2017。
[2] Roweis, Sam T. 和 Lawrence K. Saul。 通过局部线性嵌入进行非线性降维,科学 290.5500 (2000): 2323-2326。
[3] Anat Levin,Dani Lischinski,Yair Weiss,自然图像抠图的封闭解,IEEE TPAMI,2008。
[4] 陈奇峰,李鼎泽宇,唐志强,KNN抠图,IEEE TPAMI,2013。
[5] Yagiz Aksoy,基于亲和力的抠图工具箱。