两种图像拼接(无重叠相邻图&有重叠相邻图)以及matlab实现(边线查找法)

前言

在我们处理遥感图像的时候,会遇到相邻两个地区的图像拼接的情况;或者是在摄影测量时,旁向或航向的具有一定重叠度的照片又该如何进行拼接?情况有很多,下面主要介绍两种特殊情况下图像拼接原理以及matlab实现。
需要注意的是,下面所进行处理的图片像元行数必须相同,列数没有要求。

1、两种图片的拼接原理

无重叠部分的相邻两张图片拼接

在进行下图流程之前先普及一个matlab拼接矩阵的原理
假设有两个矩阵
在这里插入图片描述
在这里插入图片描述
那么利用matlab中矩阵拼接既有 c=[a,b]
在这里插入图片描述
那我们只要将两张图像看成两个矩阵,便能够进行拼接

在这里插入图片描述

有重叠部分的两张图片拼接

其实有重叠部分的两张图片的拼接可以间接转换为无重叠部分的图片拼接,只要求出两张图片的重叠部分,然后让其中一张减去重叠部分,这样进行的拼接就是相邻无重叠的图片拼接。

在这里插入图片描述

那该如何求其重叠部分呢?网上有很多方法,大概有以下两种:
1、求两张图片的像元相关性,相关性最大的部分即为两张图片的重叠部分
2、一般两个有大于30%重叠度的两张图片,其中肯定有公共特征点,找到这些特征点,经过配准这些特征点也能找到重叠部分
注:上面的两种方法很困难,且运算量很大,对于初学者来说,利用matlab实现确实很困难。

在这里插入图片描述

注意观察上图,线段L具有两个身份,只要找到这两个身份就行,步骤如下:
以下对图像A还是图像B的计算都是要在将其彩色图转换为灰度图前提下进行的
第一步:身份1即就是图像A的右边那一列,我们列向量mb表示
第二步:身份2即就是图像B的某一列,我们将图像B的每一个列向量表示成列向量集合Bb=[b1,b2,b3,b4,b5,…,bn]表示,其中n=1~图像B的列数(注意Bb是列向量集合,不是行向量,b1,b2是列向量不是一个数)
第三步:计算Bb列向量集合中的每一个列向量与列向量mb的差值,其差值用列向量集合mx=[c1,c2,c3,c4,c5,…,cn]表示,其中n=1~图像B的列数
第四步:计算列向量集合mx中的每一个列向量的和,用行向量sum_mx表示,然后计算行向量sum_mx的最小值,用min_mx表示
第五步:利用matlab里的find函数,查找最小值min_mx在行向量sum_mx中的位置信息,用[row,col]表示,其中的col表示就是线段L位于图像B的某一列的横坐标
第六步:根据找到的col,我们就可以将图像B位于col左边的部分删除,并用col右边的部分与图像A进行拼接

2、 MATLAB算法实现

一、程序一

代码程序清单:
1、ceil函数:此函数用于计算变量的整数值,其方法是向上取整。
2、subplot函数:此函数用于在figure窗口中创建分区域显示图像。语法是:subplot(要分块区域的行数,要分块区域的列数,你当前图片在总分块的位置)

%首先利用matlab制作两张无重叠左右图片
jpg=imread("R-C.jpg");
[row,col,~]=size(jpg);
mx_col=ceil(col*0.5);
jpg_left=jpg(:,(1:mx_col),:);
jpg_right=jpg(:,(mx_col+1:col),:);
figure;
subplot(2,2,[1,2]);
imshow(jpg);
title('原始图片')
subplot(2,2,3);
imshow(jpg_left);
title('裁剪后的无重叠左图片');
subplot(2,2,4);
imshow(jpg_right);
title('裁剪后的无重叠右图片');

%拼接两个无重叠且相邻的图片
image1=jpg_left;
image2=jpg_right;
%整个图片拼接的核心部分是下面这一句

image=[image1,image2];

figure;
imshow(image);
title('无重叠左右图片拼接结果');

运行结果:
必要解释:介于我这个算法需要两张图片的行数必须相同,但由于某些电脑软件裁剪图片有误差,会导致两张图片的行数不同,而且网络上也很难找到左右相邻接而且行数相同的图片,所以就利用matlab制作了两张邻接图片,左右比例1:1,在确保图片相邻且行数相同的话其他比例也可以。(我们在处理遥感影像时,两块无重叠区域且行数一样的图像时,可以使用以上的简单算法)

在这里插入图片描述

下图为上面两张图的拼接结果,利用语句 *image=[image1,image2];*进行简单拼接。

在这里插入图片描述

二、程序二

