基于affine+sift+GTM算法的图像配准和三维重建算法matlab仿真

1.算法理论概述


      在计算机视觉和图像处理领域,图像配准和三维重建是两个重要的研究方向。图像配准是指将多幅图像中的同一场景进行对齐,使得它们在同一坐标系下,以便进行后续的图像处理和分析。三维重建则是指将多幅图像中的二维信息重建成三维信息,以便进行三维可视化和分析。本文将介绍基于affine+sift+GTM算法的图像配准和三维重建方法。

      affine+sift+GTM算法是一种基于特征点匹配的图像配准和三维重建方法。该方法通过提取图像的SIFT特征点,将它们进行配准,然后利用GTM模型进行三维重建。具体实现步骤如下:


数据准备

      准备多幅拍摄同一场景的图像,以及相应的摄像机参数,包括内参和外参等。


特征提取

     从每幅图像中,提取出一组SIFT特征点。SIFT是一种局部特征描述符,它可以在不同尺度和旋转角度下提取出图像中的关键点,并计算出每个关键点的特征向量,用于表示该点的局部特征。SIFT特征点的提取可以使用OpenCV等开源库进行实现。


特征匹配

      将每幅图像中的SIFT特征点进行匹配,以确定它们之间的对应关系。常用的特征匹配方法包括基于描述符距离的匹配、基于相似性度量的匹配等。匹配过程可以使用RANSAC等算法进行优化,以提高匹配的准确性。


相似变换

      根据特征点的对应关系,计算出多幅图像之间的相似变换,以实现图像的配准。常用的相似变换包括仿射变换、透视变换等。在本方法中,采用仿射变换进行图像配准。


三维重建

      根据配准后的图像,利用GTM模型进行三维重建。GTM模型是一种基于概率的统计模型,它可以将多幅图像中的二维信息重建成三维信息。具体实现步骤如下:


(1)定义GTM模型的参数,包括高斯混合数、隐变量维度等。


(2)根据配准后的图像,计算出每个像素点的深度值,并构造出一个深度图像。


(3)将深度图像作为输入,利用GTM模型进行三维重建,得到一个三维点云模型。


三维可视化

      将三维点云模型进行可视化,以便进行三维分析和处理。常用的三维可视化软件包括MeshLab、CloudCompare等。

下面给出affine+sift+GTM算法中常用的数学公式:


SIFT特征点描述符

SIFT特征点描述符是一种128维的向量,用于表示该点的局部特征。设该点的梯度方向直方图为h,共有16个方向,每个方向有8个bin,则SIFT特征点描述符为:

d = [h1,h2,...,h128]


其中,hi表示第i个bin的值。


仿射变换

仿射变换是一种线性变换,可以将一个二维图像变换到另一个二维图像。假设有一个二维点(x,y),经过仿射变换后得到的点(x',y')可以表示为:

[x' y' 1] = [x y 1] * A


其中,A是一个3*3的仿射变换矩阵,可以表示为:


A = [a11 a12 tx

a21 a22 ty

0 0 1]


其中,a11、a12、a21、a22表示缩放和旋转的参数,tx、ty表示平移的参数。


GTM模型

GTM模型是一种基于概率的统计模型,它可以将多幅图像中的二维信息重建成三维信息。假设有N个像素点,GTM模型可以表示为:

p(x) = 1/Z * sum(wj * N(x | μj,Σj))


其中,Z是归一化因子,w是权重,N(x | μj,Σj)表示多元高斯分布,μj和Σj分别表示第j个高斯分布的均值和协方差矩阵。

三维点云模型是由一组三维点构成的,在本方法中,可以表示为:

P = {(x1,y1,z1),(x2,y2,z2),...,(xn,yn,zn)}


其中,(xi,yi,zi)表示第i个三维点的坐标。


2.算法运行软件版本

MATLAB2017b


3.算法运行效果图预览




4.部分核心程序

% 定义图像缩放比例和阈值

SCALE = 5;

Threshold = 0.0000002;

%1输入2个图片

I1 = imread('pic\a1.jpg');

I2 = imread('pic\a2.jpg');


% 显示原始图像

figure;

subplot(421);

imshow(I1);title('原始图像');

subplot(422);

imshow(I2);title('原始图像');

%2图像的预处理,比如增强,滤波,去背景等等,提取目标

I1f(:,:,1) = medfilt2(I1(:,:,1),[5,5]);

I1f(:,:,2) = medfilt2(I1(:,:,2),[5,5]);

