如何从图像中消除由于运动引起的失真

时间:2011-08-07 09:03:50

标签: image-processing opencv computer-vision motion-blur

我正试图追踪玩具车的动作。我录制了很少的视频,现在正试图计算旋转。

我的问题是从物体表面提取特征是由于运动模糊而退出挑战。下图显示了视频帧中的裁剪图像。失真发生在水平线上。当对象移动时,会出现此图像中出现的失真。当物体不移动时,没有失真。

图像显示汽车在对角线路径上向前移动时图像失真的图像。

enter image description here

我尝试了一个基于中位数和方差的维纳过滤器,但它没有做太多改进。它只给了我一个平滑的图像,就像在它上面应用了高斯模糊一样。

我应该采取哪些类型的增强措施来获得更好的图像?

视频 - 720 x 576帧 - 25fps

5 个答案:

答案 0 :(得分:9)

从图片中可以看出,您需要对视频进行去交错,而不是仅仅尝试过滤那里的内容;我记得这样做只需要拍摄所有其他扫描线,然后进行调整以将其重新放回视角。

我找到了一个非常酷的网站,讨论了隔行扫描,以防你想看看是否还有其他可能性:

http://www.100fps.com/

(哦,我没有仔细检查过图像,所以有可能还有其他隔行扫描方案,而不是其他每一行;在这种情况下,我的第一个答案将无法正常工作。它确实意味着你将失去一些分辨率,但这只是隔行扫描视频的本质......)

答案 1 :(得分:2)

鉴于您的相机输出隔行扫描视频,您最好使用视频的一个字段。要么只使用图像的偶数行,要么只使用奇数行。图像将被压扁,但您不会将两个图像混合在一起。

答案 2 :(得分:1)

是的,该图像需要逐行扫描。校正由线性运动引起的“失真”是另一回事,您需要根据车辆的速度,到摄像机的距离和闭塞速度进行线性方向滤波。 您必须首先计算给定条件集的脉冲响应(上述条件,表示在捕获的开始和结束时采用的相同点之间的偏差或距离),然后应用逆滤波。您可能需要使用一些过滤或图像处理工具包,如果使用Matlab,它将很容易。

答案 3 :(得分:0)

你有没有尝试过:

deconvblind

按照deconvblind mathworks上的示例操作。它可能适用于您的示例图像。 另一个例子 - Image Restoration

答案 4 :(得分:0)

以下算法是一种非常简单的去隔行方法:

cv::Mat input = cv::imread("img.jpg");
cv::Mat tmp(input.rows/2, input.cols*2, input.type(), input.data);
tmp = tmp.colRange(0, input.cols);
cv::Mat output;
cv::resize(tmp, output, Size(), 1, 2);