在图像上应用蒙版以裁剪前景会产生不完整的输出

时间:2014-05-29 07:27:02

标签: c++ image opencv mask background-foreground

所以我在3天前拿起了OpenCV。总新手。我在网上下载了代码来实现Lazy Snapping,这是一个与Grabcut非常相似的图像剪切工具。我认为这是一个C ++项目,但大部分代码都是用C风格编写的,直到掩模创建部分完成。我想扩展它以在原始图像上应用蒙版并剪切前景并将其粘贴到不同的图像中。

我找不到C的帮助。所以我保存了面具并使用Mat(C ++)读取它。这是一个小代码片段:

cvSaveImage("Mask.jpg",mask);
cvSaveImage("Object_Marking_Output.jpg",showImg);
cvSaveImage("Original.jpg",original);
Mat masky = imread("Lazy Snapping/mask.jpg", 1);
Mat showImg1 = imread("Lazy Snapping/Original.jpg", 1);     

Mat crop(showImg1.rows, showImg1.cols, CV_8UC3);
//Though the mask appears black and white I kept getting errors 
//This convert code helped it go away. I could recreate the error if necessary
cvtColor(masky,masky,CV_RGB2GRAY);
//I resize it because the mask created is smaller
cv::resize(masky, masky, showImg1.size());

showImg1.copyTo(crop, masky);
//bitwise_and(showImg1, cv::Scalar(255,255,255), crop, masky);

// normalize so imwrite(...)/imshow(...) shows the mask correctly!
normalize(masky.clone(), masky, 0.0, 255.0, CV_MINMAX, CV_8UC1);    

// show the images
imshow("Mask used to apply on image", masky);
imshow("Lazy snapped output", crop);

但是我的输出看起来很奇怪。我试图去掉头上的毛巾,把一切都当作背景。创建的面具非常完美,只勾勒出毛巾。然而,当在输入图像上应用它时,我在输出图像上得到背景的这些额外的散射位(它不允许我直接发布图像。所以这里是一个dropbox链接):

https://www.dropbox.com/sh/z4u22n9yyfhcnpx/AAA8QxU9tkLGgEEyS_2QFuG2a

我不知道为什么会发生这种情况,因为我在论坛上阅读的教程和答案看起来是正确的方法。 copyTo和bitwise_and给出相同的输出。任何帮助深表感谢。提前谢谢!

1 个答案:

答案 0 :(得分:2)

那些漏洞'已经在你的面具img中(如果你有一些带有移液器工具的imgviewer,你可以检查自己,resp.parts不是完全黑色,但是像0x020202,所以掩盖在那些区域失败)

所以,

threshold(masky,masky, 120,255, 0);

你的形象,所以它是完美的二元'

PS:避免像jpg一样保存这样的东西。你的问题看起来像是压缩/插值假象