标签由上一篇文章中描述的神经网络预先分段和部署。
胶合通常如何工作?您需要拍摄两张重叠的图片,计算相互偏移,然后将一张叠加在另一张之上。听起来很简单,但让我们逐一讲解每个步骤。
要计算相互偏移,您需要找到两个图像中都存在的一些对象,并以某种方式计算点从一个图像到另一个图像的转换。可以用转换矩阵表示此偏移,其中矩阵的元素一次编码多个转换-缩放,平移和旋转。维基百科上
有一张很棒的表格,显示了如何以及哪些元素影响转换。
从下面的图片中可以看到,有足够多的常见对象:
但是所选对象存在问题-它们很难通过算法检测。取而代之的是,通常会寻找更简单的对象-所谓的“角”,它们也是描述符(“描述符”,“功能”)。
OpenCV文档中有一篇很棒的文章介绍了为什么要拐角-简而言之,定义一条线很容易,但是它只能给您一个坐标。因此,还必须检测第二(非平行)线。如果它们会聚在一个点上,那么该位置非常适合查找描述符,它也是一个角(尽管实际的描述符在单词的几何意义上不是角)。
查找描述符的算法之一是SIFT(尺度不变特征变换)。尽管它是在1999年发明的,但由于它的简单性和可靠性而非常受欢迎。该算法已申请专利,但该专利已于今年春天到期(2020年)。但是,他们没有设法将其转移到OpenCV主版本中,因此您需要使用特殊的非免费版本。
因此,让我们在两个图像中找到相似的角:
sift = cv2.xfeatures2d.SIFT_create()
features_left = sift.detectAndCompute(left_image, None)
features_right = sift.detectAndCompute(left_image, None)
让我们使用Flann匹配器-即使描述符数量很大,它也具有良好的性能。
KNN = 2
LOWE = 0.7
TREES = 5
CHECKS = 50
matcher = cv2.FlannBasedMatcher({'algorithm': 0, 'trees': TREES}, {'checks': CHECKS})
matches = matcher.knnMatch(left_descriptors, right_descriptors, k=KNN)
logging.debug("filtering matches with lowe test")
positive = []
for left_match, right_match in matches:
if left_match.distance < LOWE * right_match.distance:
positive.append(left_match)
黄线显示匹配器如何找到匹配项。
您可以清楚地看到,只有大约一半的正确匹配。但是,如果正确的匹配总是给出相同的变换,那么不正确的匹配将显示一个混乱的新方向。那些。从理论上讲,它们可以彼此分开:
RANSAC是找到正确变换的算法之一。当您想从噪声中分离出好的值时,这种算法非常有用-的确如此。
幸运的是,OpenCV已经具有使用RANSAC通过匹配找到转换矩阵的功能,即实际上,您无需编写任何内容。
让我们使用estimateAffinePartial2D函数来查找以下转换:旋转,缩放和平移(4个自由度)。
H, _ = cv2.estimateAffinePartial2D(right_matches, left_matches, False)
找到变换矩阵后,我们可以变换正确的图像进行胶合。
左片段:
右片段:
首先,当将相交的每个像素作为平均值计算时,让我们使用将片段粘合在一起的最简单方法。不幸的是,结果如此一般-图像明显翻倍,尤其是在胶合线附近。
在动画中,两个帧之间的差异更清晰可见:
这不足为奇-这些照片是从不同角度拍摄的,神经网络对它们的旋转也略有不同,因此,差异很小。
对于无缝粘合,必须补偿非线性变形。可以将失真表示为与原始图像具有相同分辨率的矢量场,仅在颜色上代替位移,而在每个像素中对位移进行编码。该矢量场称为“光流”。
通常,有多种计算光流的方法-其中一些直接内置在OpenCV中,并且还有特殊的神经网络。
在我们的案例中,我将省略特定的技术,但将发布结果:
但是补偿必须与两个片段成比例地进行。为此,我们将其分为两个矩阵:
左侧的片段将以从左到右的递增方式进行补偿,而右侧的片段将被递增-反之亦然。
现在,两个片段几乎完全重叠:
现在,叠加层在几何上是正确的,但是我们观察到接缝处的亮度出现了非常明显的跳动:
如果用平均值代替梯度而不是平均值,则可以很容易地解决此问题:
通过这种方法,接缝根本不可见:
原则上,还有其他粘合技术,例如,多波段混合,用于拼接全景图,但它们不适用于文本-只有光流补偿才能完全消除文本上的重影。
现在我们粘贴整个图像:
最终版本:
进一步的改进可能是对阴影效果(图像的右侧)的补偿,甚至是颜色和对比度的更多后期处理。您还可以看到整体几何图形略有受损-右侧的线略有爬升。从理论上讲,也可以通过添加全局缩放校正来解决此问题,但这也不是一件容易的事。
我们检查了粘合的工作原理,这里以REST API的形式提供了现成的解决方案,我还建议您查看以下链接: