Features Analysis 特征分析
特征提取
在图像特征比对过程中,首先需要对进行比对的两张图进行分别的特征提取.
顶点提取 Harris Detector
选取特征点时很自然地想到要提取角的顶点.不过究竟是为什么呢?其实是因为两张图上点之间的对应关系很好确定;如果是边上的点,只能确定边的方向关系,而两张图的尺度(缩放)却无法确定;如果选取的是平面中的任意一点,则方向和尺度都无法确定.
那么如何让计算机检测到这些特殊点呢?
比较常用的方法是Harris Detector
,具体原理见老师PPT😈.OpenCV
中给我提供了CornerHarris
函数实现这个功能
程序代码
1 | #! /usr/local/bin/python |
运行结果
运行后发现效果并不是很好,调整blockSize,kSize,可以获得更好一点的效果
原始图像
Harris Detector图像
SIFT 尺度不变的特征变换
提取两张图片中的同一特征时,我们通常理所应当地认为,同一区域中的均值和最大值应当是一致的,但实际上,当两张图片的尺度差异很大时,选取某一scale后,计算得到的分布结果可能会有较大的差别.
通过拉普拉斯变换输出最强的值来确定合适尺度是一种较好的方法
SIFT则是将图像切分成4×4块,分别计算每块在8个方向上的梯度,形成直方图,能较大程度地克服旋转和光照的影响.它在不同的尺度下用高斯滤波器(Gaussian filters)进行卷积(convolved),然后利用连续高斯模糊化影像差异来找出关键点.
OpenCV中给出了直接建立SIFT detector检测特征点的函数(注意:opencv-contrib-python==3.4.2.17库而opencv-python库中没有这个模块)
程序代码
1 | # 接前面代码 |
运行结果
Hough Transform 直线检测
OpenCV
中提供了cv2.HoughLines
函数进行Hough变换.
关于Hough Transform的原理,可以参看下面这个网页.实际上Hough不止能够检测直线,只要是能用数学形式表达的形状都可以进行检测.
在HoughLines函数中,直线采用
的形式表示,其返回值为 构成的数组
程序代码
1 | #! /usr/local/bin/python |
运行结果
阈值100,精度(1,1°)
阈值200,精度(1,1°)
阈值300,精度(1,1°)
阈值300,精度(2,2°)
阈值200,精度(2,2°)
Image Stitching 图像拼接
对两幅图像分别进行(稳定一致的)特征提取后,可以根据特征点的比对进行图像拼接的工作,具体步骤包括:
- 特征检测 SIFT
- 特征匹配
- 确定对应关系
- 图像几何变换
- 图像拼接
比较详细的教程可以参考
https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_matcher/py_matcher.html
https://www.cnblogs.com/xingnie/p/10230278.html
程序代码
1 | #! /usr/local/bin/python |
运行效果
图像1
图像2
特征点匹配
拼接图像