SIFT特征(三)

如何快速计算图像梯度、幅值以及梯度方向角 -- 使用SSE指令集 给定一副图像I,如何有效地计算图像上每个位置的梯度Ix,Iy,梯度幅值M,方向角Theta: Ix(x,y)=I(x+1,y) - I(x-1,y), Iy(x,y) =I(x,y+1) - I(x,y-1), M(x,y) = sqrt(Ix(x,y)*Ix(x,y) +Iy(x,y)*Iy(x,y) ), Theta(x,y) = atan2(Iy(x,y), Ix(x,y)) 本文在编程实现这个简单的功能的同时,向没有SSE编程经验的人介绍一下SSE指令集的使用,侧重于高效率计算编程。 阅读详情

上一章节中,我们探讨了如何检测尺度空间上的极值点,以及如何排除掉不稳定的极值点。为了使得SIFT具有旋转不变性,我们需要利用关键点的邻域信息为每一个关键点分配一个方向,使得其具有局部结构的稳定方向。

5.关键点方向赋值
5.1 梯度方向及幅值的计算
对于DoG金字塔中检测出的稳定关键点,取关键点邻域3∗σ 大小的窗口内的像素点,并分别计算每个像素点的梯度方向和大小,公式如下,

m(x,y)=(L(x+1,y)−L(x−1,y))2+(L(x,y+1)−L(x,y−1))2−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−√

θ(x,y)=tan−1((L(x,y+1)−L(x,y−1))/(L(x+1,y)−L(x−1,y)))

L 为DoG空间,这里邻域高斯函数的参数为σ=1.5∗σoct,σoct 为关键点的尺度大小。按照采样3∗σ 原则,取领域半径为3∗σ=3∗1.5∗σoct。见下图左侧图所示,蓝色圈表示高斯作用区域,黑色箭头指示每个对应像素点的梯度。

这里写图片描述

5.2 计算梯度直方图
上一步中计算了邻域内各个像素点的梯度大小和方向,接下来使用直方图对这些邻域像素点的方向和大小进行统计。直方图按照0-360度的方向范围划分为36个柱(bins),即每个柱的度数范围为10度。依次遍历邻域内每个像素点,按照像素点梯度方向找到该像素点所对应的柱的编号,并将像素点的梯度大小与权重的乘积累加到所对应的直方图柱中,这里的权重是指采用了参数为σ高斯函数对邻域像素梯度值进行处理,这样加权处理后,距离关键点较远的边缘像素点的贡献值将会降低,而距离关键点距离较近的像素点则具有较多的贡献值。
上图右侧图示意将关键点邻域像素点根据其梯度方向和大小统计后的直方图。我们可以看出,在统计直方图中,会存在一个峰值方向,那么我们将这个峰值方向代表该关键点的主方向。为了增强匹配的鲁棒性,另外保留了直方图柱大于主方向峰值大小80%的方向,作为关键点的辅方向。在这种情况下,在相同的位置和尺度将会有多个关键点被创建但方向不同,其方向分别表示主方向与各个辅方向。如下图表示关键点检测示意图。

这里写图片描述



5.3 C++源码解读

