此刻坐标往往都是整数出现,而在真实的世界中坐标多数时候都不是整数,假设我们计算出来的角点位置P(34, 189)而实际上准确角点位置是P(34.278, 189.706)这样带小数的位置,而这样的准确位置寻找过程就叫做子像素定位或者亚像素定位。这一步在SURF与SIFT算法中都有应用而且非常重要。常见的亚像素级别精准定位方法有三类:
亚像素级角点检测是在一般角点检测基础之上将检测出的角点精确到亚像素级
因此需要先使用harris或shi-tomasi检测出角点,然后再调用cv::cornerSubPix()
原图像 (I): 在这幅图像里,我们希望找到一块和模板匹配的区域
为了确定匹配区域, 我们不得不滑动模板图像和原图像进行 比较 :
通过 滑动, 我们的意思是图像块一次移动一个像素 (从左往右,从上往下). 在每一个位置, 都进行一次度量计算来表明它是 “好” 或 “坏” 地与那个位置匹配 (或者说块图像和原图像的特定区域有多么相似).
对于 T 覆盖在 I 上的每个位置,你把度量值 保存 到 结果图像矩阵 (R) 中. 在 R 中的每个位置 (x,y) 都包含匹配度量值:
上图就是 TM_CCORR_NORMED 方法处理后的结果图像 R . 最白的位置代表最高的匹配. 正如您所见, 红色椭圆框住的位置很可能是结果图像矩阵中的最大数值, 所以这个区域 (以这个点为顶点,长宽和模板图像一样大小的矩阵) 被认为是匹配的.
距离变换的基本含义是计算一个图像中非零像素点到最近的零像素点的距离,也就是到零像素点的最短距离。因此可以基于距离变换提取手掌重心。
canny边缘检测:高斯滤波、计算梯度和方向、非极大值抑制、双阈值处理、抑制孤立阈值点
边缘检测之Canny https://www.cnblogs.com/techyan1990/p/7291771.html
- 用Canny算法进行边缘检测,得到边界二值图
- 用Sobel算子计算原图的梯度
- 遍历边缘二值图中的非0点,沿着梯度方向和反方向画线段(梯度方向为圆弧的法线方向,即半径方向),线段的起点和长度由参数允许的半径区间决定。将线段经过的点在累加器中记数
- 对累计器中的点从大到小排序,记数越大越有可能成为圆心,优先估计半径
- 计算所有边界图中的非0点离圆心的距离,并从小到大排序
- 从小半径r开始,距离相差在一个小量范围内的点,都认为是同一个圆,记数属于该半径r的非0点数,记为n
- 尝试放大半径,同样记数改半径的点数
- 判断两个半径孰优孰劣的依据——点的线密度(点数n/半径r),密度越高,半径的可信度越大
- 重复以上步骤,直至半径超过参数允许的范围,从而得到最优半径
OpenCV霍夫梯度找圆算法 https://blog.csdn.net/hhyh612/article/details/54947205
仿射变换:affine transformation:平移、旋转、缩放
直方图均衡化:灰度值均衡化,修改灰度值间隔的大小,调用equalizeHist()函数
梯度操作:膨胀图-腐蚀图,将团块的边缘凸显出来,可以利用形态学梯度来保留物体的边缘轮廓
阈值化:可以视为最简单的图像分割,Threshold(),adaptiveThreshold()函数
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/histograms/template_matching/template_matching.html