SIFT 三线性差值原理与代码分析

2023-05-16

参考了文章:

http://blog.csdn.net/fzthao/article/details/62424271


Jie Pro 在进行特征描述时,讲的非常详细。但未对三线性插值进行阐述。我也是花了好久的时间才慢慢搞懂。有错之处,请指出。

1. 首先需要的几个已知量包括:

     将关键点附近的邻域划分为d*d(Lowe建议d=4)个子区域,每个子区域做为一个种子点,每个种子点有8个方向。每个子区域的大小与关键点方向分配时相同,即每个区域有子像素。

(1)

(2)

(3)

(4) 

其中(3)式在三线性插值作用巨大,待下面具体解释。 (4)式主要对所有圆形区域内的点进行高斯加权,m为梯度值.


由(1-3)式可推知,的取值范围为[-d/2,d/2],为方便计算三线性插值下标从0开始,公式(3) 加了d/2,使(x”,y")的范围为[0,d],而d=4. 因此在水平X轴和垂直Y轴的单位为1的间隔下,共有16个种子点区域(见左上图的 绿色 格子),每个区域的中心点分别为,bin(0,0),b(0,1),...,b(3,3)(见左上图的 蓝色格子 在每个 绿色格子 的中心 交叉点为bin的坐标 )。根据(x”,y")的值确定其最邻近的4个中心点。
   
