• 大小: 3.43MB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-09-09
  • 语言: Matlab
  • 标签:

资源简介

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\calcDescriptors.m

     文件       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


评论

共有 条评论

相关资源