基于SIFT的图像Matlab拼接教程

这篇具有很好参考价值的文章主要介绍了基于SIFT的图像Matlab拼接教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

图像拼接技术,将普通图像或视频图像进行无缝拼接,得到超宽视角甚至360度的全景图,这样就可以用普通数码相机实现场面宏大的景物拍摄。利用计算机进行匹配,将多幅具有重叠关系的图像拼合成为一幅具有更大视野范围的图像,这就是图像拼接的目的。

一、技术路线

sift matlab,图像处理,图像处理,人工智能,影像拼接,Powered by 金山文档

图1 基于SIFT图像拼接技术路线图

二、实现过程

2.1 SIFT特征点提取

Sift算法的三大工序为:(1)提取关键点;(2)对关键点附加详细的信息(局部特征)也就是所谓的描述器;(3)通过两方特征点(附带上特征向量的关键点)的两两比较找出相互匹配的若干对特征点,也就建立了景物间的对应关系。即可以归结为在不同尺度空间上查找特征点(关键点)的问题。

sift matlab,图像处理,图像处理,人工智能,影像拼接,Powered by 金山文档

图2 SIFT算法流程

提取关键点和对关键点附加详细的信息(局部特征)也就是所谓的描述器可以称做是Sift特征的生成,即从多幅图像中提取对尺度缩放、旋转、亮度变化无关的特征向量,Sift特征的生成一般包括以下几个步骤:

  • 构建尺度空间,检测极值点,获得尺度不变性;

  • 特征点过滤并进行精确定位;

  • 为特征点分配方向值;

  • 生成特征描述子。

以特征点为中心取16*16的邻域作为采样窗口,将采样点与特征点的相对方向通过高斯加权后归入包含8个bin的方向直方图,最后获得4*4*8的128维特征描述子。

当两幅图像的Sift特征向量生成以后,下一步就可以采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取图1的某个关键点,通过遍历找到图像2中的距离最近的两个关键点。在这两个关键点中,如果次近距离除以最近距离小于某个阙值,则判定为一对匹配点。

SIFT算法实现分为两个部分,第一个函数sift(img)函数输入1张图像,返回图像特征点;第二个函数siftMatch(img1,img2)输入两张图像,进行两张图像的匹配。

(1)函数1:返回图像的SIFT特征点

