图像特征提取:SIFT定位算法关键步骤的说明

图像边缘检测之精确定位 针对图像中,边缘较为模糊,噪声较多,却需要实现精密测量的场景,常用的边缘算子不能够很好地满足使用要求。因此,提出一种先粗定位,再提取边缘区域,最后精确定位的算法。 阅读详情

1. SIFT算法中一些符号的说明

I(x,y) 表示原图像。

G(x,y,σ) 表示高斯滤波器,其中 G(x,y,σ)=12πσ2exp(−(x2+y2)/2σ2) 。

L(x,y,σ) 表示由一个高斯滤波器与原图像卷积而生成的图像,即 L(x,y,σ)=G(x,y,σ)⊗I(x,y) 。一系列的 σi ,则可以生成一系列的 L(x,y,σi) 图像,此时我们把这一系列的 L(x,y,σ) 图像称为原图像的一个尺度空间表示。关于尺度空间的知识可以参考:图像特征提取:尺度空间理论。

DOG 表示高斯差分(Difference of Gaussians),也可以表示为 D(x,y,σ) ,其中 D(x,y,σ)=(G(x,y,kσ)–G(x,y,σ))⊗I(x,y)=L(x,y,kσ)–L(x,y,σ) 。

上面特别值得注意的是尺度为 σ 的高斯差分图像由于尺度为 kσ 与尺度为 σ 的L图像生成的。 k 为两相邻尺度空间倍数的常数。

O :高斯金字塔的组数(Octave),其中值得注意的是在实际构建中,第一组的索引可以为0也可以为-1,这个在后面解释原理。

S :高斯金字塔每一组的层数。在实际最开始构建尺度空间图像,即L图像的时候,构建了S+3层,一定要把这个S+3与S区分开,为什么是S+3后面分析。

2. 构建高斯差分金字塔

2.1 第一组第一层图像的生成

很多初涉SIFT的都会被这个问题所困惑,这里要分两种情况:其一是把第一组的索引定为0;其二是把第一组的索引定为-1。

我们先考虑第一组索引为0的情况,我们知道第一组第一层的图像是由原图像与 σo (一般设置为1.6)的高斯滤波器卷积生成,那么原图像是谁呢?是 I(x,y) 吗?不是!为了图像反走样的需要,通常假设输入图像是经过高斯平滑处理的,其值为 σn=0.5 ,即半个像元。意思就是说我们采集到的图像 I(x,y) ,已经被 σ=σn=0.5 的高斯滤波器平滑过了。所以我们不能直接对 I(x,y) 用 σ0 的高斯滤波器平滑,而应该用 σ=σ20−σ2n−−−−−−−√ 的高斯滤波器去平滑 I(x,y) ,即

FirstLayer(x,y)=I(x,y)⊗G(x,y,σ20−σ2n−−−−−−−√)

其中 FirstLayer(x,y) 表示整个尺度空间为第1组第1层的图像, σo 一般取1.6, σn=0.5 。

现在我们来考虑把第一组的索引定为-1的情况。那么首先第一个问题便是为什么要把索引定为-1。如果索引为0,如上面那种情况所示,整个尺度空间的第1组的第1层图像已经是由原图像模糊生成的了,那么也就是说已经丢失了细节信息,那么原图像我们完全没有利用上。基于这种考虑,我们先将图像放大2倍,这样原图像的细节就隐藏在了其中。由上面一种情况分析,我们已经知识了I(x,y)看成是已经被 σn=0.5 模糊过的图像,那么将 I(x,y) 放大2倍后得到 Is(x,y) ,则可以看为是被 2σn=1 的高斯核模糊过的图像。那么由 Is 生成第1组第1层的图像用的高斯滤波器的 σ=σ20−(2σn)2−−−−−−−−−−√ 。可以表示为。

FirstLayer(x,y)=Is(x,y)⊗G(x,y,σ20−(2σn)2−−−−−−−−−−√)

其中 FirstLayer(x,y) 表示整个尺度空间为第1组第1层的图像, Is(x,y) 是由 I(x,y) 用双线性插值放大后的图像。 σo 一般取1.6, σn=0.5 。

