资源简介
SIFT代码实现。本代码是通过Matlab实现了SIFT。可以作为理解SIFT原理以及把握过程细节的参考。与博文《SIFT代码V1版本(Matlab)实现以及思考的问题》配套。
代码片段和文件信息
function [flagbool kpt] = adjustExtrPoint(Dogpyrgausspyroctlay1r1c1)
global layers;
global edgegama; %是否是物体边缘判断的gamma系数
global SIFT_STEP; %迭代步数
global IterationMax; %相差一个较大值
global ExtrThreshold; %极值点稳定判断
global SIFT_Img_Border; %图片边界去掉SIFT_Img_Border-1个像素点
flagbool = 0;
kpt = [];
lay = lay1;r = r1;c = c1; %这三个位置信息是会适当调整的 但是oct是不会调整的
for step = 1:1:SIFT_STEP %循环次数
cub_pre = Dogpyr{oct}(r-1:r+1c-1:c+1lay-1);
cub_at = Dogpyr{oct}(r-1:r+1c-1:c+1lay);
cub_next = Dogpyr{oct}(r-1:r+1c-1:c+1lay+1);
dx = 1/2 * ( cub_at(23)-cub_at(21) );
dy = 1/2 * ( cub_at(32)-cub_at(12) );
ds = 1/2 * ( cub_next(22)-cub_pre(22) );
Dx = [dx;dy;ds];
atv2 = cub_at(22)*2;
dxx = (cub_at(23)+cub_at(21)-atv2);
dyy = (cub_at(32)+cub_at(12)-atv2);
dss = (cub_next(22)+cub_pre(22)-atv2);
dxy = (cub_at(33)+cub_at(11)-cub_at(31)-cub_at(13))/4;
dxs = (cub_next(23)-cub_next(21)-cub_pre(23)+cub_pre(21))/4;
dys = (cub_next(32)-cub_next(12)-cub_pre(32)+cub_pre(12))/4;
H = [dxx dxy dxs; ...
dxy dyy dys; ...
dxs dys dss];
Det = -inv(H)*Dx;
dr = Det(1); dc = Det(2); di = Det(3);
if abs(dr)<0.5 && abs(dc)<0.5 && abs(di)<0.5
flagbool = 1;
break;
end
if abs(dr)>IterationMax || abs(dc)>IterationMax || abs(di)>IterationMax
flagbool = 0;
break;
end
lay = round(lay+di); r = round(r+dr); c = round(c+dc);
%同一组内的图片像素数量相同,所以取第1层。不能用lay层(程序运行过程中round(lay+di)可能非合理区)
[rows cols] = size(Dogpyr{oct}(::1));
% 极值点最多只能在Dog塔中的第2至s+1层寻找(上下都要有比较层)
if lay<2 || lay >layers+1 || ...
rrows-SIFT_Img_Border+1 || ...
ccols-SIFT_Img_Border+1
flagbool = 0;
break;
end
end
%结束for循环,如果找到了极值点flagbool == 1
%%
%也只有迭代步数小于预设值且abs(dr)<0.5 && abs(dc)<0.5 && abs(di)<0.5时
%才会进入下面的if条件,因此下面的代码可以放到上面的“flagbool = 1;”语句前
if flagbool == 1
fx = Dogpyr{oct}(rclay)+1/2*Dx‘*Det;
laymax = max(max(Dogpyr{oct}(::lay)));
laymin = min(min(Dogpyr{oct}(::lay)));
stable = ExtrThreshold*max( abs(laymax)abs(laymin) );
if abs(fx) < stable
flagbool = 0;
end
% 计算Hessian矩阵,与OpenCV中不同的是通过gausspyr求Hessian矩阵
% 我认为边界应该对图像本身来说,同时Dog本来就是差分再继续差分,即高阶差分其失真是非常大的
% 具体操作中Dog极值点对应高斯塔的被减层(因为Dog是Log的被减层的拉普拉斯差分的近似)。
% 并且为了防止偏差,将极值点周围九个点都判断是不是落在边界上
for rh = r-1:1:r+1
for ch = c-1:1:c+1
% for rh = r
% for ch = c
Hcub = gausspyr{oct}(rh-1:rh+1ch-1:ch+1lay);
Hxx = Hcub(23)+Hcub(21)-2*Hcub(22);
Hyy = Hcub(32)+Hcub(12)-2*Hcub(22);
Hxy = (Hcub(33)+Hcub(11)-Hcub(13)-Hcub(31))/4;
tr = Hxx+Hyy;
Hdet = Hxx*Hyy-Hxy*Hxy;
if Hdet <=0 || tr*tr/Hdet >= (edgegama+1)*(edgegama+1)/edgegama
flagbool = 0;
end
end
end
end
%% 极值点迭代精确定位稳定,且不属于边界等条件满足时
if flagbool == 1
kpt = [oct lay r c di dr dc];
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3404 2018-04-01 21:06 SIFT_Yhb - 备份1\adjustExtrPoint.m
文件 1221 2018-04-06 00:16 SIFT_Yhb - 备份1\affinity.m
文件 925 2018-04-05 23:50 SIFT_Yhb - 备份1\affinity1.m
文件 479 2018-04-05 10:24 SIFT_Yhb - 备份1\appendimages.m
文件 1110 2018-03-31 16:03 SIFT_Yhb - 备份1\buildDogpyr.m
文件 1398 2018-03-30 22:11 SIFT_Yhb - 备份1\buildgausspyr.m
文件 4178 2018-04-04 11:24 SIFT_Yhb - 备份1\calcDesc
文件 2575 2018-04-06 08:49 SIFT_Yhb - 备份1\Define.m
文件 104330 2018-04-06 10:32 SIFT_Yhb - 备份1\DIPbook1.png
文件 104810 2018-04-06 10:35 SIFT_Yhb - 备份1\DIPbook2.png
文件 3362562 2018-04-06 10:50 SIFT_Yhb - 备份1\DIP_放大一倍匹配结果.fig
文件 2956 2018-04-01 20:13 SIFT_Yhb - 备份1\findExtrma.m
文件 1300 2018-04-06 00:13 SIFT_Yhb - 备份1\lins.m
文件 1749 2018-04-06 10:37 SIFT_Yhb - 备份1\match_yhb.m
文件 35923 2018-04-01 21:16 SIFT_Yhb - 备份1\matrix.png
文件 2212 2018-04-01 17:14 SIFT_Yhb - 备份1\oritHist.m
文件 1226 2018-04-05 11:10 SIFT_Yhb - 备份1\SIFT_yhb.m
文件 903 2018-03-30 08:50 SIFT_Yhb - 备份1\sigma_num.m
文件 79769 2018-04-06 11:04 SIFT_Yhb - 备份1\人工查看正确率.png
文件 1714 2018-04-06 11:57 SIFT_Yhb - 备份1\综述.txt
目录 0 2018-04-06 11:59 SIFT_Yhb - 备份1
----------- --------- ---------- ----- ----
3714744 21
评论
共有 条评论