网站建设电话多少,wordpress建站双语,ii6创建网站,福永电子烟网站开发最近赶时髦#xff0c;看了一些智能优化算法如蚁群算法#xff0c;还有机器学习的一些东西#xff0c;就想着怎么把这些先进的东西用在图像配准中。头脑风暴了一下#xff0c;觉得在已经检测到两幅图像的特征点的基础上#xff0c;就如何对它们进行匹配似乎有优化的空间。…最近赶时髦看了一些智能优化算法如蚁群算法还有机器学习的一些东西就想着怎么把这些先进的东西用在图像配准中。头脑风暴了一下觉得在已经检测到两幅图像的特征点的基础上就如何对它们进行匹配似乎有优化的空间。
匹配的过程其实是找对应点的过程对应点指的是在各自图像中相对位置一样的点如图像进行刚性变换之后图像点在坐标虽然改变了但是它们之间的相对位置是不会变的三角形的直角对应直角点锐角对应锐角点。但是如何在对应点坐标之间建立关系呢看代码的时候看到利用 cv::perspectiveTransform(dstPoints, dstPoints, homography.inv())将实验图像的特征点变换到参考图像同一个坐标系中再进行欧式距离的计算这个暗含了估计的变换矩阵是正确的而且这其实是为了衡量变换矩阵估计准确性的标准并不是为了得到匹配对。这才想起来其实不用太多考虑坐标、坐标系因为我们检测得到特征点更准确说是描述子描述子具有旋转不变性。这个描述子已经把特征点的坐标、邻域的梯度包括方向、大小都包含了。得到描述子的过程就包含了将坐标轴旋转为关键点方向。所以直接比较128维描述子对SIFT来说就可以得到哪些特征点是对应的。这里又有两种策略一种是穷举法https://docs.opencv.org/2.4/modules/features2d/doc/common_interfaces_of_descriptor_matchers.html#bfmatcher一种是快速最近邻搜索包(Fast_Library_for_Approximate_Nearest_Neighbors)https://docs.opencv.org/2.4/modules/features2d/doc/common_interfaces_of_descriptor_matchers.html#flannbasedmatcher。因为描述子一般都是高维向量所以要优化的话这会是一个值得关注的地方。
看看match具体是怎么实现的。之前博客中提到的图像配准算法比较对matchFeatures进行了重载
void FeatureAlgorithm::matchFeatures(constDescriptors train, const Descriptors query, Matches matches)const
{matcher-match(query, train, matches);
}void FeatureAlgorithm::matchFeatures(constDescriptors train, const Descriptors query, int k,std::vectorMatches matches) const//matchFeatures的重载分别利用穷举和knn参数有int型k就是knn
{assert(knMatchSupported);matcher-knnMatch(query, train, matches, k);
}
matcher是OpenCV中的feature2 dmodule中的cv::DescriptorMatcher。在feature2d中对https://docs.opencv.org/2.4/modules/features2d/doc/features2d.htmlmatch也进行了重载这里matchFeatures用的是match的第一种变形把train descriptors当做变量输入函数并且利用穷举法搜索。matchFeatures的第二个重载用的是k近邻点算法从query集合中的每个描述子中找到k个最好的匹配对返回k个距离逐渐增大的匹配对k通常不大于20。这与通常意义上的匹配是不一样的这里不是一一对应的而是一对多。
KNN中是依靠周围K个已知类别点来判断待分类点的类别的就像是物以类聚这要求有一个先验知识即一个数据和标签已知的训练集。k个近邻点中哪一类更多那么待判断点就更有可能属于那一类。那么具体在特征点匹配过程中如何使用KNN算法呢特征点匹配和数据库查、图像检索本质上是同一个问题都可以归结为一个通过距离函数在高维矢量之间进行相似性检索的问题如何快速而准确地找到查询点的近邻不少人提出了很多高维空间索引结构和近似查询的算法。https://blog.csdn.net/v_july_v/article/details/8203674k-d树本质是一种平衡二叉树就是对搜索空间进行不重叠划分实现k近邻算法的一种方法。
结合Rob-Hess的源码和参考3用建立大顶堆的思想实现数据中最小的k个数据的查找。即用容量为k的最大堆存储最小的k个数此时k1k2...kmaxkmax设为大顶堆中最大元素。遍历一次数列n每次遍历一个元素x与堆顶元素比较xkmax更新堆用时logk否则不更新堆。这样下来总费时On*logk。
那么这里还有一个问题就是在匹配过程中我们只知道一系列高维数据但是是对一个query在train中找距离最近的前k个我们还需要先求query和所有train特征点之间的距离若利用KD树的搜索策略应该不会有重复计算。距离的表示有很多种方法参考2中也做了一番整理常见的有欧式距离、曼哈顿距离城市街区距离、切比雪夫距离国际象棋国王坐标差最大值、马氏距离协方差距离适合分类、夹角余弦距离根据向量方向重合度判断相似性用于文本分类的词袋模型、杰卡德相似系数两个集合A和B的交集元素在AB的并集中所占的比例。距离的选择一是要保证准确性即保证不对应的特征点的距离尽可能大相对应的特征点距离尽可能小另一方面要使运算量小。Rob-Hess采用了欧式距离作为比较描述子的标准。对图像1中的每一个特征点利用BBF找到了最近邻的2个对应点并分别计算出了它们之间的欧式距离。最近邻小于次近邻的0.49时把最近邻作为对应点。
针对高维数据处理有一个方法是PCA主成分分析。还有核机制
Ng所举的例子是利用单幅图像重构了场景的3D模型。如果可以实现3D模型那么我们就完全可以将图像配准到任何视角而不是简单的透视变换。
还有一种思路是将特征点聚类找到图像中的主体即将主体内容和背景分离开来。将主体的中心点数据中心化和边界找出来。
Flann
Reference
1.https://blog.csdn.net/icvpr/article/details/8491369
2.https://blog.csdn.net/v_july_v/article/details/8203674
3.https://blog.csdn.net/v_JULY_v/article/details/6370650