2.2 尺度空间生成了多少幅图像

我们知道S是我们最终构建出来的用来寻找特征点的高斯差分图像,而特征点的寻找需要查找的是空间局部极小值,即在某一层上查找局部极值点的时候需要用到上一层与下一层的高斯差分图像,所以如果我们需要查找S层的特征点,需要S+2层高斯差分图像,然后查找其中的第2层到第S+1层。

而每一个高斯差分图像 G(x,y,σ) 都需要两幅尺度空间的图像 L(x,y,kσ) 与 L(x,y,σ) 进行差分生成,这里假设S =3,则我们需要的高斯差分图像有S+2 = 5张,分别为 G(x,y,σ),G(x,y,kσ),G(x,y,k2σ),G(x,y,k3σ),G(x,y,k4σ) 。其中的 G(x,y,kσ),G(x,y,k2σ),G(x,y,k3σ) 这三张图像是我们用来查找局部极值点的图像。那么我们则需要S+3 = 6张尺度空间图像来生成上面那些高斯差分图像,它们分别为: L(x,y,σ),L(x,y,kσ),L(x,y,k2σ),L(x,y,k3σ),L(x,y,k4σ),L(x,y,k5σ)

image

从上面的分析,我们知道对于尺度空间来说,我们一共需要S+3层图像来构建出来S+2层高斯差分图像。所以,如果整个尺度空间一共有O组,每组有S+3层图像。共O*(S+3)张尺度图像,如果我们查找OpenCV中的SIFT源码,则很容易找到如下代码来说明问题:

<span style="color:gray;">pyr</span><span style="color:black;">.resize(</span><span style="color:gray;">nOctaves</span><span style="color:black;">*(nOctaveLayers + 3));</span>

上面代码中的pyr代表了整个尺度空间的图像,nOctaves为组数,nOctaveLayers即为我们定义的S。

2.3 为什么是倒数第3张

相信你在看很多SIFT算法描述里都这样写着,取上一张的倒数第3张图像隔行采样后作为下一组的第一张图像。

答案是为了保证尺度空间的连续性,我们下面来仔细分析。

我们知道对于尺度空间第o组,第s层的图像,它的尺度为 σ=σoko+s/S,其中,k=1/2,o∈[0,1,2,…,nOctave−1],s∈[0,1,2,…,S+2] 。那么我们从第0组开始,看它各层的尺度。

第0组: σo→21/3σ0→22/3σ0→23/3σ0→24/3σ0→25/3σ0

第1组: 2σo→2∗21/3σ0→2∗22/3σ0→2∗23/3σ0→2∗24/3σ0→2∗25/3σ0

我们只分析2组便可以看出,第1组的第0层图像恰好与第0组的倒数第三幅图像一致,尺度都为 2σ0 ,所以我们不需要再根据原图来重新卷积生成每组的第0张图像,只需采用上一层的倒数第3张来降采样即可。

我们也可以继续分析,第0组尺度空间得到的高斯差分图像的尺度为: σo→21/3σ0→22/3σ0→23/3σ0→24/3σ0

而第1组尺度空间得到的高斯差分图像的尺度为: 2σo→2∗21/3σ0→2∗22/3σ0→2∗23/3σ0→2∗24/3σ0

如果我们把它们的中间三项取出来拼在一起,则尺度为: 21/3σ0→22/3σ0→23/3σ0→2∗21/3σ0→2∗22/3σ0→2∗23/3σ0 ,正好连续!!这一效果带来的直接的好处是在尺度空间的极值点确定过程中,我们不会漏掉任何一个尺度上的极值点,而是能够综合考虑量化的尺度因子。

2.4 用第i-1层的图像生成第i层的图像

值得注意的是,在SITF的源码里,尺度空间里的每一层的图像(除了第1层)都是由其前面一层的图像和一个相对 sigma 的高斯滤波器卷积生成,而不是由原图和对应尺度的高斯滤波器生成的,这一方面是因为我前面提到的不存在所谓意思上的“原图”,我们的输入图像 I(x,y) 已经是尺度为 σ=0.5 的图像了。另一方面是由于如果用原图计算,那么相邻两层之间相差的尺度实际上非常小,这样会造成在做高斯差分图像的时候,大部分值都趋近于0,以致于后面我们很难检测到特征点。

