和大家一样,初学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.获得关键点(待续)