/*计算关键点邻域的梯度直方图
* pt:关键点xy坐标
*radius: 3*1.5* scale,邻域窗口半径
* sigma:1.5*scale,高斯函数sigma值
*hist: 梯度方向直方图
* n: 直方图bin数量
*/
static float calcOrientationHist( const Mat& img, Point pt, int radius, float sigma, float* hist, int n )
{
    int i, j, k, len = (radius*2+1)*(radius*2+1);

    float expf_scale = -1.f/(2.f * sigma * sigma);
    AutoBuffer<float> buf(len*4 + n+4);
    float *X = buf, *Y = X + len, *Mag = X, *Ori = Y + len, *W = Ori + len;
    float* temphist = W + len + 2;

    for( i = 0; i < n; i++ )
        temphist[i] = 0.f;

    //遍历邻域内所有像素点统计直方图
    for( i = -radius, k = 0; i <= radius; i++ )
    {
        int y = pt.y + i;
        if( y <= 0 || y >= img.rows - 1 )
            continue;
        for( j = -radius; j <= radius; j++ )
        {
            int x = pt.x + j;
            if( x <= 0 || x >= img.cols - 1 )
                continue;

            //计算当前像素点xy方向的梯度
            float dx = (float)(img.at<sift_wt>(y, x+1) - img.at<sift_wt>(y, x-1));
            float dy = (float)(img.at<sift_wt>(y-1, x) - img.at<sift_wt>(y+1, x));

            //X存储x方向梯度大小;Y存储y方向梯度大小;W存放像素点权重
            X[k] = dx; Y[k] = dy; W[k] = (i*i + j*j)*expf_scale;
            k++;
        }
    }

    //直方图统计总的像素点个数
    len = k;

    // 计算邻域内像素点的梯度大小(magnitude)、方向(fastAtan2)和权值(exp)
    //计算矩阵元素W的自然e的W次幂。i.e. W=exp(W)。值为:exp((i^2+j^2)/2*sigma^2),距离关键点越远,权重越小
    exp(W, W, len);
    //计算梯度方向,存放在Ori中
    fastAtan2(Y, X, Ori, len, true);
    //计算梯度幅值,存放在Mag中。i.e. mag(I) = \sqrt(X^2+Y^2), X和Y 是xy方向的梯度大小,可以根据sobel等算法计算而来
    magnitude(X, Y, Mag, len);

    //计算每个像素点所在bin的ID,并将值梯度大小*权重放在所对应的bin中
    for( k = 0; k < len; k++ )
    {
        int bin = cvRound((n/360.f)*Ori[k]);
        if( bin >= n )
            bin -= n;
        if( bin < 0 )
            bin += n;
        temphist[bin] += W[k]*Mag[k];
    }

    // 平滑直方图(取距离为3的直方图柱插值)
    temphist[-1] = temphist[n-1];
    temphist[-2] = temphist[n-2];
    temphist[n] = temphist[0];
    temphist[n+1] = temphist[1];
    for( i = 0; i < n; i++ )
    {
        hist[i] = (temphist[i-2] + temphist[i+2])*(1.f/16.f) +
            (temphist[i-1] + temphist[i+1])*(4.f/16.f) +
            temphist[i]*(6.f/16.f);
    }

    //计算关键点的主方向
    float maxval = hist[0];
    for( i = 1; i < n; i++ )
        maxval = std::max(maxval, hist[i]);

    return maxval;
}
SIFT解析(三)生成特征描述子 以上两篇文章中检测在DOG空间中稳定的特征点,lowe已经提到这些特征点是比Harris角点等特征还要稳定的特征。下一步骤我们要考虑的就是如何去很好地描述这些DOG特征点。 ---------------------------------------------------------------------------------------------------------------- 阅读详情

相关推荐

OpenCV图像特征提取与检测C++(三)SURF特征检测、SIFT特征检测、HOG特征检测、LBP特征检测、Haar特征

SURF特征检测 SURF(Speeded Up Robust Features 加速的稳定的特征,不会随着环境变化而改变)特征关键特性: -特征检测 -尺度空间 放缩到不同尺度空间,尺度不变性 -选择不变性 光照不变性,旋转不变性 -特征向量 将上面的特性描述成特征向量,然后就可以进行特征匹配 尺度不变性:人类在识别一个物体时,不管这个物体或远或近,都能对它进行正确的...

法兰西流浪者博客 3726

图像的梯度和幅值

图像的梯度:梯度的方向是函数f(x,y)变化最快的方向,当图像中存在边缘时,一定有较大的梯度值,相反,当图像中有比较平滑的部分时,灰度值变化较小,则相应的梯度也较小,图像处理中把梯度的模简称为梯度,由图像梯度构成的图像成为梯度图像。 练习《学习OpenCV》第六章第五题: 创建一幅新图像,其中只有45度直线,背景为黑,直线为白。给出一系列中孔尺寸,我们将要得到图像的一阶x方向导数(dx)和一阶

u011559236的博客 2万+

【OpenCV图像处理入门学习教程三】基于SIFT特征和SURF特征的微旋转图像拼接与融合生成全景图像的比较

OpenCV图像处理入门学习教程系列,上一篇第二篇:不同阈值二值化图像图像拼接与融合介绍图像拼接在实际中的应用场景非常广泛,比如无人机的航拍,遥感图像等,甚至小到我们出去游玩用手机拍照时,无奈广角太小,没有办法一次将所有你要拍的景物全部拍下来(当然现在很多手机都自带全景拍照啦,但是不自己试试怎么拼接多不爽~)那么现在假如你的手机是老爷机,没有广角镜头,没有全景功能,所以你对某处中国好山水从左往右依...

primetong的博客 5063

OpenCV:梯度幅值、梯度方向

1. 梯度计算公式推导 上式可以用x和y方向梯度的,但是这样不够直观,不能直接感受梯度具体是朝哪个方向, 因此,梯度可以用梯度幅值和梯度方向表示; 但是求模的公式计算有点繁琐,又是平方,又是开根号的。 不妨将他简化一下,反正只要能表示他的长度就行了,公式变为: 这样求起来多方便,就一个绝对值以及求和。 但是实际图像中的操作如何用上述公式计算呢? 由于图像像素点是离...

SSS_369 1万+

Opencv2.4.9实现特征提取与匹配

实现了用surf+bf和sift+flann对两幅图像进行特征提取与匹配,根据欧式距离去除误匹配得到匹配成功的关键匹配点。仅供参考!

