点击上方“AI算法与图像处理”,选择加"星标"或“置顶”
重磅干货,第一时间送达
研究好玩又有用的技术第 008 期
在学习中发现快乐,在应用找到价值。这是我第八期分享图像技术应用的文章。
前七期欢迎阅读和分享:
第一期《
第二期《》
第三期《》
第四期《》
第五期《用python和opencv检测图像中的条形码》
第六期《》
第七期《》
概述
作者:Thalles Silva 编译:AI算法与图像处理
图像拼接是计算机视觉中最成功的应用之一。如今,很难找到不包含此功能的手机或图像处理API。
在这篇文章中,我们将讨论如何使用Python和OpenCV执行图像拼接。鉴于一对共享一些共同区域的图像,我们的目标是“缝合”它们并创建全景图像场景。
在整篇文章中,我们将介绍一些最着名的计算机视觉技术。这些包括:
关键点检测
局部不变描述符(SIFT,SURF等)
特征匹配
使用RANSAC进行的旋转估计(Homography estimation)
透视畸变(Perspective warping)
我们探索了许多特征提取算子,如SIFT,SURF,BRISK和ORB。你可以使用这款Colab笔记本,甚至可以用你的照片试试。[这里我已经调试好源码并上传到github上面]
给定一对像上面那样的图像,我们想要把它们拼接起来创建一个全景场景。值得注意的是,两个图像都需要共享一些共同的区域。
此外,即使图片在以下一个或多个方面存在差异,我们的解决方案也必须强大:
Scaling
Angle
Spacial position
Capturing devices
朝这个方向迈出的第一步是提取一些感兴趣的关键点和特征。但是,这些功能需要具有一些特殊属性。
我们首先考虑一个简单的解决方案。
关键点检测
一开始可能使用简单些的方法,诸如使用Harris Corners之类的算法提取关键点。然后,我们可以尝试根据欧几里德距离之类的相似度量来匹配相应的关键点。我们知道,角点(corner)有一个很好的属性:它们对旋转是不变的。 这意味着,一旦我们检测到一个角点,如果我们旋转图像,那个角点仍将存在。
但是,如果我们旋转然后缩放图像怎么办?在这种情况下,我们会很难,因为角点不是规模不变的。也就是说,如果我们放大图像,先前检测到的角可能会变成一条线!
总之,我们需要对旋转和缩放不变的特征。这就是SIFT,SURF和ORB等更强大的方法的用武之地。
关键点和描述子
像SIFT和SURF这样的方法试图解决角点检测算法的局限性。
通常,角点检测器算法使用固定大小的内核来检测图像上的感兴趣区域(角点)。很容易看出,当我们缩放图像时,这个内核可能会变得太小或太大。
为了解决这个限制,像SIFT这样的方法使用高斯差分(DoD)。我们的想法是在同一图像的不同比例版本上应用DoD。它还使用相邻像素信息来查找和细化关键点和相应的描述子。
首先,我们需要加载2个图像,查询图片和训练图片。最初,我们首先从两者中提取关键点和描述符。我们可以通过使用OpenCV detectAndCompute()函数一步完成。请注意,为了使用detectAndCompute(),我们需要一个关键点检测器和描述符对象的实例。它可以是ORB,SIFT或SURF等。另外,在将图像馈送到detectAndCompute()之前,我们将它们转换为灰度。
def detectAndDescribe(image, method=None):
"""
Compute key points and feature descriptors using an specific method
"""
assert method is not None, "You need to define a feature detection method. Values are: 'sift', 'surf'"
# detect and extract features from the image
if method == 'sift':
descriptor = cv2.xfeatures2d.SIFT_create()
elif method == 'surf':
descriptor = cv2.xfeatures2d.SURF_create()
elif method == 'brisk':
descriptor = cv2.BRISK_create()
elif method == 'orb':
descriptor = cv2.ORB_create()
# get keypoints and descriptors
(kps, features) = descriptor.detectAndCompute(image, None)
return (kps, features)
使用SIFT检测关键点和描述子
使用SURF检测关键点和描述子
使用BRISK和汉明距离检测关键点和描述子
使用ORB和汉明距离检测关键点和描述子
特征匹配
Brute Force Matcher(暴力匹配法)
KNN(k-最近邻)
def createMatcher(method,crossCheck):
"Create and return a Matcher Object"
if method == 'sift' or method == 'surf':
bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=crossCheck)
elif method == 'orb' or method == 'brisk':
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=crossCheck)
return bf
注意,k的值必须是由用户预先定义的。如我们预期的那样,KNN提供了一个更的的候选特征集合。但是,我们需要确保所有这些匹配对在进一步发展之前都是健壮的。
比率测试(Ratio Testing)
为了确保KNN返回的特征具有良好的可比性,SIFT论文的作者提出了一种称为比率测试(Ratio Testing)的技术。基本上,我们迭代KNN返回的每个对并执行距离测试。对于每对特征(f1,f2),如果f1和f2之间的距离在一定比例内,我们保留它,否则,我们将它丢弃。此外,必须手动选择比率值。
使用KNN和RIFT测试对SIFT特征进行特征匹配
在SIFT功能上使用Brute Force Matcher进行特征匹配
这种转换称为Homography matrix(单应性矩阵)。简而言之,如果Homography是3x3矩阵,可用于许多应用,例如相机姿态估计,透视校正和图像拼接。如果Homography是2D变换。它将点从一个平面(图像)映射到另一个平面。让我们看看我们是如何得到它的。
Estimating the Homograph
我们可以看到线性回归模型很容易受到异常值的影响。那是因为它试图减少平均误差。因此,它倾向于支持最小化从所有数据点到模型本身的总距离的模型。这包括异常值。
相反,RANSAC仅将模型拟合到被识别为内点的点子集上。
这个特性对我们的用例非常重要。在这里,我们将使用RANSAC来估计Homography矩阵。事实证明,Homography对我们传递给它的数据质量非常敏感。因此,重要的是有一个算法(RANSAC)可以过滤明显不属于数据分布的点。
最小二乘与RANSAC模型拟合的比较。请注意数据中的大量异常值
# Apply panorama correction
width = trainImg.shape[1] + queryImg.shape[1]
height = trainImg.shape[0] + queryImg.shape[0]
result = cv2.warpPerspective(trainImg, H, (width, height))
result[0:queryImg.shape[0], 0:queryImg.shape[1]] = queryImg
plt.figure(figsize=(20,10))
plt.imshow(result)
plt.axis('off')
plt.show()
谢谢阅读!
效果图
demo 2
可能遇到bug
可能存在的报错
(1)Qt 链接报错 version `Qt_5' not found]
python3: relocation error: /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5: symbol _ZN20QPlatformIntegration11screenAddedEP15QPlatformScreenb version Qt_5_PRIVATE_API not defined in file libQt5Gui.so.5 with link time reference
解决方案:https://www.cnblogs.com/sunchaothu/p/9962675.html
(2)AttributeError: module 'cv2.cv2' has no attribute 'xfeatures2d'
需要回退版本到3.4.2.16,记得要先卸载之前安装好的opencv-python
解决方案:https://blog.csdn.net/weixin_43167047/article/details/82841750
代码:https://github.com/DWCTOD/AI_study
原文链接:
https://towardsdatascience.com/image-panorama-stitching-with-opencv-2402bde6b46c
有热门推荐?
1.
2.
3.
加群交流
欢迎小伙伴加群交流,目前已有交流群的方向包括:AI学习交流群,目标检测,秋招互助,资料下载等等;
加群可扫描并回复感兴趣方向即可