function [descriptors, locs] = sift(img)
% 本函数返回图像的SIFT特征点
function [descriptors, locs] = sift(img)
%输入彩色影像,转换为灰度图.
img = rgb2gray(img);
[rows, cols] = size(img);  
f = fopen('tmp.pgm', 'w');
if f == -1
error('Could not create file tmp.pgm.');
end
fprintf(f, 'P5\n%d\n%d\n255\n', cols, rows);
fwrite(f, img', 'uint8');
fclose(f); 
ifisunix
command = '!./sift ';
else
command = '!siftWin32 ';
end
command = [command ' <tmp.pgm>tmp.key'];
eval(command); 
g = fopen('tmp.key', 'r');
if g == -1
error('Could not open file tmp.key.');
end
[header, count] = fscanf(g, '%d %d', [1 2]);
if count ~= 2
error('Invalid keypoint file beginning.');
end
num = header(1);
len = header(2);
iflen ~= 128
error('Keypoint descriptor length invalid (should be 128).');
end
% 输出矩阵
locs = double(zeros(num, 4));
descriptors = double(zeros(num, 128));
fori = 1:num
    [vector, count] = fscanf(g, '%f %f %f %f', [1 4]); %row col scale ori
if count ~= 4
error('Invalid keypoint file format');
end
locs(i, :) = vector(1, :);

    [descrip, count] = fscanf(g, '%d', [1 len]);
if (count ~= 128)
error('Invalid keypoint file value.');
end
descrip = descrip / sqrt(sum(descrip.^2));
descriptors(i, :) = descrip(1, :);
end
fclose(g); 
delete('tmp.pgm');

(2)函数2:读入两幅图像,寻找它们的SIFT特征,显示相互匹配的特征点的连线

function [matchLoc1 matchLoc2] = siftMatch(img1, img2)
% 本函数读入两幅图像,寻找它们的SIFT特征,显示相互匹配的特征点的连线
% 返回两幅图像相匹配的特征点
function [matchLoc1 matchLoc2] = siftMatch(img1, img2)
% 寻找两幅图的特征点
[des1, loc1] = sift(img1);
[des2, loc2] = sift(img2);
distRatio = 0.6;   
%为第一幅的特征点寻找匹配的第二幅图中的特征点
des2t = des2';                         
matchTable = zeros(1,size(des1,1));
fori = 1 : size(des1,1)
dotprods = des1(i,:) * des2t;       
   [vals,indx] = sort(acos(dotprods));  
if (vals(1) <distRatio * vals(2))
matchTable(i) = indx(1);
else
matchTable(i) = 0;
end
end
%保存匹配数据和匹配表
%将两幅图像并排显示
img3 = appendimages(img1,img2);
% 在两幅图中画出可以接受的相互匹配的特征点连线
figure('Position', [100 100 size(img3,2) size(img3,1)]);
colormap('gray');
imagesc(img3);
holdon;
cols1 = size(img1,2);
fori = 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', 'c');
end
end
holdoff;
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

2.2 RANSAC算法进行图像配准

在进行两幅或多幅图像间的镶嵌及配准时,通常情况下都会有一个参考图像或者基准图像作为处理的标准。其中就需要建立原始图像到参考图像的变换模型,而模型参数的稳健估计就成了关键技术之一。在实际问题中,得到的数据往往并不是完全准确的,常常伴随着许多异常数据,于是问题的关键在于如何处理不符合实际模型的异常数据。

一个简单的例子是从一组观测数据中找出合适的2维直线。假设观测数据中包含局内点和局外点,其中局内点近似的被直线所通过,而局外点远离于直线。简单的最小二乘法不能找到适应于局内点的直线,原因是最小二乘法尽量去适应包括局外点在内的所有点。相反,RANSAC能得出一个仅仅用局内点计算出模型,并且概率还足够高。但是,RANSAC并不能保证结果一定正确,为了保证算法有足够高的合理概率,我们必须小心的选择算法的参数。

sift matlab,图像处理,图像处理,人工智能,影像拼接,Powered by 金山文档

图3 左图:包含很多局外点的数据集;右图:RANSAC找到的直线(局外点并不影响结果)

RANSAC只能从特定的数据集中估计出一个模型,如果存在两个(或多个)模型,RANSAC不能找到别的模型。

% RANSAC 实现函数
[H corrPtIdx] = ransac1(pts1,pts2,coef,@solveHomo,@calcDist);
……
% ransac1函数返回单应矩阵H和满足距离阈值的点的下标
function [f inlierIdx] = ransac1( x,y,ransacCoef,funcFindF,funcDist )
minPtNum = ransacCoef.minPtNum; %用于拟合模型所需最少的样本点个数
iterNum = ransacCoef.iterNum;   %迭代·次数
thInlrRatio = ransacCoef.thInlrRatio; %局内点数量阈值
thDist = ransacCoef.thDist;   % 局内点到模型线之间距离阈值
ptNum = size(x,2);     %特征点矩阵的列数
thInlr = round(thInlrRatio*ptNum);%局内点数量阈值,小于该值的模型舍弃
inlrNum = zeros(1,iterNum);%存放每次构建模型后,满足距离阈值的点个数
fLib = cell(1,iterNum);%存放所有构建的单应模型
%迭代计算
for p = 1:iterNum
    % 1.fit using random points
    sampleIdx = randIndex(ptNum,minPtNum);%从162个特征点中选择四个,用于构建单应矩阵
    f1 = funcFindF(x(:,sampleIdx),y(:,sampleIdx));%构建单应矩阵,即某种模型
    
    % 2.count the inliers, if more than thInlr, refit; else iterate
    dist = funcDist(f1,x,y);%计算所有特征点到模型的距离
    inlier1 = find(dist<thDist);%满足距离阈值的点的下标
    inlrNum(p) = length(inlier1);%满足条件的点个数
    if length(inlier1) <thInlr, continue; end  %点个数小于点个数阈值,舍弃该模型
    fLib{p} = funcFindF(x(:,inlier1),y(:,inlier1));%重构模型
end

% 3.choose the coef with the most inliers
[xxx,idx] = max(inlrNum);%xxx为最多的点个数;idx为xxx值出现的下标(xxx值相同的模型也是相同的)
f = fLib{idx};%确定最后的模型
dist = funcDist(f,x,y);%特征点到模型距离
inlierIdx = find(dist<thDist);%满足距离阈值的点的下标

end

2.3 图像配准——单应矩阵求解

为了实现影像匹配,在提取特征点后,变换矩阵H的求解是图像配准的核心。主要用到RANSAC函数迭代精炼H变换矩阵。

函数solveHomo和函数calcDist在RANSAC函数中被反复调用,最终得到最优点及对应的单应矩阵H。

在实际计算中仍把单应性矩阵作为9个元素来处理,这是由于齐次坐标变换之后仍需归一化得到实际坐标,因此对应点组数n至少需要5个,才能保证方程组有解。

function H = solveHomo(pts1,pts2)

%输入左右像对应的特征点,输出变换矩阵H
% RANSAC函数每次迭代中被调用

n = size(pts1,2);
A = zeros(2*n,9);
A(1:2:2*n,1:2) = pts1';
A(1:2:2*n,3) = 1;
A(2:2:2*n,4:5) = pts1';
A(2:2:2*n,6) = 1;
x1 = pts1(1,:)';
y1 = pts1(2,:)';
x2 = pts2(1,:)';
y2 = pts2(2,:)';
A(1:2:2*n,7) = -x2.*x1;
A(2:2:2*n,7) = -y2.*x1;
A(1:2:2*n,8) = -x2.*y1;
A(2:2:2*n,8) = -y2.*y1;
A(1:2:2*n,9) = -x2;
A(2:2:2*n,9) = -y2;           %构造系数矩阵

[evec,tt] = eig(A'*A);       %求特征值和特征向量
H = reshape(evec(:,1),[3,3])';
H = H/H(end); % make H(3,3) = 1

end

2.4 图像合成

由于普通的相机在拍摄照片时会自动选取曝光参数,这会使输入图像之间存在亮度差异,导致拼接后图像缝合线两端出现明显的明暗变化。因此,在融合过程中需要对缝合线进行处理,以平滑两幅图像两端的明暗差异。进行图像拼接缝合线的方法有很多种,如颜色插值和多分辨率样条技术等,本次研究使用了快速简单的加权平滑算法处理拼接缝问题。

图像重叠区域中像素点的灰度值Pixel由两幅图像对应点的灰度值Pixel_L和Pixel_R加权均得到,即Pixel=k*Pixel_L+(1-k)*Pixel_R。其中k是可调因子。通常情况下,0<k<1,即在重叠区域中,沿图像1向图像2的方向,k由1渐变为0,从而实现重叠区域的平滑拼接。为使图像重叠区域中的点与两幅图像建立更大的相关性,令k=d1/(d1+d2),其中d1,d2分别表示重叠区域中的点到两幅图像重叠区域的左边界和右边界的距离,即用公式Pixel=d1/(d1+d2)*Pixel_L+d2/(d1+d2)*Pixel_R,进行缝合线处理。

本算法主要包括两个部分:

  • 拼接前对图像1的灰度值向图像2一次线性拟合;

  • 匹配后的图像1和图像21进行拼接。主要算法及说明如下:

% 对灰度图像进行调整
[M1 N1 dim] = size(img1);
[M2 N2 dim2] = size(img2);%获取图像1和2的行列号及灰度值
%自动调整灰度
if exist('adjColor','var') &&adjColor == 1
    radius = 2;
    x1ctrl = matchLoc1(corrPtIdx,1);
    y1ctrl = matchLoc1(corrPtIdx,2);
    x2ctrl = matchLoc2(corrPtIdx,1);
    y2ctrl = matchLoc2(corrPtIdx,2); %获取图像1和2 特征点的位置
    ctrlLen = lenth(corrPtIdx);%获取匹配的特征点的个数
    s1 = zeros(1,ctrlLen);
    s2 = zeros(1,ctrlLen);%生成两个2维矩阵,分别用于存储各特征点的灰度值
%分别取两幅图像四周点灰度值
    for color = 1:dim
        for p = 1:ctrlLen
            left = round(max(1,x1ctrl(p)-radius));
            right = round(min(N1,left+radius+1));
            up = round(max(1,y1ctrl(p)-radius));
            down = round(min(M1,up+radius+1));
            s1(p) = sum(sum(img1(up:down,left:right,color))); 
        end
        for p = 1:ctrlLen
            left = round(max(1,x2ctrl(p)-radius));
            right = round(min(N2,left+radius+1));
            up = round(max(1,y2ctrl(p)-radius));
            down = round(min(M2,up+radius+1));
            s2(p) = sum(sum(img2(up:down,left:right,color)));
        end
%采用直线线性拟合出图像1与图像2之间的灰度值关系
        sc = (radius*2+1)^2*ctrlLen;
        adjcoef = polyfit(s1/sc,s2/sc,1);
%使用拟合出的直线方程改变图像1的灰度值,使得图像1的灰度整体趋向于图像2
        img1(:,:,color) = img1(:,:,color)*adjcoef(1)+adjcoef(2);
    end
end
% 进行拼接
pt = zeros(3,4);
pt(:,1) = H*[1;1;1];
pt(:,2) = H*[N2;1;1];
pt(:,3) = H*[N2;M2;1];
pt(:,4) = H*[1;M2;1];
x2 = pt(1,:)./pt(3,:);
y2 = pt(2,:)./pt(3,:);%生成3*4矩阵,存储图像2经过变换后的上边界和左边界
%确定图像1和图像2拼接位置,以图像1左上角为基准坐标原点
up = round(min(y2)); %获取图像2上顶点
Yoffset = 0; %图像1上顶点
if up <= 0
    Yoffset = -up+1;
    up = 1;
end
left = round(min(x2)); %获取图像2左顶点
Xoffset = 0;%图像1左顶点
if left<=0
    Xoffset = -left+1;
    left = 1;
end
[M3 N3 dim3] = size(img21); %获取图像21的大小
%图像拼接输出
imgout(up:up+M3-1,left:left+N3-1,:) = img21;
%图像1放置在图像21上面
imgout(Yoffset+1:Yoffset+M1,Xoffset+1:Xoffset+N1,:) = img1;
end

三、实验结果

(1)普通照片

拼接前

sift matlab,图像处理,图像处理,人工智能,影像拼接,Powered by 金山文档

拼接后

sift matlab,图像处理,图像处理,人工智能,影像拼接,Powered by 金山文档

(2)无人机照片

拼接前

sift matlab,图像处理,图像处理,人工智能,影像拼接,Powered by 金山文档

拼接后

sift matlab,图像处理,图像处理,人工智能,影像拼接,Powered by 金山文档

四、结论

经过本次研究发现,基于SIFT图像拼接效果较好,但是从最后得到的结果图中可以看出仍然存在一些问题。

  • 对于两幅光照或色彩差异较大的图像,仅仅消除可见拼接缝是不够的,还是会有明显的过渡带现象,而且拼接图像看起来也不真实

  • 将该算法运用到无人机影像拼接中发现,此次拼接仍存在明显的拼接痕迹。我们认为是找到的特征点存在一定的误差,此外还受到原本影像拍摄环境等拍摄因素的影响,虽然拼接后两张照片光照和色度基本上很匹配,但是存在明显拼接痕迹。

代码(包括博客介绍的样例数据)已公开到资源中去(https://download.csdn.net/download/u010329292/87677085),供大家交流学习:)文章来源地址https://www.toymoban.com/news/detail-787480.html

到了这里,关于基于SIFT的图像Matlab拼接教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于SIFT算法的图像匹配

    基本概念 尺度不变特征转换(Scale-invariant feature transform,简称SIFT) ,是一种用来侦测与描述影像中的局部性特征的算法,它在空间尺度中寻找极值点,提取位置、尺度、旋转不变量,生成特征描述子。 SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点

    2024年01月19日
    浏览(82)
  • Opencv C++ SIFT特征提取(单图像,多图像)+如何设置阈值+如何对文件夹进行批处理+如何设置掩膜裁剪影像

    SIFT(Scale-Invariant Feature Transform)是一种用于图像处理和计算机视觉的特征提取算法。由David Lowe于1999年首次提出,它是一种非常有效的局部特征描述符,具有尺度不变性、旋转不变性和对部分遮挡的鲁棒性。 SIFT特征提取的主要步骤包括: 尺度空间极值检测(Scale-Space Extrem

    2024年01月19日
    浏览(45)
  • 基于SIFT图像特征识别的匹配方法比较与实现

    目前常用的匹配器有 BFMatcher and FlannBasedMatcher 1.1 BFMatcher BFMatcher 全称是 Brute-Force Matcher (直译即为暴力匹配器) 大致原理: 对于 img1 中的每个描述符, BFMatcher 将其与 img2 中的所有描述符进行比较;它计算两个描述符之间的距离度量(例如,欧几里得距离或汉明距离,默认使

    2024年02月09日
    浏览(47)
  • 【教程】Autojs使用OpenCV进行SIFT/BRISK等算法进行图像匹配

    转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn]         此代码可以替代内置的images.findImage函数使用,但可能会误匹配,如果是对匹配结果要求比较高的,还是得谨慎使用。

    2024年02月07日
    浏览(50)
  • 基于matlab的数字图像处理之彩色图像处理

    一、实验目的 (1)了解如何利用RGB分量生成简单的图像。 (2)熟练掌握RGB彩色模型转换到HIS彩色模型的过程。 (3)熟练掌握RGB图像的彩色分割。 (4)熟练掌握彩色图像如何在向量空间中进行边缘检测。 二、实验仪器(软件平台)     计算机、MATLAB软件 三、实验原理

    2024年02月06日
    浏览(48)
  • 【图像处理】基于matlab蚁群聚类图像边缘检测

    目录 基于matlab蚁群聚类图像边缘检测 蚁群聚类是一种模拟自然界中蚂蚁群体行为的算法,常用于解决优化问题。该算法可以用于图像处理中的边缘检测。下面给出一个基于MATLAB的蚁群聚类图像边缘检测的示例代码。 我们首先读入待处理图像,并将其转换为灰度图像。然后,

    2023年04月22日
    浏览(52)
  • 基于MATLAB的激光光斑图像处理算法

    常用的激光光斑中心检测算法有均值法、重心法及Hough变换法、圆拟合等。本设计拟采用圆拟合对激光光斑进行检测。 激光光斑原始图像中光斑内部光强分布不均匀,且图像偏暗,对比度较差,不利于原始信号特征量的提取,因此必须进行预处理。首先,需要对光斑图像进行

    2024年02月16日
    浏览(45)
  • SIFT 算法 | 如何在 Python 中使用 SIFT 进行图像匹配

    人类通过记忆和理解来识别物体、人和图像。你看到某件事的次数越多,你就越容易记住它。此外,每当一个图像在你的脑海中弹出时,它就会将该项目或图像与一堆相关的图像或事物联系起来。如果我告诉你我们可以使用一种称为 SIFT 算法的技术来教机器做同样的事情呢?

    2024年02月13日
    浏览(42)
  • 【图像处理】基于MATLAB的RGB车牌识别

    目录 基于MATLAB的RGB车牌识别 基于MATLAB的RGB车牌识别通常可以分为以下步骤: 读入待处理图像,将RGB图像转换为HSV图像; 提取HSV图像中的Hue和Saturation通道; 利用颜色索引表的方式对提取出的Hue和Saturation进行阈值分割,得到二值化图像; 对二值化图像进行形态学操作,实现

    2023年04月22日
    浏览(49)
  • 基于Harris角点的多视角图像全景拼接算法matlab仿真

    目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 Harris角点检测 4.2 图像配准 4.3 图像变换和拼接 4.4 全景图像优化 5.算法完整程序工程 matlab2022a         基于Harris角点的多视角图像全景拼接算法是一种在计算机视觉和图像处理领域中广泛应用

    2024年01月18日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包