【软件介绍】RVC本地部署使用方法

【摘要】RVC是一款功能强大的开源语音转换工具,具有实时处理、多音效选择、高质量音频处理等特点。文章详细介绍了RVC的安装与使用方法:1)配置Python环境;2)根据电脑系统选择对应安装包解压;3)启动程序进入浏览器操作界面。重点讲解了声音克隆的关键步骤:建议使用短音频素材,选择合适训练方法(推荐pm或rmvpe),设置100次训练轮数,生成的模型文件存入weights文件夹。最后通过上传音频即可实现声音克隆。操作过程需注意保持程序运行状态,并提供了相关资源下载地址。

心动的那一刻,记忆便盛开了花 2976

图像处理中的图像梯度和幅值是什么???(通俗讲解)

梯度和幅值通常用于检测图像中的边缘,因为边缘是像素值变化最剧烈的区域。通过分析梯度的方向和幅值,可以找出图像中的轮廓、边界和其他重要特征。

qq_40280673的博客 3725

Unity镜子效果的实现(无需镜子Shader)

Unity镜子效果制作教程 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —— 心分享、心创新!助力快速实现一个简单的镜面反射效果为新手节省宝贵的时间,避免采坑! Chinar 教程效果: 1 Cre...

weixin_33947521的博客 9563

计算机视觉入门-梯度、算子、Canny边缘检测、非极大值抑制、双门限法

内容涉及梯度、Prewott算子、Sobel算子、Roberts算子、边缘检测流程、Canny边缘检测、非极大值抑制法、双门限法

MMMMMMNONG的博客 2706

vivado生成及调用自定义IP的方法

开发环境:vivado 2018.2 1.将整个工程封装为自定义IP 将整个工程封装为自定义IP主要有以下步骤: 步骤1.选中工程中的top模块。点击Tools ------> Create and Package New IP,如图1所示 图1 步骤2.弹出界面后,点击next至图2界面,选择Package your current project,然后继续点击next 图2 步骤3.选择生成的IP路径,如图3所示。这个路径就是后续添加该IP的路径 图3 步骤4.继续点击next,然后选择fi

进击的阿日比 4726

FTPClient使用中,碰到SocketTimeoutException 坑

ftpclient设置soTimeout无效

u010379794的博客 1950

三帧差分法先锁定目标,SIFT稳住特征,Meanshift死咬不放——这组合拳打运动目标追踪挺带劲。咱们直接上硬货,先整检测模块

代码里藏了个性能优化点——SIFT计算量太大,可以每5帧跑一次特征匹配,中间帧用Meanshift预测位置。sift尺度不变特征变化融合meanshift算法,需要的话给我加好友吧识别与追踪,检测识别用的是帧差等,追踪用的是sift算法和meanshift.检测另有三帧差分法。sift尺度不变特征变化融合meanshift算法,需要的话给我加好友吧识别与追踪,检测识别用的是帧差等,追踪用的是sift算法和meanshift.检测另有三帧差分法。这操作能快速揪出运动物体,但有个坑——目标内部容易出空洞。

QQ68823886的博客 279

AI Agent开发大全第一课-AI是什么以及如何使用AI

近年来,人工智能的迅猛发展引发了广泛的关注,尤其是“大模型”这一概念越来越深入人心。大模型,顾名思义,通常指的是那些拥有大量参数、能够处理复杂任务的机器学习模型。与传统小模型相比,大模型在数据处理、信息理解和生成等方面表现更加出色。为了理解为什么现在的AI被称为大模型,我们需要深入探讨几个关键因素。立角色是指在提示词中清晰地界定交互双方的身份。明确用户希望模型扮演的角色,可以帮助模型更准确地理解上下文和用户需求。

打造全国最全的AI Agent开发知识领域的博客 1406

图像处理之特征提取(三)之SIFT简单梳理

图像处理之特征匹配特征提取之SIFT简单梳理      学习SIFT一段时间,有些东西理解不透彻,且网上没有清晰解释。以下内容为自己的胡思乱想,均无确切依据,辩证看待。   SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),“尺度”的直观第一印象就是大小,尺度不变就是和图片的大小没有关系,简单的SIFT的理解是最后检测出来的特

coming_is_winter的博客 6745

Python爬虫实战:使用最新技术爬取新浪新闻首页数据

本文详细介绍了三种爬取新浪新闻首页的技术方案,从简单的requests-html到强大的Playwright,再到分布式Scrapy架构。小规模爬取:requests-html或aiohttp方案需要JavaScript渲染:Playwright方案大规模分布式爬取:Scrapy-Redis方案。

2201_76125261的博客 1243

【YOLOv8科研级优化】基于YOLOv9的GELAN模块重构C2f架构,显著提升模型精度与推理效率

