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

13

我正在尝试跟踪一个玩具车的运动。我已经录制了一些视频,现在正在尝试计算旋转。

我的问题是从物体表面提取特征由于运动模糊而变得非常具有挑战性。下面的图像显示了从视频帧中裁剪出来的图像。失真发生在水平线上。在物体不移动时,不会出现这种失真。

图像展示了小车在穿过图像帧的对角线路径前进时的扭曲图像。

enter image description here

我尝试了基于中位数和方差的维纳滤波器,但它并没有多大改善。它只给了我一张平滑的图像,就像应用了高斯模糊。

我应该进行什么类型的增强以获得更好的图像?

视频-720 x 576帧-25fps

5个回答

10
从提供的图片看,您似乎需要对视频进行去交错处理而不仅仅是尝试过滤现有内容;我记得通过仅取每隔一行扫描线,然后进行调整大小来实现这一点。
我找到了一个非常棒的网站,介绍去交错处理的方法,以防您想了解其他可能性:http://www.100fps.com/ (哦,我没有仔细检查图片,所以可能存在其他交错方案,而不仅仅是每隔一行;在这种情况下,我的第一个答案将无法正常工作。同时这也意味着您将失去一些分辨率,但这只是交错视频的本质...)

那个链接非常有帮助。看起来我的图片有问题。我得再搜索一下 :) - Niroshan

2

考虑到您的摄像头输出隔行扫描视频,最好只使用视频的一个场。可以只使用图像的偶数行或奇数行。图像会被压缩,但不会混合两个图像。


1

是的,那张图片需要去交错。由于线性运动而导致的“畸变”纠正是另一回事,您需要根据车辆速度、相机距离和快门速度进行线性方向滤波。 您必须首先计算给定条件(上述条件表示捕获开始和结束时取同一点之间的偏差或距离)的脉冲响应,然后应用反滤波。如果使用Matlab,您可能需要使用一些过滤或图像处理工具包,这将很容易。


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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接