SIFT--方向分配

在得到合适的特征点位置后,为每个特征点分配方向,从而使描述子能实现图像旋转不变性,这也是我们SIFT第三步方向分配的主要目的。

SIFT中方向分配主要从以下几个步骤进行。

1、计算梯度幅值和幅角
需要根据检测到的特征点的局部图像结构求得一个方向基准。我们使用图像梯度方向求取该局部结构的稳定方向。对于已经检测到的特征点,我们知道该特征点的尺度值 σ ,因此根据这一尺度值,求得最接近这一尺度值的高斯图像:

 L(x,y)=G(x,y,σ)I(x,y) 

该特征点的梯度:
这里写图片描述

使用有限差分,计算以特征点为中心,以 3×1.5σ为半径的区域内图像梯度的幅角和幅值(模值),幅值和幅角的计算如下:

 m(x,y)=(L(x+1,y)L(x1,y))2+(L(x,y+1)L(x,y1))2 

 σ(x,y)=tan1((L(x,y+1)L(x,y1))/(L(x+1,y)L(x1,y))) 

2、加权处理
每个加入梯度直方图的采样点梯度幅值都要进行权重处理,加权采用圆形高斯加权函数,其 σ 值为特征点尺度的1.5倍。

由于SIFT只考虑了尺度和旋转不变性,并没有考虑仿射不变性。通过高斯加权,使特征点附近的梯度幅值有较大的权重,这样可以弥补因没有仿射不变性而产生的特征点不稳定的问题。

3、生成方向梯度直方图
在完成特征点邻域的高斯图像的梯度计算后,使用直方图统计邻域内像素的梯度方向和幅值。梯度方向直方图的横轴是梯度方向角,纵轴是梯度方向角对应的梯度幅度累加值。

梯度方向直方图将 0o360o 的范围,分为36个柱,每 10o 一个柱。直方图的峰值代表了改特征点处邻域内图像梯度的主方向,也即该特征点的主方向。如下是一个 8×8 的邻域,以直方图统计该邻域内的方向,计算出峰值方向,如下:
这里写图片描述

4、辅方向
当梯度方向直方图中,当存在另一个相当于主峰值80%能量的峰值时,则将这个方向认为是该特征点的辅方向。一个特征点可能会被指定具有多个方向(一个主方向,一个以上辅方向),这可以增强匹配的鲁棒性,具体就是把该特征点复制成多份特征点,并将方向值分别赋给这些复制后的特征点,通常离散的梯度方向直方图进行插值拟合处理,这样可以求得更精确的方向角度值。

以上,在获得了图像的特征点主方向后,每个特征点有三个信息 (x,y,σ,θ) :位置、尺度、方向,前俩个值是使用SIFT特征点检测得到的,特征点的主方向就是我们这一步求得的。



SIFT - DCT变换结合了尺度不变特征变换(SIFT)和离散余弦变换(DCT)的特点,以下从原理、应用及相关技术进行介绍。 ### 原理 SIFT(尺度不变特征变换)是一种在图像中检测和描述局部特征的算法,它具有尺度、旋转和光照不变性。其主要步骤包括尺度空间极值检测、关键点定位、方向分配和关键点描述符生成。DCT(离散余弦变换)是一种将信号从时域转换到频域的变换方法,常用于图像压缩和特征提取,它将图像的空间域信息转换为频域系数,能够突出图像的全局特征。SIFT - DCT变换结合了两者的优势,先通过SIFT提取图像的局部特征点,再对包含这些特征点的区域进行DCT变换,从而得到同时具有局部和全局特征的特征表示 [^1]。 ### 应用 在医学图像水印技术中,SIFT - DCT变换有重要应用。基于SIFT - DCT感知哈希的医学图像水印算法,利用医学图像变换域中的鲁棒哈希序列构建零水印,不修改医学图像的特征,能适应医学数据特点,抵抗强攻击,具有很强的鲁棒性 [^1]。此外,在图像超分辨检测中,SIFT配准法作为稳定化方法之一,结合DCT相关特性可能有助于更准确地对多帧低分辨率图像进行处理,以实现超分辨 [^3]。 ### 相关技术 在图像特征提取方面,SIFT - DCT变换与其他特征提取方式有对比。如SIFT - SIFT方式提取的特征点和MSER - SIFT提取的特征点数量不同,虽然MSER - SIFT精度会有些下降,但时间上有显著提升 [^2]。在图像处理系统中,还涉及多种与SIFT - DCT变换相关的功能,如运动模糊调节、滤波检测、边缘检测等。运动模糊调节支持去运动模糊功能及多种参数调节;滤波检测支持多种图像滤波功能;边缘检测支持多种算子进行边缘检测及特定阈值调整的边缘检测功能 [^3]。 ### 代码示例 以下是一个简单的Python示例,展示如何使用OpenCV库进行SIFT特征提取和DCT变换: ```python import cv2 import numpy as np # 读取图像 image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE) # SIFT特征提取 sift = cv2.SIFT_create() keypoints, descriptors = sift.detectAndCompute(image, None) # 对图像进行DCT变换 dct_image = cv2.dct(np.float32(image)) # 显示结果 cv2.drawKeypoints(image, keypoints, image) cv2.imshow('SIFT Keypoints', image) cv2.imshow('DCT Image', np.log(1 + np.abs(dct_image))) cv2.waitKey(0) cv2.destroyAllWindows() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值