为什么直方图长度histlen = (d+2)*(d+2)*(n+2)?
因为计算的是每个Pixel对每一个蓝色端点(包含绿色格子的中心点)的影响,所以每一行一共6个端点,每一个列也有6个端点。也就是d+2个点。
如左上图,若(x”,y")距离X轴和Y轴的距离分别为(dr,dc),则另外的几个点分别为 (dr,1-dc),(1-dr,dc),(1-dr,1-dc);
相邻4个中心点的距离:
b1中心点的距离为:(dr,dc)
b2中心点的距离为:(1-dr,dc)
b3中心点的距离为:(dr,1-dc)
b4中心点的距离为:(1-dr,1-dc)
根据权重与距离成反比的原则计算邻近的四个种子点分配的到权重:
即: 用该点对角线方向的矩形面积为该点的权重值
则分配到
               b1的值为: W * (1-dr)*(1-dc)
b2的值为: W * dr*(1-dc)
               b3的值为: W * (1-dr)*dc
b4的值为: W * dr*dc  
考虑到方向,见右上图。
角度转化为比例分量,为do,那么距离其邻近方向的距离为(1-do)。
则点(x”,y") 的W分配的权重如下:
方向2与方向1相邻,比如方向1是[0° 45°) 方向2就是[45° 90°)
分配给b1在方向1上的权重为:  W * (1-dr)*(1-dc)*(1-do) ,  方向2上的权重为:W * (1-dr)*(1-dc) *do
分配给b2在方向1上的权重为:  W * dr*(1-dc) *(1-do) ,       方向2上的权重为:W * dr*(1-dc) *do
分配给b3在方向1上的权重为:  W * (1-dr)*dc *(1-do) ,       方向2上的权重为:W * (1-dr)*dc *do
分配给b4在方向1上的权重为:  W * dr*dc*(1-do) , 方向2上的权重为:W*dr*dc*do
以上为对三线性插值的分步解释。也可以使用公式
进行直接计算。 k,m,n  为0或1.
2.  为什么进行三线性插值?
答:为了减少一个梯度幅值从一个格子漂移(shift)到另一个格子引起的描述子突变,需要对梯度值做三线性插值。也就是根据三维坐标计算距离周围格子的距离,按距离的倒数计算权重,将梯度幅值按权重分配到临近的格子里。
3. 附 zddhub 的一幅图
 
       * 注意: 在(3)式进行计算(x'',y'')时,会减去0.5, 主要是为了平衡之前计算radius时多加的0.5.
  1.     //计算梯度直方图  
  2.     for( k = 0; k < len; k++ )  
  3.     {  
  4.         float rbin = RBin[k];
  5. float cbin = CBin[k];  
  6. //(Ori[k] - ori)重新调整角度,这个时候算是真正的翻转
  7.         float obin = (Ori[k] - ori)*bins_per_rad;  
  8.         float mag = Mag[k]*W[k];  
  9.   
  10. //因为rbin > -1, 所以r0 = cvFloor(rbin)有可能是-1
  11.         int r0 = cvFloor( rbin );  
  12.         int c0 = cvFloor( cbin );  
  13.         int o0 = cvFloor( obin );  
  14.         rbin -= r0;  
  15.         cbin -= c0;  
  16.         obin -= o0;  
  17.   
  18.         //n为SIFT_DESCR_HIST_BINS:8,即将360°分为8个区间  
  19.         if( o0 < 0 )  
  20.             o0 += n;  
  21.         if( o0 >= n )  
  22.             o0 -= n;  
  23.           
  24.   
  25.         // histogram update using tri-linear interpolation  
  26.         // 三线性插值  
  27.         float v_r1 = mag*rbin, v_r0 = mag - v_r1;  
  28.         float v_rc11 = v_r1*cbin, v_rc10 = v_r1 - v_rc11;  
  29.         float v_rc01 = v_r0*cbin, v_rc00 = v_r0 - v_rc01;  
  30.         float v_rco111 = v_rc11*obin, v_rco110 = v_rc11 - v_rco111;  
  31.         float v_rco101 = v_rc10*obin, v_rco100 = v_rc10 - v_rco101;  
  32.         float v_rco011 = v_rc01*obin, v_rco010 = v_rc01 - v_rco011;  
  33.         float v_rco001 = v_rc00*obin, v_rco000 = v_rc00 - v_rco001;  
  34.   
  35. //根据以上公式可得:
  36. // v_rco000 =(1-rbin)*(1-cbin)*(1-obin)
  37. // v_rco001 =(1-rbin)*(1-cbin)*obin

  38. //v_rco010 =(1-rbin)*cbin*(1-obin)
  39. //v_rco011 =(1-rbin)*cbin*obin

  40. //v_rco100 =rbin*(1-cbin)*(1-obin)
  41. //v_rco101 =rbin*(1-cbin)*obin

  42. // v_rco110 =rbin*cbin*(1-obin)
  43. // v_rco111 =rbin*cbin*obin
  44. // 因为r0,c0的范围是[-1, d),所以要先+1
  45.         int idx = ((r0+1)*(d+2) + c0+1)*(n+2) + o0;  
  46.         hist[idx] += v_rco000;   ==> b1关键点
  47.         hist[idx+1] += v_rco001;  
  48.         hist[idx+(n+2)] += v_rco010;   ==> b3关键点
  49.         hist[idx+(n+3)] += v_rco011;  
  50.         hist[idx+(d+2)*(n+2)] += v_rco100; ==> b2关键点  
  51.         hist[idx+(d+2)*(n+2)+1] += v_rco101;  
  52.         hist[idx+(d+3)*(n+2)] += v_rco110;  ==> b4关键点 
  53.         hist[idx+(d+3)*(n+2)+1] += v_rco111;  
  54.     }  
  1.     for( i = 0; i < d; i++ )  
  2.         for( j = 0; j < d; j++ )  
  3.         {  
  4. //i,j各+1,因为存储的边界点不需要统计,只需要统计绿色框中蓝色端点
  5.             int idx = ((i+1)*(d+2) + (j+1))*(n+2);  
  6.             hist[idx] += hist[idx+n];  
  7.             hist[idx+1] += hist[idx+n+1];  
  8.             for( k = 0; k < n; k++ )  
  9.                 dst[(i*d + j)*n + k] = hist[idx+k];  
  10.         } 
     for ( i = 0; i < d+2; i++ )  
  1.     {  
  2.         for( j = 0; j < d+2; j++ )  
  3.             for( k = 0; k < n+2; k++ )  
  4.                 hist[(i*(d+2) + j)*(n+2) + k] = 0.;  
  5.     }  
  6.   
  7.     for( i = -radius, k = 0; i <= radius; i++ )  
  8.         for( j = -radius; j <= radius; j++ )  
  9.         {  
  10.             // Calculate sample's histogram array coords rotated relative to ori.  
  11.             // Subtract 0.5 so samples that fall e.g. in the center of row 1 (i.e.  
  12.             // r_rot = 1.5) have full weight placed in row 1 after interpolation.  
  13.         //根据旋转后的坐标,得到旋转前的坐标
  14.  float c_rot = j * cos_t - i * sin_t;  
  15.             float r_rot = j * sin_t + i * cos_t;  
  16.   
  17. //由于cos_t 和 sin_t除过了hist_width,
  18. //所以这时旋转后的坐标的 c_rot 和 r_rot 的单位直接就是种子点了。
  19. //下面的 rbin 和 cbin 计算的就是种子点的编号。
  20. //种子点的编号从(-1,-1)到(d,d)。减去0.5是为了方便差值时计算权重。  
  21.   
  22. //rbin = r_rot + 1.5
  23. //cbin = c_rot + 1.5
  24. //调整原点位置,如上图的点(0,0)。
  25.             float rbin = r_rot + d/2 - 0.5f;  
  26.             float cbin = c_rot + d/2 - 0.5f;  
  27.             int r = pt.y + i, c = pt.x + j;  
  28.   
  29. //确保旋转前的坐标在有效范围内,然后计算梯度幅值和角度。
  30. //(-1,d)的范围,其实就是上图的蓝色框框里的所有pixel。
  31. //旋转的时候,不会影响梯度幅值,所以可以先计算出来。
  32.             if( rbin > -1 && rbin < d && cbin > -1 && cbin < d &&  
  33.                 r > 0 && r < rows - 1 && c > 0 && c < cols - 1 )  
  34. //超出窗边界或图像边界的点不予考虑。
  35. //注意这里 rbin 和 cbin 的下线都是 -1,也就是说它们可能为负  
  36.             {  
  37.                 float dx = (float)(img.at<sift_wt>(r, c+1) - img.at<sift_wt>(r, c-1));  
  38.                 float dy = (float)(img.at<sift_wt>(r-1, c) - img.at<sift_wt>(r+1, c));  
  39.                 X[k] = dx; Y[k] = dy; RBin[k] = rbin; CBin[k] = cbin;  
  40.                 W[k] = (c_rot * c_rot + r_rot * r_rot)*exp_scale;  
  41.                 k++;  
  42.             }  
  43.         }  
  44.   
  45.     len = k;  
  46. //计算角度
  47.     fastAtan2(Y, X, Ori, len, true); 
  48. //计算幅值
  49.     magnitude(X, Y, Mag, len);  
  50.     exp(W, W, len);  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SIFT 三线性差值原理与代码分析 的相关文章

  • 关于SIFT和SURF介绍

    SIFT xff08 尺度不变特征变换 xff09 关于一些角点检测技术 xff0c 比如 Harris 等 它们具有旋转不变特性 xff0c 即使图片发生了旋转 xff0c 我们也能找到同样的角点 xff0c 但如果进行图像缩放 xff0
  • 机器视觉特征提取介绍:HOG、SIFT、SURF、ORB、LBP、HAAR

    一 概述 这里主要记录自己的一些感悟 xff0c 不是很系统 想要详细系统的理论 xff0c 请参考文末的 图像处理之特征提取 个人不是专业cv工程师 xff0c 很多细节没有深究 xff0c 描述可能不严谨 在总结物体检测算法之前先把基础
  • 机器视觉特征提取介绍:HOG、SIFT、SURF、ORB、LBP、HAAR

    一 概述 这里主要记录自己的一些感悟 xff0c 不是很系统 想要详细系统的理论 xff0c 请参考文末的 图像处理之特征提取 个人不是专业cv工程师 xff0c 很多细节没有深究 xff0c 描述可能不严谨 在总结物体检测算法之前先把基础
  • 基于SIFT的图像Matlab拼接教程

    前言 图像拼接技术 xff0c 将普通图像或视频图像进行无缝拼接 xff0c 得到超宽视角甚至360度的全景图 xff0c 这样就可以用普通数码相机实现场面宏大的景物拍摄 利用计算机进行匹配 xff0c 将多幅具有重叠关系的图像拼合成为一幅
  • SIFT解析(一)建立高斯金字塔

    SIFT Scale Invariant Feature Transform 尺度不变特征转换 在目标识别 图像配准领域具有广泛的应用 下面按照SIFT特征的算法流程对其进行简要介绍对SIFT特征做简要介绍 高斯金字塔是SIFT特征提取的第
  • SIFT解析(二)特征点位置确定

    最近微博上有人发起投票那篇论文是自己最受益匪浅的论文 不少人说是lowe的这篇介绍SIFT的论文 确实 在图像特征识别领域 SIFT的出现是具有重大意义的 SIFT特征以其稳定的存在 较高的区分度推进了诸多领域的发展 比如识别和配准 上一篇
  • SIFT&SURF:“模块'cv2.cv2'没有属性'xfeatures2d'”设置OPENCV_ENABLE_NONFREE CMake ==>解决方案OpenCV 3和OpenCV 4 [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我尝试将 SIFT 和 SURF 函数与 OpenCV 3 和 openCV 4 的某些版本 安装了 opencv contrib python 后 一起使用 pip install
  • OpenCV中无法使用SURF、SIFT

    我正在尝试一个简单的事情 比如 detector cv2 SIFT 并得到这个严重的错误 detector cv2 SIFT AttributeError module object has no attribute SIFT 我不明白 因
  • 使用图像进行相似图像搜索

    我正在开发一个项目 其中将检查两个图像的相似性 例如 Google Image Search by image 我通过 Google 以及包括 stackoverflow 在内的各种网站进行了搜索 并了解了各种技术 例如直方图 筛选 傅里叶
  • 比较存储在 mysql 数据库中的 SIFT 特征

    我目前正在扩展一个用于对图像进行分类的图像库 我想查找重复的图像 转换后的图像以及包含其他图像或包含在其他图像中的图像 我已经测试了 OpenCV 的 SIFT 实现 它工作得很好 但对于多个图像来说会相当慢 太快了 我想我可以提取特征并将
  • 在 OpenCV 3.0 中计算密集 SIFT 特征

    从 3 0 版本开始 DenseFeatureDetector 不再可用 有人可以告诉我如何在 OpenCV 3 0 中计算 Dense SIFT 特征吗 我在文档中找不到它 预先非常感谢您 您可以传递一个列表cv2 KeyPoints t
  • 如何使用 SIFT 和 OpenCV 在图像中搜索目标?

    我正在开发一个简单的扑克牌检测程序 现在我有一个有效的筛选算法here http www aishack in 2010 07 implementing sift in opencv 我在卡片周围创建了一些边界框 然后我在要搜索的卡上使用
  • ValueError:无法将大小为 2 的序列复制到维度为 4 的数组轴

    谁能向我解释一下这个错误来自哪里 这意味着什么 我该如何解决这个问题 也许我的问题太笼统了 抱歉 但我不知道我应该在这里放更多什么 P Error Traceback most recent call last File C test 7
  • SIFT 算法中奇怪的 Octave 值?

    我在 opencv 代码中使用 sift 算法从图像中获取描述符和关键点 我的代码是 Ptr
  • 使用 opencv 从 SIFT 生成百分比相似度分数

    在 python 2 7 x opencv 2 4 9 中使用 SIFT 比较两个图像后 我一直试图找到一种生成相似性得分 以 为单位 的方法 我只能找到在比赛之间画线的例子 我该怎么做呢 Matlab 中有一个相当于 vl ubcmatc
  • 使用 SIFT 搜索图像数据库

    Several https stackoverflow com questions 1612037 comparing images using sift 问题 https stackoverflow com questions 15004
  • 图像检测功能:SIFT、HISTOGRAM 和 EDGE

    我正在致力于使用 3 种不同的功能 即 SIFT HISTOGRAM 和 EGDE 来开发对象分类器 然而 这 3 个特征具有不同的维度向量 例如SIFT 128 维 历史记录 256 现在 由于大小不同 这些特征无法连接成一个向量 我打算
  • LSH 是将向量转换为汉明距离的二进制向量吗?

    我读了一些关于 LSH 的论文 我知道它用于解决近似 k NN 问题 我们可以将算法分为两部分 给定一个向量D尺寸 其中D是大 的任何值 用一组翻译它N where N lt
  • 无法在 Python OpenCV v4.20 中使用 SIFT

    我正在使用 OpenCV v4 20 和 PyCharm IDE 我想使用 SIFT 算法 但我收到这个错误 我在互联网上寻找此错误的解决方案 但没有一个对我有帮助 你知道这个错误的解决办法吗 使用 pip 我可以安装至少 3 4 2 16
  • 筛选提取-opencv

    我正在尝试开始使用 C OpenCv 进行筛选特征提取 我需要使用 SIFT 提取特征 将它们在原始图像 例如一本书 和场景之间进行匹配 然后计算相机姿势 到目前为止我已经找到了这个算法 http opencv itseez com doc

随机推荐

  • CSDN高校俱乐部牵手烟台大学

    4月8日19 xff1a 00 xff0c 烟台大学CSDN高校俱乐部成立仪式暨 amp ldquo 激情与梦想 xff0c 我的程序员之路 amp rdquo amp mdash amp mdash 2011CSDN高校巡回演讲在烟台大学
  • 技术网站http://www.github.com/

    http www runoob com w3cnote android tutorial eclipse adt sdk app html 菜鸟教程 http www jsoneditoronline org JSON解析 http dev
  • FastRTPS-安装手顺

    1 基本要求 1 1 Boost 库和头文件 eProsima Fast RTPS 需要 Boost 发行版 xff0c 因此用户必须安装 1 57 版 按照 boost 发行版中包含的说明进行安装 Windows 安装程序已经为必要的 b
  • openflow13softwareswitch安装及使用笔记

    openflow协议代码的大体结构如下 xff1a 1 涉及报文传输与生成的main函数 2 udatapath c负责datapath xff08 OpenFlow网络中 xff0c 每个OpenFlow实例都使用唯一的Datapath
  • 栈的作用

    栈的作用 计算机里面的栈其实有着举足轻重的作用 大学刚学c语言的时候 xff0c 教的是堆栈 xff0c 传达的是一种后入先出的算法思想 但其实我们知道 xff0c 堆和栈是两个截然不同的东西 而这里面说到的栈 xff0c 则是更融入到计算
  • 多旋翼原理与控制

    多旋翼原理与控制 发表于 2016 11 03 分类于 飞行机器人 本文主要总结了多旋翼飞行器的工作原理 xff0c 包括升降 测飞 转向灯 首先通过四旋翼给出一个直观的解释 然后提取多旋翼飞行器 xff08 包括不同形状 xff09 的共
  • Linux网络编程

    OSI七层结构模型 xff1a 物理层 在OSI参考模型中 xff0c 物理层 xff08 Physical Layer xff09 是参考模型的最低层 xff0c 也是OSI模型的第一层 物理层的主要功能是 xff1a 利用传输介质为数据
  • NVIDIA英伟达jetson xavier nx怎么进入Recovery模式

    xavier nx开发板上没有RECOVERY 按键 xff0c 如何进入Recovery模式呢 xff1f 以下是进入Recovery模式的步骤 xff1a 1 关闭系统电源 xff0c 请确保使电源关闭而不是进入待机状态 xff1b 2
  • Qt获得焦点和失去焦点处理事件 (Focus事件)

    方法一 xff1a 描述 xff1a 一开始我要实现的目的就是 xff0c 在一个窗体上有多个可编辑控件 xff08 比如QLineEdit QTextEdit等 xff09 xff0c 当哪个控件获得焦点 xff0c 哪个控件的背景就高亮
  • linux cifs自动挂载windows硬盘或文件夹

    1 在要挂载的windows系统中找到需要挂载的硬盘或者文件夹 xff0c 把它设置为共享 例如 xff1a 在D盘下建立文件夹shared xff0c 设为共享 2 在linux系统 mnt目录下创建一个文件夹 mkdir mnt wor
  • RFID基础

    射频基础 1 射频 xff1a 射频 xff08 Radio Frequency xff0c RF xff09 是一种高频交流变化电磁波 xff0c 通常所指的频率范围为100 kHz xff5e 30 GHz 我们把具有远距离传输能力的高
  • Sed命令把TAB键替换成空格

    sed 39 s t g 39 filename
  • MIC电路原理

    一 MIC 的电路原理 FET xff1a 场效应管 MIC 的主要器件 xff0c 起到阻抗变换和放大的作用 C xff1a 是一个可以通过膜片震动而改变电容量的电容 xff0c 声电转换的主要部件 C1 C2 xff1a 是为了防止射频
  • SecureCRT crt.Screen.WaitForString用法

    在SecureCRT里 xff0c 用得最多的应该就是crt Screen xff0c 基本上很多操作都是基于屏幕的返回字来决定下一步的操作 这里脚本语言使用VBScript 进行讲解 61 61 61 61 61 61 61 61 61
  • debian9.13系统安装libreoffice6.4.6

    1 在root用户下 apt get remove purge libreoffice 2 切换到下载好的软件包位置 xff0c 然后执行 3 解压Libreoffice安装包和汉化包 tar zxvf LibreOffice 6 4 6
  • tftp和xinetd服务器的配置

    为了开机启动tftpd服务器 需要用到配置xinetd服务器 所以顺便研究下 与xinetd服务器相关的配置就1个文件和1个目录 etc xinetd conf etc xinetd d vim etc xinetd conf defaul
  • c语言 inline函数的总结

    1 inline只是个编译器建议 xff0c 编译器不一定非得展开Inline函数 例如 xff1a Inline函数地址引用 inline在递归函数中使用 2 inline必须用于函数定义 xff0c 对于函数声明 xff0c inlin
  • Linux线程挂掉是否影响进程

    严格的说没有 线程崩溃 xff0c 只是触发了SIGSEGV Segmentation Violation Fault 如果没有设置对应的Signal Handler操作系统就自动终止进程 xff08 或者说默认的Signal Handle
  • python matplotlib.subplot绘制子图

    版权声明 xff1a 本文为博主原创文章 amp amp 转载请著名出处 64 http blog csdn net gatieme 目录 43 问题描述subplot函数介绍示例程序 1 规则划分成33的2 不规则划分 CSDNGitHu
  • SIFT 三线性差值原理与代码分析

    参考了文章 http blog csdn net fzthao article details 62424271 Jie Pro 在进行特征描述时 xff0c 讲的非常详细 但未对三线性插值进行阐述 我也是花了好久的时间才慢慢搞懂 有错之处