基于上面两点原因(个人认为原因1是最主要的,原因2只是根据实际尝试后的一个猜想,并无理论依据),所以对于每一组的第 i+1 层的图像,都是由第 i 层的图像和一个相对尺度的高斯滤波器卷积生成。

那么相对尺度如何计算呢,我们首先考虑第0组,它们的第 i+1 层图像与第 i 层图像之间的相对尺度为 SigmaDiffi=(σ0ki+1)2–(σ0ki)2−−−−−−−−−−−−−−√ ,为了保持尺度的连续性,后面的每一组都用这样一样相对尺度(SIFT实际代码里是这样做的)。这里有一个猜测,比如说尺度为 2σ0 的这一组,第 i 层与第 i+1 层之间的相对尺度计算的结果应该为 (2σ0ki+1)2–(2σ0ki)2−−−−−−−−−−−−−−−−√=2⋅SigmaDiffi ,可是代码里依然用 SigmaDiffi 是因为这一层被降维了。

<span style="color:black;">sig[0] = sigma;
</span><span style="color:blue;">double </span><span style="color:black;">k = pow(2., 1. / nOctaveLayers);
</span><span style="color:blue;">for </span><span style="color:black;">(</span><span style="color:blue;">int </span><span style="color:black;">i = 1; i < nOctaveLayers + 3; i++)
{
    </span><span style="color:blue;">double </span><span style="color:black;">sig_prev = pow(k, (</span><span style="color:blue;">double</span><span style="color:black;">)(i - 1))*sigma;
    </span><span style="color:blue;">double </span><span style="color:black;">sig_total = sig_prev*k;
    sig[i] = std::sqrt(sig_total*sig_total - sig_prev*sig_prev);
}</span>

3. 特征点的搜索

3.1 搜索策略

斑点的搜索是通过同一组内各DoG相邻层之间比较完成的。为了寻找尺度空间的极值点,每一个采样点要和它所有的相邻点进行比较,看其是否比它的图像域和尺度域的相邻点大或小。对于其中的任意一个检测点都要和它同尺度的8个相邻点和上下相邻尺度对应的 9×2 个点共26个点比较,以确保在尺度空间和二维图像位置空间都检测到极值点。也就是,比较是在一个 3×3 的立方体内进行。

搜索过程从每组的第二层开始,以第二层为当前层,对第二层的DoG图像中的每个点取一个 3×3 的立方体,立方体上下层为第一层与第三层。这样,搜索得到的极值点既有位置坐标(DoG的图像坐标),又有空间尺度坐标(层坐标)。当第二层搜索完成后,再以第三层作为当前层,其过程与第二层的搜索类似。当S=3时,每组里面要搜索3层。

image

3.2 子像元插值

上的的极值点的搜索是在离散空间中进行的,检测到的极值点并不是真正意义上的极值点。下图显示了一维信号离散空间得到的极值点与连续空间的极值点之间的差别。利用已知的离散空间点插值到连续空间极值点的方法叫子像元插值。

image

首先我们来看一个一维函数插值的例子。我们已经 f(x) 上几个点的函数值 f(−1)=1,f(0)=6,f(1)=5 ,求 f(x) 在 [−1,1] 上的最大值。

如果我们只考虑离散的情况,那么只用简单比较一下,便知最大值为 f(0)=6 ,下面我们用子像元插值法来考虑连续区间的上情况:

利用泰勒级数,可以将 f(x) 在 f(0) 附近展开为:

f(x)≈f(0)+f′(0)x+f′′(0)2x2

另外我们知道 f(x) 在 x 处的导数写成离散的形式为 f′(x)=f(x+1)–f(x)2 ,二阶导数写成离散形式为 f′′(x)=f(x+1)+f(x−1)−2f(x) 。

所以,我们可以算出 f(x)≈6+2x+−62x2=6+2x−3x2

求取函数 f(x) 的极大值和极大值所在的位置:

f′(x)=2−6x=0,   x^=13

f(x^)=6+2×13–3×(13)2=613

