天天看点

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.获得关键点(待续)