I1f(:,:,3) = medfilt2(I1(:,:,3),[5,5]);

I2f(:,:,1) = medfilt2(I2(:,:,1),[5,5]);

I2f(:,:,2) = medfilt2(I2(:,:,2),[5,5]);

I2f(:,:,3) = medfilt2(I2(:,:,3),[5,5]);

subplot(423);

imshow(I1f);title('滤波图像');

subplot(424);

imshow(I2f);title('滤波图像');


[R,C,K] = size(I1f);

I1bg   = zeros(R,C);

I2bg   = zeros(R,C);

Thresh1 = 130;

Thresh2 = 70;

for i = 1:R

   for j = 1:C

       if I1f(i,j,1) >= Thresh1 & I1f(i,j,2) >= Thresh1 &I1f(i,j,3) >= Thresh1

          I1bg(i,j) = 1;

       end

       if I1f(i,j,1) <= Thresh2 & I1f(i,j,2) <= Thresh2 &I1f(i,j,3) <= Thresh2

          I1bg(i,j) = 1;

       end 

       if I2f(i,j,1) >= Thresh1 & I2f(i,j,2) >= Thresh1 &I2f(i,j,3) >= Thresh1

          I2bg(i,j) = 1;

       end

       if I2f(i,j,1) <= Thresh2 & I2f(i,j,2) <= Thresh2 &I2f(i,j,3) <= Thresh2

          I2bg(i,j) = 1;

       end

   end

end

%去掉连通域小面积区域

I1bg   = double(bwareaopen(I1bg,20000));

I2bg   = double(bwareaopen(I2bg,20000));

SE=strel('square',20);

I1bgs  = imdilate(I1bg,SE);%图像

I2bgs  = imdilate(I2bg,SE);%图像



subplot(425);

imshow(I1bgs);title('目标提取');

subplot(426);

imshow(I2bgs);title('目标提取');


[R,C] = size(I1bg);

imgs1 = I1f;

imgs2 = I2f;

%根据提取出的目标,将图像中非目标区域置为0。

for i = 1:R

   for j = 1:C

       if I1bgs(i,j,1) == 0

          imgs1(i,j,:) = 0;

       end

       if I2bgs(i,j,1) == 0

          imgs2(i,j,:) = 0;

       end 

   end

end


subplot(427);

imshow(imgs1);title('目标提取');

subplot(428);

imshow(imgs2);title('目标提取');


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%




%3目标的特征点检测和提取,

[F_1,Vp_1]     =extractFeatures(rgb2gray(imgs1),detectKAZEFeatures(rgb2gray(imgs1),'Threshold',Threshold,'NumOctaves',3,'NumScaleLevels',SCALE));

[F_2,Vp_2]     =extractFeatures(rgb2gray(imgs2),detectKAZEFeatures(rgb2gray(imgs2),'Threshold',Threshold,'NumOctaves',3,'NumScaleLevels',SCALE));

indexPairs     = matchFeatures(F_1,F_2); %匹配提取出的特征点。

Mf_1           = Vp_1(indexPairs(:, 1)); 

Mp_1           = Mf_1.Location; 

Mf_2           = Vp_2(indexPairs(:, 2));

Mp_2           = Mf_2.Location;


Images1all     = Vp_1.Location;

Images2all     = Vp_2.Location;



X1       = Mp_1;

X2       = Mp_2;

img1s    = imgs1;

img2s    = imgs2;

[r1,c1,k] = size(img1s);

[r2,c2,k] = size(img2s);

L1       = min(r1,r2);

L2       = min(c1,c2);


Step     = 1;

Xs       = X1(1:Step:end,1);

Ys       = X1(1:Step:end,2);

Xe       = X2(1:Step:end,1)+c1;

Ye       = X2(1:Step:end,2);


%去除错误配准点后的匹配效果显示匹配结果。

figure(2);

hIm    = montage([(img1s(1:L1,1:L2,:)),(img2s(1:L1,1:L2,:))]);

img2s2 = img2s(1:L1,1:L2,:);


hold on;

plot(Xs,Ys,'r+');

hold on;

plot(Xe,Ye,'b+');

hold on

for i = 1:length(Xs)

   line([Xs(i),Xe(i)],[Ys(i),Ye(i)],'color','g');

   hold on

end

title('包含错误匹配点的配准情况');


save step1.mat imgs1 imgs2 Xs Ys Xe Ye c1X1 X2 Images1all Images2all

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容