现在回到我们SIFT点检测中来,我们要考虑的是一个三维问题,假设我们在尺度为 σ 的尺度图像 D(x,y) 上检测到了一个局部极值点,空间位置为 (x,y,σ) ,由上面的分析我们知道,它只是一个离散情况下的极值点,连续情况下,极值点可能落在了 (x,y,σ) 的附近,设其偏离了 (x,y,σ) 的坐标为 (Δx,Δy,Δσ) 。则对 D(Δx,Δy,Δσ) 可以表示为在点 (x,y,σ) 处的泰勒展开:

D(Δx,Δy,Δσ)=D(x,y,σ)+[∂Dx∂Dy∂Dσ]⎡⎣⎢ΔxΔyΔσ⎤⎦⎥+12[ΔxΔyΔσ]⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢∂2D∂x2∂2D∂y∂x∂2D∂σ∂x∂2D∂x∂y∂2D∂y2∂2D∂σ∂y∂2D∂x∂σ∂2D∂y∂σ∂2D∂σ2⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎡⎣⎢ΔxΔyΔσ⎤⎦⎥

可以将上式写成矢量形式如下:

D(x)=D+∂DT∂xΔx+12ΔxT∂2DT∂x2Δx

令上式的一阶导数等于0,可以求得 Δx=−∂2D−1∂x2∂D(x)∂x

通过多次迭代(Lowe算法里最多迭代5次),得到最终候选点的精确位置与尺度 x^ ,将其代入公式求得 D(x^) ,求其绝对值得 |D(x^)| 。如果其绝对值低于阈值的将被删除。

<span style="color:#2b91af;">Vec3f </span><span style="color:black;">dD((img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r, c + 1) - img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r, c - 1))*deriv_scale,
    (img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r + 1, c) - img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r - 1, c))*deriv_scale,
    (next.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r, c) - prev.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r, c))*deriv_scale);
</span><span style="color:green;">// dD为一阶差分矢量Df/Dx
</span><span style="color:blue;">float </span><span style="color:black;">v2 = (</span><span style="color:blue;">float</span><span style="color:black;">)img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r, c) * 2;
</span><span style="color:blue;">float </span><span style="color:black;">dxx = (img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r, c + 1) + img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r, c - 1) - v2)*second_deriv_scale;
</span><span style="color:blue;">float </span><span style="color:black;">dyy = (img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r + 1, c) + img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r - 1, c) - v2)*second_deriv_scale;
</span><span style="color:blue;">float </span><span style="color:black;">dss = (next.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r, c) + prev.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r, c) - v2)*second_deriv_scale;
</span><span style="color:blue;">float </span><span style="color:black;">dxy = (img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r + 1, c + 1) - img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r + 1, c - 1) -
    img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r - 1, c + 1) + img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r - 1, c - 1))*cross_deriv_scale;
</span><span style="color:blue;">float </span><span style="color:black;">dxs = (next.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r, c + 1) - next.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r, c - 1) -
    prev.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r, c + 1) + prev.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r, c - 1))*cross_deriv_scale;
</span><span style="color:blue;">float </span><span style="color:black;">dys = (next.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r + 1, c) - next.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r - 1, c) -
    prev.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r + 1, c) + prev.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r - 1, c))*cross_deriv_scale;

</span><span style="color:#2b91af;">Matx33f </span><span style="color:black;">H(dxx, dxy, dxs,
    dxy, dyy, dys,
    dxs, dys, dss);
</span><span style="color:green;">// dD + Hx = 0  -->  x = H^-1 * (-dD)
</span><span style="color:#2b91af;">Vec3f </span><span style="color:black;">X = H.solve(dD, </span><span style="color:#2f4f4f;">DECOMP_LU</span><span style="color:black;">);</span>

3.3 删除边缘效应

为了得到稳定的特征点,只是删除DoG响应值低的点是不够的。由于DoG对图像中的边缘有比较强的响应值,而一旦特征点落在图像的边缘上,这些点就是不稳定的点。一方面图像边缘上的点是很难定位的,具有定位歧义性;另一方面这样的点很容易受到噪声的干扰而变得不稳定。

