目录
一、理论基础
SIFT算法得到了图像中的特征点以及相应的特征描述,如何把两张图像中的特征点匹配起来呢?一般的可以使用K近邻(KNN)算法。K近邻算法求取在空间中距离最近的K个数据点,并将这些数据点归为一类。在进行特征点匹配时,一般使用KNN算法找到最近邻的两个数据点,如果最接近和次接近的比值大于一个既定的值,那么我们保留这个最接近的值,认为它和其匹配的点为good match(有Lowe在SIFT论文中提出)。
图像拼接算法在近年来得到了广泛的研究和应用,其中的关键步骤之一就是特征点的提取和匹配。SIFT(Scale-Invariant Feature Transform)算法作为一种尺度不变特征转换算法,被广泛应用于图像拼接中。本文将详细介绍SIFT特征提取的图像拼接算法的原理、公式等。
SIFT算法最早由David Lowe在1999年提出,并在2004年完善总结。该算法主要用来提取图像中的关键点,这些关键点在不同尺度空间的图像下检测出具有方向信息的局部极值点。SIFT算法具有角度和尺度不变性,因此不容易受到图像平移、旋转、缩放和噪声的影响。
在SIFT算法中,关键点和尺度空间是其核心概念。尺度空间理论最早在1962年提出,其主要思想是通过对原始图像进行尺度变换,获得图像多尺度下的尺度空间表示序列。SIFT算法就是利用同一幅图像在不同尺度空间的关系来提取关键点。尺度空间中各尺度图像的模糊程度逐渐变大,能够模拟人在距离目标由近到远时目标在视网膜上的形成过程。
SIFT特征提取的图像拼接算法主要步骤如下:
- 尺度空间极值检测:通过构建尺度空间,寻找图像中所有关键点,并对关键点进行初步筛选,得到候选关键点。
- 关键点定位:对候选关键点进行精确定位,并去除低对比度的关键点和边缘响应的关键点。
- 方向分配:为每个关键点分配一个或多个方向,使关键点具有方向信息,提高其鲁棒性。
- 关键点描述:根据关键点的位置、尺度、方向等信息,生成关键点的描述向量。
- 特征匹配:通过计算不同图像之间关键点的描述向量之间的距离,找出匹配的关键点对。
- 几何变换:根据匹配的关键点对,计算图像间的几何变换关系,如旋转、平移、缩放等。
- 图像拼接:根据几何变换关系,将待拼接的图像拼接到一起,得到完整的拼接图像。
在SIFT特征提取的图像拼接算法中,SIFT算法具有以下优点:
- 尺度不变性:SIFT算法能够检测到不同尺度下的关键点,从而避免了因尺度变化而导致的特征失效问题。
- 角度不变性:SIFT算法能够检测到不同角度下的关键点,从而避免了因角度变化而导致的特征失效问题。
- 高独特性:SIFT算法生成的描述向量具有高独特性,有利于准确匹配关键点。
- 适用范围广:SIFT算法可以应用于不同领域的图像处理问题,如目标检测、图像识别、图像拼接等。
总之,基于SIFT特征提取的图像拼接算法是一种具有广泛应用价值的算法,它能够实现图像的精确拼接,提高图像的质量和视觉效果。
SIFT(Scale invariant feature transform),即尺度不变特征变换描述子,其可以从图像中提取稳定的特征数据,其对图像的旋转、阴影干扰、噪声干扰、移动以及空间扭曲等影响有着较好的不变性。基于SIFT的图像特征提取原理如下:
步骤一、图像转换到尺度空间。图像的尺度空间表示方式通常情况下是将图像和高斯核函数进行卷积计算,其计算公式如下:
步骤二、尺度空间极值点的计算。在SIFT算法中,一般采用差分图像来计算尺度空间极值,其计算公式如下:
二、核心MATLAB程序
function [matchLoc1,matchLoc2] = func_siftMatch(img1, img2)
[des1,loc1] = sift(img1);
[des2,loc2] = sift(img2);
distRatio = 0.8;
% For each descriptor in the first image, select its match to second image.
des2t = des2'; % Precompute matrix transpose
matchTable = zeros(1,size(des1,1));
for i = 1 : size(des1,1)
dotprods = des1(i,:) * des2t; % Computes vector of dot products
[vals,indx] = sort(acos(dotprods)); % Take inverse cosine and sort results
% Check if nearest neighbor has angle less than distRatio times 2nd.
if (vals(1) < distRatio * vals(2))
matchTable(i) = indx(1);
else
matchTable(i) = 0;
end
end
img3 = func_appendimages(img1,img2);
% Show a figure with lines joining the accepted matches.
figure('Position', [100 100 size(img3,2) size(img3,1)]);
subplot(211);
colormap('gray');
imagesc(img3);
subplot(212);
colormap('gray');
imagesc(img3);
hold on;
cols1 = size(img1,2);
for i = 1: size(des1,1)
if (matchTable(i) > 0)
line([loc1(i,2) loc2(matchTable(i),2)+cols1], ...
[loc1(i,1) loc2(matchTable(i),1)], 'Color', 'g');
end
end
title('SIFT匹配效果');
hold off;
num = sum(matchTable > 0);
fprintf('Found %d matches.\n', num);
idx1 = find(matchTable);
idx2 = matchTable(idx1);
x1 = loc1(idx1,2);
x2 = loc2(idx2,2);
y1 = loc1(idx1,1);
y2 = loc2(idx2,1);
matchLoc1 = [x1,y1];
matchLoc2 = [x2,y2];
end
三、MATLAB仿真测试结果
A09-54