此项目是 Google Summer of Code 2019 的一部分。
学生: Muskaan Kularia
导师: Sunita Nayak
Alpha Matting 是从背景图像中提取具有柔和边界的前景的问题。 提取的前景可用于进一步的操作,例如更改图像中的背景。
给定输入图像及其对应的 Trimap,我们尝试从背景中提取前景。 以下是一个示例
输入图像:
输入图像最好是 RGB 图像。
输入 Trimap:
Trimap 图像是灰度图像,其中包含有关前景(白色像素)、背景(黑色像素)和未知(灰色)像素的信息。
输出 Alpha Matte:
计算出的 Alpha Matte 保存为灰度图像,其中像素值指示提取的前景对象的不透明度。 这些不透明度值可用于将前景对象混合到不同的背景中,如下所示: 
以下是一些更多结果。 
第一列是输入 RGB 图像,第二列是输入 Trimap,第三列是提取的 Alpha Matte,最后两列显示了混合在新背景上的前景对象。
此项目是 [8] 的实现。 它还需要实现其他论文 [2,3,4] 的部分内容。
构建
此模块使用 Eigen 包。
使用以下两个 cmake 命令在构建文件夹内运行来构建 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(
"结果 Alpha Matte", result);
83 printf(
"结果已保存:'%s'\n", result_path.c_str());
如果数组没有元素,则返回 true。
int64_t int64
cv::getTickFrequency
double getTickFrequency()
void infoFlow(InputArray image, InputArray tmap, OutputArray result)
计算图像中对象的Alpha蒙版。
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_BGR)
从文件加载图像。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
参考文献
[1] Yagiz Aksoy, Tunc Ozan Aydin, Marc Pollefeys, 为自然图像抠图设计有效的像素间信息流, CVPR, 2017.
[2] Roweis, Sam T., and Lawrence K. Saul. 局部线性嵌入的非线性降维, Science 290.5500 (2000): 2323-2326.
[3] Anat Levin, Dani Lischinski, Yair Weiss, 自然图像抠图的封闭形式解决方案, IEEE TPAMI, 2008.
[4] Qifeng Chen, Dingzeyu Li, Chi-Keung Tang, KNN 抠图, IEEE TPAMI, 2013.
[5] Yagiz Aksoy, 基于亲和力的抠图工具箱。