一个平坦的DoG响应峰值往往在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向有较小的主曲率。而主曲率可以通过 2×2 的Hessian矩阵 H 求出:

H(x,y)=[Dxx(x,y)Dxy(x,y)Dxy(x,y)Dyy(x,y)]

上式中, D 值可以通过求取邻近点像素的差分得到。 H 的特征值与 D 的主曲率成正比例。我们可以避免求取具体的特征值,因为我们只关心特征值的比例。令 α=λmax 为最大的特征值, β=λmin 为最小的特征值,那么,我们通过 H 矩阵直迹计算它们的和,通过 H 矩阵的行列式计算它们的乘积:

Tr(H)=Dxx+Dyy=α+β

Det(H)=DxxDyy−(Dyy)2=αβ

如果 γ 为最大特征值与最小特征值之间的比例,那么 α=γβ ,这样便有

Tr(H)2Det(H)=(α+β)2αβ=(γ+1)2γ

上式的结果只与两个特征值的比例有关,而与具体特征值无关。当两个特征值相等时, (γ+1)2γ 的值最小,随着 γ 的增加, (γ+1)2γ 的值也增加。所以要想检查主曲率的比例小于某一阈值 γ ,只要检查下式是否成立:

Tr(H)2Det(H)<(γ+1)2γ

Lowe在论文中给出的 γ=10 。也就是说对于主曲率比值大于10的特征点将被删除。

<span style="color:blue;">float </span><span style="color:black;">t = dD.dot(</span><span style="color:#2b91af;">Matx31f</span><span style="color:black;">(xc, xr, xi));
</span><span style="color:green;">//D(\bar{x}) = D + 1/2*dD*\bar{x}
</span><span style="color:black;">contr = img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r, c)*img_scale + t * 0.5f; </span><span style="color:green;">// 插值得到的极值点的值
</span><span style="color:blue;">if </span><span style="color:black;">(std::abs(contr) * nOctaveLayers < contrastThreshold)
    </span><span style="color:blue;">return false</span><span style="color:black;">;
</span><span style="color:green;">// principal curvatures are computed using the trace and det of Hessian
</span><span style="color:blue;">float </span><span style="color:black;">v2 = img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r, c)*2.f;
</span><span style="color:blue;">float </span><span style="color:black;">dxx = (img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r, c + 1) + img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r, c - 1) - v2)*second_deriv_scale;
</span><span style="color:blue;">float </span><span style="color:black;">dyy = (img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r + 1, c) + img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r - 1, c) - v2)*second_deriv_scale;
</span><span style="color:blue;">float </span><span style="color:black;">dxy = (img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r + 1, c + 1) - img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r + 1, c - 1) -
    img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r - 1, c + 1) + img.at<</span><span style="color:#2b91af;">sift_wt</span><span style="color:black;">>(r - 1, c - 1)) * cross_deriv_scale;
</span><span style="color:blue;">float </span><span style="color:black;">tr = dxx + dyy;
</span><span style="color:blue;">float </span><span style="color:black;">det = dxx * dyy - dxy * dxy;

</span><span style="color:blue;">if </span><span style="color:black;">(det <= 0 || tr*tr*edgeThreshold >= (edgeThreshold + 1)*(edgeThreshold + 1)*det)
</span><span style="color:blue;">return false</span><span style="color:black;">;</span>

作者:☆Ronny丶

出处:http://www.cnblogs.com/ronny/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

图像特征匹配方法——SIFT算法原理及实现 传统图像处理中图像特征匹配有三个基本步骤:特征提取、特征描述和特征匹配。特征提取就是从图像中提取出关键点(或特征点、角点)等。特征描述就是用一组数学向量对特征点进行描述,其主要保证不同的向量和不同的特征点之间是一种对应的关系,同时相似的关键点之间的差异尽可能小。特征匹配其实就是特征向量之间的距离计算,常用的距离有欧氏距离、汉明距离、余弦距离等。 SIFT算法又叫尺度不变特征变换匹配算法, SIF... 阅读详情

相关推荐

Python计算机视觉——SIFT特征提取与检索

