SIFT算法MATLAB实现----尺度空间构造

       和大家一样,初学sift算法时的那种困惑让人身心疲惫,寝室难安;本着救广大同胞于水火之中的“大义”,从而产生啦写这篇文章的想法;哈哈。

文章不免有错误,欢迎大家批评指正,共同学习。


正文:

关于特征点提取,一直是计算机视觉的重要内容;为了匹配图像,把整幅图像与另一幅图像做相关运算,运算量大的惊人,从而人们就产生了一个想法,能不能只匹配少数几个有代表性的特征点,从而达到高效匹配的目的;所以从上世纪到今天一直有大量的人员投入到特征点的提取上来。

前人的工作:

         (1)Harris检测子(经典算法,当代还在使用)用来匹配两幅没有尺度差异(或者没有太大差异)的图片,比如双目视觉中的两个摄像头里的图像,就可以视为没有太大的差异。

      (2)susan检测子;这个检测子有点奇怪,本人看的不是很多。

      (3)LOG检测子,DOG检测子;这两个放一块的原因是后者计算较快,可以逼近前者(稍后再谈这个话题);

准备工作      

高斯滤波:

        

高斯滤波:

      如果先用一个σ1=6的高斯核对图像进行滤波,然后再用σ2=8的高斯核进行滤波,所得的图像相当于用

σ=10=(6*6+8*8)^0.5的核进行滤波;


MATLAB实现:

%高斯滤波函数,使用时请放在另外一个文件中

function y=gauss(x,theta)

%y--滤波后的图像

%x--需滤波的图像

%theta--高斯滤波核;


n=round(6*theta);
if mod(n,2)==0
    n=n+1;
end
h=fspecial('gaussian',[n,n],theta);
y=filter2(h,x);

正文

        %(1)根据lowe理论;为了增加特征点数量先对图像放大一倍,
%并假设图像已经被摄像机镜头滤波一次,滤波因子为0.5(详见lowe论文)
        %(σ=0.5)因为放大一倍,所以σ=1;
        %(2)要求初始尺度σ=1.6,所以最初的滤波因子为σ=(1.6*1.6-1*1)^0.5

clear;clc;
img=imread('f3.jpg');
%将彩色图像灰度化;
if(size(img,3)==3)
gray_img=rgb2gray(img);
else
gray_img=img;    
end
 %1.获得初始图像,初始theta0=1.6;##########################################
%获得初始图像
    %将图像放大一倍;
    db_img=imresize(gray_img,2);
    db_img=double(db_img);
    %将图像规范化到(0---1);详见lowe论文;
    db_img=db_img/255.0;
    %滤波后获得初始图像;
    theta=(1.6*1.6-1*1)^0.5;
    init_img=gauss(db_img,theta);


    %2.获得高斯图像金字塔##################################
    %假设每组层数S=3;组数O=4;

    S=3;
    O=4;
    theta0=1.6;
    k=2^(1/S);
    %保存相对sigma(即层间相对的theta)
    for i=1:S+3
        sig(i)=theta0*(k^(i-1));
    end
    for j=1:O
        if j==1
            gauss_pyr_img{j}{1}=init_img;
        else
            %每层的初始图像为上层的倒数第三张的降采样,即缩小一倍;
            gauss_pyr_img{j}{1}=imresize(gauss_pyr_img{j-1}{S+1},0.5,'nearest');
        end
        
        for i=2:S+3
            %每层滤波;
            gauss_pyr_img{j}{i}=gauss(gauss_pyr_img{j}{i-1},(sig(i)*sig(i)-sig(i-1)*sig(i-1))^0.5);
        end
    end
   %3.获得DOG金字####################################################
   for j=1:O
       for i=1:S+2
           dog_pyr_img{j}{i}=gauss_pyr_img{j}{i+1}-gauss_pyr_img{j}{i};
       end
   end
% 4.获得关键点(待续)








        

你可能感兴趣的:(图像处理,sift算法,尺度不变算法,图像处理,MATLAB)