我正在尝试从两个图像中删除前景,这是一对示例图像:
如您所见,在拍摄第二张照片之前,会从场景中移除百威瓶。
这些照片是从针孔相机(iPhone)拍摄的,而且,棘手的部分是我手持相机,因此不能保证图像完美地按像素对齐,所以简单的减去 - 阈值方法不起作用。
然后,我决定使用OpenCV中的findHomography
和warpPerspective
执行图片注册,这是结果图片:
这个图像使用我从findHomography
获得的矩阵进行扭曲,这有点改善了对齐质量,但仍然没有对齐,所以我可以使用一种简单的方法来删除前景。
所以,最后,我决定实现一个“模糊 - 减”算法:对于image1中的每个像素,我将使用灰度的最小差异来查看image2中的7x7邻居(7 x 7内核?)作为减号的结果,并将结果阈值转换为二进制图像,这就是我所得到的:
结果仍然不好。请注意瓶子中的白色整体,这是由于前景和背景的灰度值相似而产生的。所以我不知道现在该做什么。
我可以想出两种解决问题的方法,第一种是获得更好的对齐图像,然后简单地减去对;第二种是使用更健壮的方式来提取前景。
有人可以就如何处理这类问题给我一些建议吗?我相信应该有一些最先进的算法或处理流水线,但谷歌搜索后,我什么都没得到。
我正在使用OpenCV和C ++,如果你能告诉我如何使用这些工具来实现它,那就太棒了。
提前非常感谢!
答案 0 :(得分:4)
问题不在您的算法中。您遇到问题,因为两个场景不是从完全相同的角度拍摄的,如下面的动画所示。这种微小的差异突出了减法中的边缘。
您需要静态相机才能应用此方法。
答案 1 :(得分:1)
我建议在掩码中使用数学形态学来摆脱伪影。 尝试应用开启和关闭来摆脱黑色和白色的小区域。
Mathematical Morphology in opencv
两张图片之间的区别非常大,所以你需要使用一个大型结构元素,但我不认为你能够摆脱阴影。 对于背景中的两个大条带,您也可以尝试使用水平形状的结构元素。
是否可以生成灰度图像而不是二值图像?如果是的话,你可以尝试使用阴影的帽子方法,但我不确定这一点。
这是我使用两个不同的结构元素来关闭那个开放
Mat mask = imread("mask.jpg",CV_LOAD_IMAGE_GRAYSCALE);
morphologyEx(mask,mask,MORPH_CLOSE,getStructuringElement(CV_SHAPE_ELLIPSE,Size(50,10)));
morphologyEx(mask,mask,MORPH_OPEN,getStructuringElement(CV_SHAPE_ELLIPSE,Size(10,50)));
imshow("open",mask);
imwrite("maskopenclose.jpg",mask);
答案 2 :(得分:0)
我建议用于对齐的光流和OpenCV的背景减法算法:
http://docs.opencv.org/trunk/doc/tutorials/video/background_subtraction/background_subtraction.html
答案 3 :(得分:0)
我建议不要使用findHomography
尝试使用openCV的立体声对应函数:http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html
这里有一个示例代码:https://github.com/Itseez/opencv/blob/master/samples/cpp/stereo_calib.cpp