文章目录SIFT特征提取算法1. 定义2. 步骤3. 构造DOG尺度空间4. 图像尺度空间5. 多分辨率金字塔6. 高斯差分金字塔7. 关键点搜索与定位7.1 关键点搜索7.2 关键点的精确定位7.3 消除边界响应8. 方向赋值8.1 特征点的主方向9. 生成特征描述10. SIFT代码训练结果 SIFT特征提取算法 1. 定义 SIFT的全称是Scale Invariant Feature Tr...

qq_43241436的博客 7408

计算机视觉——SIFT特征提取算法

文章目录1. SIFT特征提取算法1.1 算法简介1.2 特点介绍1.3 算法可解决的问题2. 检测提取感兴趣点2.1 检测结果2.2 实验小结2.3 代码3. 图片进行SIFT匹配3.1 匹配结果3.2 实验小结3.3 代码4. 图库检索图片匹配4.1 获取保存图库及特征点4.2 检索结果4.3 实验小结5. 实验总结 1. SIFT特征提取算法 1.1 算法简介 尺度不变特征转换(Scale-...

xxxcci的博客 3768

SIFT图像匹配

一、SIFT算法简介 Sift算法是David Lowe于1999年提出的局部特征描述子,并于2004年进行了更深入的发展和完善。Sift特征匹配算法可以处理两幅图像之间发生平移、旋转、仿射变换情况下的匹配问题,具有很强的匹配能力。总体来说,Sift算子具有以下特性: (1)、Sift特征是图像的局部特征,对平移、旋转、尺度缩放、亮度变化、遮挡和噪声等具有良好的不变性,对视觉变化、仿射变换也保持一...

Yep_Ying的博客 4919

特征提取方法

在图像识别方向,可通过sift,surf,orb等算法提取特征,然后再喂给一个中等粒度的vector2算法,最后再去做分类。 1. sift 1.1 sift特征简介 SIFT(Scale-Invariant Feature Transform)特征,即尺度不变特征变换,是一种计算机视觉的特征提取算法,用来侦测与描述图像中的局部性特征。 实质上,它是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出、不会因光照、仿射变换和噪音等因素而变化的点,如角点

zhao_crystal的博客 2万+

计算机视觉图像特征提取入门:Harris角点与SIFT算法

计算机视觉图像特征提取入门:Harris角点与SIFT算法,在计算机视觉领域,图像特征提取是一项至关重要的基础任务。它旨在从图像中提取具有代表性和独特性的信息,这些信息能够帮助计算机理解图像内容,为后续的目标识别、图像匹配、图像分割等高级任务提供有力支持。Harris 角点和 SIFT(尺度不变特征变换)算法作为经典的图像特征提取方法,在学术界和工业界都得到了广泛应用。Harris 角点能够有效地检测出图像中的角点特征,这些角点往往是图像中物体形状的关键转折点,蕴含着丰富的结构信息。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 14万+

SIFT图像特征点提取算法详解与应用

本文还有配套的精品资源,点击获取 简介:SIFT(尺度不变特征变换)算法由David G. Lowe于1999年提出,是图像处理领域中用于图像特征点识别与匹配的强大工具,具备尺度不变性、旋转不变性及光照不变性。算法分为尺度空间极值检测、关键点定位、关键点稳定化、关键点描述符生成等步骤。它的应用涵盖了图像匹配、目标检测与识别、3D视觉以及视频分析等多个场景。本讲义深入解析了S...

weixin_42300144的博客 6061

基于图像的目标检测与定位方法概述

目录1. 目标检测与定位概念2. 目标检测与定位方法2.1 传统目标检测流程2.2 two-stage检测算法2.2.1 R-CNN2.2.2 two-stage其他算法2.2.2.1 Spatial Pyramid Pooling(空间金字塔池化)2.2.2.2 Fast-RCNN2.2.2.3 P11 Faster RCNN2.3 One-Stage2.3.1 YOLO2.3.2 SSD参考 本文简单介绍基于图像的目标检测与定位相关概念,R-CNN和YOLO等算法基本思想。本文为学习笔记,参考了许多优

dela1024的博客 2万+

前馈神经网络求解XOR问题

摘要 前馈神经网络是一种最简单的神经网络,各神经元分层排列。每个神经元只与前一层的神经元相连。接收前一层的输出,并输出给下一层.各层之间没有反馈。是目前应用最广泛、发展最迅速的人工神经网络之一。研究从20世纪60年代开始,目前理论研究和实际应用达到了很高的水平[1]。本节通过设计包含输入层、一个隐含层和输出层的前馈神经网络,实现XOR运算,并基于计算数据或实验数据分析隐含层决策面的特点,进而总结前馈神经网络隐含层的作用。 1.1 神经网络结构设计 1.1.1 XOR问题描述 ...

sinat_28178805的博客 2359

常见的几种图像特征提取算法

常见的几种特征提取算法1. LBP算法(Local Binary Patterns,局部二值模式)2.HOG特征提取算法(Histogram of Oriented Gradient)3.SIFT算子(Scale-invariant feature transform,尺度不变特征变换) 1. LBP算法(Local Binary Patterns,局部二值模式) LBP算子是一种用来描述图像局部...

魔法师の屋子★↓☆ 2万+

Cisco Packet Tracer 7.3免登录技巧:3种方法快速跳过注册界面(附详细截图)

本文针对Cisco Packet Tracer 7.3启动时遇到的登录界面问题,提供了三种合法高效的解决方案。详细介绍了如何利用官方访客模式快速启动、注册思科账号实现一劳永逸登录,以及通过调整本地安装配置优化启动流程,帮助网络学习者与备考者绕过繁琐步骤,快速进入实验环境。

weixin_29305337的博客 741

【PCIe 总线及设备入门学习专栏 6.2 -- PCIe VDM (Vendor Defined Messages)】

在PCIe协议中,Vendor Defined Messages (VDMs) 是一种允许厂商定义和传输特定功能的消息类型。这种机制扩展了标准 PCIe 消息的功能,可以用于实现供应商自定义的功能,例如固件更新、设备配置和诊断信息传输。PCIe VDM 是通过实现的,它遵循 PCIe 协议栈的结构,包括事务层、数据链路层和物理层。

CodingCos的博客 1898

基于SIFT特征提取的图像拼接算法matlab仿真

SIFT(Scale invariant feature transform),即尺度不变特征变换描述子,其可以从图像中提取稳定的特征数据,其对图像的旋转、阴影干扰、噪声干扰、移动以及空间扭曲等影响有着较好的不变性。基于SIFT的图像特征提取原理如下:步骤一、图像转换到尺度空间。图像的尺度空间表示方式通常情况下是将图像和高斯核函数进行卷积计算,其计算公式如下:步骤二、尺度空间极值点的计算。

FPGA/MATLAB学习教程/源码/项目合作开发 2991

寻路最终版哦

相信大家用unity3d寻路的时候,一定会碰到多人

yxriyin的专栏 6955

SIFT特征提取与匹配算法

计算机视觉领域重要算法,尺度不变特征变换(SIFT)学习记录

Ucarrot的博客 6907

【即插即用模块】Transformer篇 | ICCV 2025 | MALA :注意力分布神似Softmax,告别线性注意力性能短板!

MALA(Magnitude-Aware Linear Attention)是一种改进的线性注意力机制,通过引入缩放因子和偏移项,解决了传统线性注意力忽视查询幅度的问题,使其分布更接近Softmax Attention。该模块具有线性复杂度(O(n)),结合RoPE和LEPE编码实现全局-局部位置信息混合,通过z值调制平衡信息权重。实验表明MALA在轻量级视觉任务中能有效平衡效率与精度,注意力可视化显示其分布与Softmax Attention高度相似。代码提供完整的RoPE位置编码和线性注意力

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1108

滴滴数据分析80道面试题及参考答案

常见的模型评价指标有准确率、召回率、F1 值、均方误差、均方根误差、R 方等。准确率是指模型预测正确的样本数占总样本数的比例,它反映了模型预测的准确性。召回率是指模型预测为正例的样本中实际为正例的比例,它衡量了模型对正例的捕捉能力。F1 值是准确率和召回率的调和平均数,综合考虑了两者的平衡。均方误差是预测值与真实值之差的平方的平均值,它衡量了模型预测值与真实值的平均偏离程度。均方根误差是均方误差的平方根,与均方误差类似,但更直观地反映了误差的大小。

大模型大数据攻城狮的专栏 1698

机器学习图像特征提取—SIFT特征提取原理及代码实现

目录 1 SIFT简介 2 SIFT原理及特点 2.1 SIFT算法特点 2.2 SIFT特征检测 3 SIFT代码实现 1 SIFT简介 SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。 SIFT特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、微视角改变的容忍度也相当高...

weixin_42795788的博客 1万+

1.2 Spring AI V1.1.2版本 架构全景:模块拆解与设计哲学

Override// 检查请求的 Token 数量throw new TokenLimitExceededException("请求超出 Token 限制");@Override// 记录实际消耗的 Token@Override// 最先执行// 接口// 不同实现// 使用方无需改变定义抽象,保证可移植性提供 Fluent API,提升开发体验Advisor 机制提供扩展点,支持灵活定制模块化设计让你只引入需要的依赖自动配置。

小林夕程的博客 220

图像特征提取算法:尺度不变特征变换SIFT

尺度不变换特征变换(Scale invariant feature Transform,SIFT)(Lowe,1999,2004)[1],[2]的目标是解决低层次特征提取及其图像匹配应用中的许多实际问题。 1.基本介绍 关于SIFT算法,2004年David Lowe发表在Int. Journal of Computer Vision的经典论文[2]中,对尺度空间(scale space)是这样定...

机器熊的技术大杂烩 4118

13.0 针对跳转不存在Activity崩溃处理,改成弹Toast提示,去掉崩溃弹窗,避免app崩溃退出

在开发过程中,在app跳转到某个没注册的Acitivity时,往往会出现崩溃的场景,这样也不好,接下来就从framework中来拦截这个崩溃,改成toast提示,

安卓兼职framework和app工程师的博客 48

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

基于OpenCV的SIFT算法实现图像拼接(全景图像)

(Scale-invariant feature transform或SIFT)是一种的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变数,此算法由在1999年所发表,2004年完善总结。是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。

2302_81324947的博客 5013

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

sift特征提取算法

SIFT算法是用来提取图像局部特征的算法,具有尺度不变性,并且对光线噪声等容忍度高。 主要步骤: 1、尺度空间的生成 2、检测尺度空间极值点; 3、精确定位极值点; 4、为每个关键点指定方向参数; 5、关键点描述子的生成。 —————————————————————————— 1,尺度空间的生成 (1)预备知

July's Pensieve 2万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

图像特征提取-SIFT

SIFT算法通过检测图像中的局部特征点,并计算这些特征点的描述符,从而实现图像的匹配和识别。这些特征点具有尺度不变性和旋转不变性,即使图像发生尺度缩放、旋转或光照变化,也能够被准确识别和匹配。

2301_77698138的博客 1990

SIFT图像拼接

SIFT图像拼接 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录SIFT图像拼接前言二、使用步骤1.SIFT2.RANSAC拟合3.单应性变换4.SVD分解总结 前言 结合SIFT、单应性变换、Ransac和SVD等算法实现指定几幅图像之间的拼接,并理解其原理。实验用图如图1,我们需要将图像按照(a)-(b)-©-(d)的顺序拼接起来,将图像都变换到同一个像素坐标系。实验原理如图所示: 二、使用步骤 1.SIFT SIFT即尺度不变特征变换,是用于图像处理领域的一种描述。这

qq_43671173的博客 9337

图像特征提取(二)——SIFT算法详解

转载自:http://blog.youkuaiyun.com/zddblog/article/details/7521424尺度不变特征变换匹配算法详解Scale Invariant Feature Transform(SIFT)Just For Funzdd  zddmail@gmail.com or (zddhub@gmail.com)对于初学者,从David G.Lowe的论文到实现,有许多鸿沟,本文帮...

qq_37764129的博客 1万+
上一篇: javaweb学习总结(四十二)——Filter(过滤器)学习
下一篇: CSS定位深入理解 完全掌握CSS定位 相对定位和绝对定位
boringY
博客等级 码龄12年 0粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值