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

文章目录

    • @[TOC](文章目录)
  • 前言
  • 1、两种图片的拼接原理
    • 无重叠部分的相邻两张图片拼接
    • 有重叠部分的两张图片拼接
  • 2、 MATLAB算法实现
    • 一、程序一
    • 二、程序二
    • 三、实例

前言

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

1、两种图片的拼接原理

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

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

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

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

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

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

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

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

注意观察上图,线段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,在确保图片相邻且行数相同的话其他比例也可以。(我们在处理遥感影像时,两块无重叠区域且行数一样的图像时,可以使用以上的简单算法)

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

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

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

二、程序二

代码程序清单:
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实现(边线查找法)_第6张图片

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

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

三、实例

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

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

利用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('左右拼接结果')

结果:
两种图像拼接(无重叠相邻图&有重叠相邻图)以及matlab实现(边线查找法)_第9张图片

你可能感兴趣的:(MATLAB,/,python+图像处理,matlab,图像处理,开发语言)