代码程序清单:
rgb2gray函数:此函数用于将图像转为灰度图像,是为了方便计算重叠区域的位置
[行数,列数]=find(矩阵==条件):此函数用于查找矩阵中符合某条件的元素的行列位置

%首先利用matlab制作两张有重叠部分的左右图片
jpg1=imread("R-C.jpg");
[row1,col1,mix]=size(jpg1);
%注意此处我采用的比例,即左图占原图左基准的7/10,右图占原图右基准的7/10,重叠部分是2/10
mx_col1=ceil(col1*0.7);
jpg_left1=jpg1(:,(1:mx_col1),:);
jpg_right1=jpg1(:,(col1-mx_col1:col1),:);
figure;
subplot(2,2,[1,2]);
imshow(jpg1);
title('原始图片')
subplot(2,2,3);
imshow(jpg_left1);
title('裁剪后的有重叠左图片');
subplot(2,2,4);
imshow(jpg_right1);
title('裁剪后的有重叠右图片');

%拼接两个有重叠且相邻的图片
image3=jpg_left1;
image4=jpg_right1;
[rows3,cols3,m3]=size(image3);
[rows4,cols4,m4]=size(image4);
dou_image3=rgb2gray(image3);
dou_image4=rgb2gray(image4);
mb=dou_image3(:,cols3);
mx=abs(dou_image4(:,:)-mb);
sum_mx=sum(mx);
min_mx=min(sum_mx);
[rows,cols]=find(sum_mx==min_mx);
mx_image4=image4(:,(cols:cols4),:);
image=[image3,mx_image4];
figure;
imshow(image);
title('有重叠左右图片拼接结果')

运行结果:
必要解释:下面的两张重叠图片的重叠度占总图片的2/10,同样其两张图片的行数必须要相同才能利用这个算法进行拼接

在这里插入图片描述

对上面的两张重叠图片的拼接结果

在这里插入图片描述

三、实例

废话不多说,我们直接将上面的思想应用于实例。

在这里插入图片描述

利用matlab进行对图像直接处理,效果很明显,没有出现错位和悬挂。

image3=imread("待拼接左.jpg");
image4=imread("待拼接右.jpg");
[rows3,cols3,m3]=size(image3);
[rows4,cols4,m4]=size(image4);
dou_image3=rgb2gray(image3);
dou_image4=rgb2gray(image4);
mb=dou_image3(:,cols3);
mx=abs(dou_image4(:,:)-mb);
sum_mx=sum(mx);
min_mx=min(sum_mx);
[rows,cols]=find(sum_mx==min_mx);
mx_image4=image4(:,(cols:cols4),:);
image=[image3,mx_image4];
figure;
subplot(2,2,1);
imshow(image3);
title('待拼接左');
subplot(2,2,2);
imshow(image4);
title('待拼接右');
subplot(2,2,[3,4]);
imshow(image);
title('左右拼接结果')

结果:
在这里插入图片描述

  • 29
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
实现图像拼接的常用方之一是重叠(overlap method),也称为图像拼接Matlab提供了许多函数和工具箱来实现图像拼接,其中最常用的是Image Processing Toolbox。以下是一些基本步骤: 1. 读取像并将其转换为灰度像。 2. 检测特征点(如SIFT或SURF)和它们的描述符。 3. 匹配特征点。 4. 估计单应性矩阵或基础矩阵,并计算透视变换。 5. 应用变换将图像拼接在一起。 以下是一个Matlab示例,演示了如何使用SURF特征点检测和匹配来拼接两张像: ```matlab % 读取像 img1 = imread('image1.jpg'); img2 = imread('image2.jpg'); % 将像转换为灰度像 gray1 = rgb2gray(img1); gray2 = rgb2gray(img2); % 检测SURF特征点和描述符 points1 = detectSURFFeatures(gray1); points2 = detectSURFFeatures(gray2); [f1, vpts1] = extractFeatures(gray1, points1); [f2, vpts2] = extractFeatures(gray2, points2); % 匹配特征点 indexPairs = matchFeatures(f1, f2); % 选择匹配点对 matchedPoints1 = vpts1(indexPairs(:, 1)); matchedPoints2 = vpts2(indexPairs(:, 2)); % 估计单应性矩阵并计算透视变换 [tform, inlierPoints1, inlierPoints2] = ... estimateGeometricTransform(matchedPoints1, matchedPoints2, 'projective'); % 应用变换将图像拼接在一起 outputView = imref2d(size(gray1)); panorama = imwarp(img2, tform, 'OutputView', outputView); panorama = imoverlay(panorama, gray1, 'blend'); % 显示拼接结果 imshow(panorama); ``` 这个示例将两个图像拼接在一起,并使用imoverlay函数将它们混合在一起。你可以根据需要调整参数和算实现更好的拼接效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楠楠星球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值