打开确保模型解析器能识别GELANBlock模块。通过将YOLOv9的GELAN模块集成到YOLOv8的C2f模块中,我们实现了一个“强特征表达+高效计算”的目标检测模型。这个改进不仅在工程上能提升复杂场景下的检测效果,更在科研上提供了“多分支特征融合”的创新思路——这种思路可以延伸到其他检测网络(如Faster R-CNN、SSD)的改进中,帮你在论文中打造独特的研究点。

FJN110的博客 110

图像搜索(三)局部特征SIFT

转载:https://www.cnblogs.com/zhulongchao/p/6444178.html (这里是Java实现,在用Python实现时我的SIFT报错,解决不了。。。很扎心了,在继续解决中。。) 图像搜索三-局部特征SIFT 基于全局特征的传统特征对图像的精细识别能力都不强,即强调鲁棒性大于区分性,这对我们实际应用,尤其是追求同款的应用非常不利;一般有两种方式来避开全局性特...

weixin_39121325的博客 2258

JAVA:Spring Boot 集成 Baidu UID-Generator ID 生成器

百度UID-Generator是一款高性能分布式ID生成器,支持600万QPS,提供Snowflake扩展版和Cache模式两种实现方式。文章详细介绍了如何在Spring Boot项目中集成该组件,包括Maven依赖配置、MySQL表结构初始化、Spring Boot数据源配置、WorkerId分配策略实现以及UID生成器的核心配置。该方案具有无中心依赖、ID单调递增、支持集群部署等特点,适用于订单号、用户ID等分布式场景。通过缓存模式(Cache-Buffer)可进一步提升性能,满足高并发业务需求。

木头 487

浅谈OpenCV库中的特征点提取与匹配(三)——SIFT特征点提取详解

在前两篇文章中,楼主已经向大家展示了Ubuntu16.04+OpenCV-3.1.0(带contrib模块)的安装编译方法。接下来,我们开始进入正题,特征点提取与匹配的实践操作。本篇文章中,我将着重介绍SIFT这种特征点以及做一个简单的特征点提取实践。 1.什么是特征点? 首先我们来介绍一下什么是特征点,从字面的意思上来解释就是能反应事物特征的点,在事物的自然特征点中,多为角点、边上的点、以及面点...

qq_43159510的博客 2929

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

OpenCV SIFT特征学习 (三) 特征如何更好的匹配(上)

BruteForceMatcher与FlannBasedMatcher OpenCV自带的匹配方式主要有两种,蛮力法BruteForceMatcher与FlannBasedMatcher BruteForceMatcher         匹配时,假设输入两组kyepoints为kp1,kp2,则按顺序kp1的点与kp2中的匹配,距离最近的即为匹配点,故匹配结果是产生数量与kp1相同的DMa

lyt1992的专栏 1987

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

sift计算描述子代码详解_SIFT解析(三)生成特征描述子

以上两篇中检测在DOG空间中稳定的特征点,lowe已经提到这些特征点是比Harris角点等特征还要稳定的特征。下一步骤我们要考虑的就是如何去很好地描述这些DOG特征点。下面好好说说如何来描述这些特征点。许多资料中都提到SIFT是一种局部特征,这是因为在SIFT描述子生成过程中,考虑的是该特征点邻域特征点的分布情况(而没有利用全局信息)。本步骤中主要计算过程包括:确定特征点的方向和生成特征描述符。确...

weixin_39932692的博客 434

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OpenCV特征检测(三)SIFT,Surf及其引申的思考

尺度不变特征核心是不同尺度拍摄的两幅图像的同一个物体,对应的两个theta比率等于拍摄两幅图像的尺度的比率。 而OpenCV提供的SIFT和Surf正是利用尺度不变性就行特征点检测的代表。它们的原理可以参考本文的参考文献,写的很详细,本来想在这里介绍下它们的原理的,但是看到参考的blog中写的太好了,我不能写的这么清楚,就省去了。 使用起来也很方便,比如利用Sift找到匹配物体代码如下: ...

音视频图像相关 480

高光谱拼接算法(三)SIFT 特征点检测

SIFT 算法由 David Lowe 在 1999 年提出,它通过多尺度空间极值检测、关键点定位、方向分配和特征描述子生成四个步骤,提取出图像中具有不变性的特征点。对于高光谱图像,每个像素点包含数十到数百个波段,SIFT 能有效处理这些多维数据中的局部特征。在实际高光谱拼接项目中,SIFT 特征点检测的质量直接影响后续的单应性矩阵计算和图像融合效果。:高光谱数据通常选择 30-60 波段(可见光-近红外)进行 SIFT 检测,避免使用噪声较大的短波红外波段2.),并尝试融合更多波段以获得更鲁棒的特征点。

GAiD5eMmc的博客 225
上一篇: C++常见知识点总结
下一篇: SFIT特征(四)
Fishmemory
博客等级 码龄10年 93粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值