96SEO 2026-02-20 07:41 10
看到有博文[1]指出#xff0c;在速度方面SIFTSURFBRISKFREAKORB#xff0c;在对有较大模糊的图像配准时其次对不同特征提取器/匹配器效率进行进一步实验探究。

看到有博文[1]指出在速度方面SIFTSURFBRISKFREAKORB在对有较大模糊的图像配准时BRISK算法在其中表现最为出色后面考虑选取其中SIFT、BRISK、ORB三种算法进行验证。
在前文【图像配准】SIFT算法原理及二图配准拼接已经对此做过分析这里不作赘述。
BRISK算法是2011年ICCV上《BRISK:Binary
BRISK算法通过利用简单的像素灰度值比较进而得到一个级联的二进制比特串来描述每个特征点之后采用了邻域采样模式即以特征点为圆心构建多个不同半径的离散化Bresenham同心圆然后再每一个同心圆上获得具有相同间距的N个采样点。
BRIEF)是OpenCV实验室开发的一种特征检测与特征描述算法将
特征描述结合并进行了改进具有尺度不变性和旋转不变性对噪声有较强的抗干扰能力[4]。
ORB算法在图像金字塔中使用FAST算法检测关键点通过一阶矩计算关键点的方向使用方向校正的BRIEF生成特征描述符。
Alcantarilla等人提出了AKAZE(Accelerated-KAZE)算法即加速KAZE算法加速了非线性尺度空间的构造效率较KAZE有所提升以各向异性的非线性滤波来构造尺度空间将整个尺度空间进行分割利用局部自适应分级获得细节和噪声保留较多的边缘细节信息但该算法关键点检测能力不足且鲁棒性不强[5]。
无论何种算法图像配准无非是这样几个步骤-图像灰度化-提取特征-构建匹配器-计算变换矩阵-图像合并。
以下代码主要参考了这个仓库https://github.com/799034552/concat_pic
这里进行了一个判断判断传入的是否是图像的文本路径这一步主要是为了后面多图拼接的便利性因为后面多图拼接会把拼接好的部分图像直接放在内存中这里若不是路径就直接赋值给变量相当于用整张大图去和另外一张小图去做拼接。
OpenCV对各种算法都进行了较好的封装这里主要对比测试了siftbriskorbakaze这几种算法所用opencv-python版本为4.7.0值得注意的是OpenCV4以后的版本cv2.SURF_create()无法使用只能用老版本的cv2.xfeatures2d.SURF_create()来实现SURF因此这里没有对SURF算法进行比较测试。
descriptor.detectAndCompute(image,
None这里比较了两种匹配器一种是暴力匹配器(BFMatcher)函数接口为cv2.BFMatcher主要有下面两个参数可以设置
NORM_L1L1范数曼哈顿距离。
NORM_L2L2范数欧式距离。
NORM_HAMMING汉明距离。
NORM_HAMMING2汉明距离2对每2个比特相加处理。
crossCheck交叉匹配选项可选项默认为False若为True即两张图像中的特征点必须互相都是唯一选择
注对于SIFT、SURF描述符推荐选择欧氏距离L1和L2范数对于ORB、BRISK、BRIEF描述符推荐选择汉明距离NORM_HAMMING对于ORB描述符当WTA_K3或4时推荐使用汉明距离NORM_HAMMING2。
使用快速近似最近邻搜索算法寻找FlannBasedMatcher接受两个参数index_params和search_params
index_params可用不同的数值表示不同的算法有下表这些可选项(表中数据来源文章[7])
crossCheck):不同的方法创建不同的匹配器参数参数释义BFMatcher暴力匹配器NORM_L2-欧式距离NORM_HAMMING-汉明距离crossCheck-若为True即两张图像中的特征点必须互相都是唯一选择if
cv2.BFMatcher(cv2.NORM_HAMMING,
crossCheckcrossCheck)index_params
cv2.FlannBasedMatcher(index_params,
bf二者的区别在于BFMatcher总是尝试所有可能的匹配从而使得它总能够找到最佳匹配这也是Brute
而FlannBasedMatcher中FLANN的含义是Fast
Neighbors从字面意思可知它是一种近似法算法更快但是找到的是最近邻近似匹配所以当我们需要找到一个相对好的匹配但是不需要最佳匹配的时候往往使用FlannBasedMatcher。
当然也可以通过调整FlannBasedMatcher的参数来提高匹配的精度或者提高算法速度但是相应地算法速度或者算法精度会受到影响[8]。
特征匹配也有两种方式可以直接进行暴力检测也可以采用KNN进行检测不同检测方式的代码如下
bf.knnMatch(np.asarray(featuresA,
ratio:matches.append(m)print(fknn匹配的特征点数量:{len(matches)})end_time
匹配完关键点后就可以计算视角变换矩阵然后一幅图不动另一幅图进行透视变换这里的具体方式和前文较为类似。
在做透视变换时往往会采取一个比较大的背景以确保图片能够不遗漏的拼接上去比如这里图片的尺寸设定为(imageA.shape[1]
之前的文章提到过一种通过膨胀方式来找到最大内接矩形这里的代码处理方式更为巧妙直接采用像素点搜索的方式找到图像的最大外接矩形。
由于无法提前知道两张图片的位置关系对于透视变换可能图片会映射到整个选取区域的左边这样的话无法正常显示图片因此要对透视变换后的图片进行面积检查如果比原来的图片面积小太多就用另一张图片来进行透视变换[9]。
图像融合这里处理得也比较巧妙对图片接壤部分选取最大值这样确保了色调的统一性。
合并图片-相同的区域选取最大值从而实现融合result[0:imageB.shape[0],
None:matchCountList.append(matchCount)
matchCountList存储两图匹配的特征点resultList.append(result)indexList.append(i)isHas
matchCountList.index(max(matchCountList))nowPic
resultList[index]isHandle[indexList[index]]
descriptor.detectAndCompute(image,
crossCheck):不同的方法创建不同的匹配器参数参数释义BFMatcher暴力匹配器NORM_L2-欧式距离NORM_HAMMING-汉明距离crossCheck-若为True即两张图像中的特征点必须互相都是唯一选择if
cv2.BFMatcher(cv2.NORM_HAMMING,
crossCheckcrossCheck)index_params
cv2.FlannBasedMatcher(index_params,
bf.knnMatch(np.asarray(featuresA,
ratio:matches.append(m)print(fknn匹配的特征点数量:{len(matches)})end_time
合并图片-相同的区域选取最大值从而实现融合result[0:imageB.shape[0],
None:matchCountList.append(matchCount)
matchCountList存储两图匹配的特征点resultList.append(result)indexList.append(i)isHas
matchCountList.index(max(matchCountList))nowPic
resultList[index]isHandle[indexList[index]]
handleMulti(./input/foto2B.jpg,
2]])else:print(没有找到对应特征点,无法合并)end_time_all
特征提取算法匹配器特征点个数时间(s)siftbf14438463briskbf964831.83orbbf10920.57akazebf487226.58briskflann500024.71orbflann5022.02
从速度上来说orb算法是最快的比sift这种古老的算法快了一个数量级。
但是通过观察生成的图像质量会发现orb的图像会比较模糊拼接质量不如其它算法高增加速度的同时会牺牲部分质量。
akaze算法速度和质量和brisk相差不大flann匹配器比bf匹配器通常情况下速度更快
因此后续实验可以首选brisk算法flann匹配器的组合方式。
另外说明上面这些实验参数并没有针对性的进行调参基本使用默认参数若进行调优可能会结果会发生一定变化。
此示例中默认图像位置是未知的而在遥感图像中可以通过gps坐标来确定图像的大致方位后续考虑引进gps坐标构建图像排布坐标系从而加快配准速度。
此示例中多图拼接是直接用大图和小图去做配准效率并不是太高。
后续可能可以结合gps信息从大图中挖出一部分小图来做配准。
https://blog.csdn.net/weixin_41063476/article/details/90407916
基于视觉的特征匹配算法持续更新https://zhuanlan.zhihu.com/p/147325381?ivk_sa1024320u
https://blog.csdn.net/weixin_40196271/article/details/84143545
https://blog.csdn.net/youcans/article/details/128033070
https://mp.weixin.qq.com/s?__bizMzIxOTY4NDQ1MAmid2247493784idx1sn65676fc368e6b4fa62c965a996f956ef
https://blog.csdn.net/youcans/article/details/128253435
https://zhuanlan.zhihu.com/p/520575652
https://blog.csdn.net/simonyucsdy/article/details/112682566
https://blog.csdn.net/qq_30111427/article/details/121127233
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback