像素级图像注册/对齐?

时间:2013-11-22 00:28:43

标签: c++ opencv image-processing computer-vision

我正在尝试从两个图像中删除前景,这是一对示例图像:

Image 1 Image 2

如您所见,在拍摄第二张照片之前,会从场景中移除百威瓶。

这些照片是从针孔相机(iPhone)拍摄的,而且,棘手的部分是我手持相机,因此不能保证图像完美地按像素对齐,所以简单的减去 - 阈值方法不起作用。

然后,我决定使用OpenCV中的findHomographywarpPerspective执行图片注册,这是结果图片:

Img 3

这个图像使用我从findHomography获得的矩阵进行扭曲,这有点改善了对齐质量,但仍然没有对齐,所以我可以使用一种简单的方法来删除前景。

所以,最后,我决定实现一个“模糊 - 减”算法:对于image1中的每个像素,我将使用灰度的最小差异来查看image2中的7x7邻居(7 x 7内核?)作为减号的结果,并将结果阈值转换为二进制图像,这就是我所得到的:

Image4

结果仍然不好。请注意瓶子中的白色整体,这是由于前景和背景的灰度值相似而产生的。所以我不知道现在该做什么。

我可以想出两种解决问题的方法,第一种是获得更好的对齐图像,然后简单地减去对;第二种是使用更健壮的方式来提取前景。

有人可以就如何处理这类问题给我一些建议吗?我相信应该有一些最先进的算法或处理流水线,但谷歌搜索后,我什么都没得到。

我正在使用OpenCV和C ++,如果你能告诉我如何使用这些工具来实现它,那就太棒了。

提前非常感谢!

4 个答案:

答案 0 :(得分:4)

问题不在您的算法中。您遇到问题,因为两个场景不是从完全相同的角度拍摄的,如下面的动画所示。这种微小的差异突出了减法中的边缘。

enter image description here

您需要静态相机才能应用此方法。

答案 1 :(得分:1)

我建议在掩码中使用数学形态学来摆脱伪影。 尝试应用开启和关闭来摆脱黑色和白色的小区域。

Mathematical Morphology

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);

maskopenclose.jpg

答案 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

相关问题