文章目录

    • @[TOC](文章目录)
  • 前言
  • 1、两种图片的拼接原理
    • 无重叠部分的相邻两张图片拼接
    • 有重叠部分的两张图片拼接
  • 2、 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('左右拼接结果')

结果:

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

  1. 两种方法快速搞定高版本的cad图怎么在低版本中打开

    说起CAD,相信大多数人还是比较熟悉的,毕竟CAD图纸现在应用得很是广泛.但是有个问题,就是大家在传输CAD图纸的时候,可能大家所用的工具是不一样的,这就导致可以高版本工具做绘的图,在低版本的软件中是 ...

  2. MP4文件如何转换成GIF动态图?两种方法帮你搞定

    要将 MP4 文件转换为 GIF 动态图,您可以使用一些免费的在线工具或者软件进行转换.以下是两种常用的方法: 方法一:使用软件 1.下载并安装一个视频转换软件,例如 FFmpeg 或者 GifCam ...

  3. 宏定义有无参数宏定义和带参数宏定义两种

    宏定义有无参数宏定义和带参数宏定义两种. 无参数的宏定义的一般形式为 # define 标识符 字符序列 其中# define之后的标识符称为宏定义名(简称宏名),要求宏名与字符序列之间用空格符分隔. ...

  4. html中怎么给长方形填充颜色,PS怎么在一个矩形里填充两种颜色 ps给矩形填充两种颜色的教程...

    PS怎么在一个矩形里填充两种颜色?看到别人设计的作品中,一个矩形被填充了两种不同颜色,这是如何操作的呢?ps小白们或许还不太清楚吧,今天,小编为大家带来了ps给矩形填充两种颜色的教程.感兴趣的朋友快来 ...

  5. MATLAB中代码优化的两种方法

    MATLAB中的代码优化 MATLAB中的代码优化有两种重要的方法:预分配组和向量化循环. 我们举一个简单的例子来看,创建一个MATLAB函数来计算f(x) = sin(x / 100π): func ...

  6. matplotlib柱状图上方显示数据_使用 matplotlib 的两种姿势

    点击上"蓝字"关注我们 本文环境说明熊猫本次用的是 Anaconda 的 jupyter notebook 编写的本文代码.今天用到的库都是已经集成好的,无须另行安装.每个库的版本 ...

  7. AS | 中大丁涛/田国宝等揭示口腔菌群的差异化输入塑造了与健康状况相关的两种肺型...

    口腔菌群的差异化输入塑造了与健康状况相关的两种肺型 Differential oral microbial input determines two microbiota pneumo-types a ...

  8. 环形文字拉直的两种方法:极坐标转换和薄板样条插值python代码示例

    目录 引言 极坐标转换 方案一: 方案二: 薄板样条插值法 引言 针对环形文字识别,通过这几天调研,一般有两种方法,一是极坐标转换:二是薄板样条插值(TPS)法. 极坐标转换 方案一: 代码来源:Se ...

  9. 在Web项目中保存会话的两种方法:Cookie和Session

    Web浏览器是与Web服务器之间的会话是一个不保持的会话,浏览器发起请求,建立会话,获得结果后,会话就不在了.然而,在涉及到用户登录Web项目中,开发人员必须有一种方法,区分用户登录前后的状态,以便对 ...

最新文章

  1. PyTorch: 序列到序列模型(Seq2Seq)实现机器翻译实战
  2. python值nonzero函数的解析
  3. Android --- RecycleView获取第 i 个 item 里面的控件并进行赋值
  4. 在java中重写方法应遵循规则的包括_Java面试题集合篇二
  5. 在android开发中使用multdex的方法-IT蓝豹为你整理
  6. python中文开发环境_Python开发环境配置
  7. 定时任务框架APScheduler学习详解
  8. 英语发音规则---S字母
  9. AMD授权GPU给Intel?苏姿丰:没有的事
  10. 7-2 有理数比较 (10 分)
  11. Rayman的绝顶之路——Leetcode每日一题打卡2
  12. 如何操作最快的硬盘对拷工具
  13. 嵌入式软件项目流程、项目启动说明书(示例)
  14. 钉钉本地开发环境配置(H5微应用)
  15. 单反镜头焦距光圈与景深的关系
  16. 计算机连不了无线网络,如何解决电脑连接不上家里路由器的无线网
  17. RBGA8888转nv21
  18. 英语前缀 2011年8月16日15:55:43
  19. 机器学习算法(4)—— 决策树算法
  20. 关于模拟器拉取文件的多种方式

热门文章

  1. SQL中grant的用法
  2. DTCC2014:钱岭:电信运营商大数据平台和应用实践
  3. 数据分析 -- 用户流失
  4. 精彩英语写作200句对译
  5. 如何在官网上下载Java JDK的历史版本
  6. ffmpeg锐化算法
  7. Win 8预览版将上市 首批应用名单出炉
  8. Linux 往事:一个不会像 GNU 那样大而专业的 OS 是如何成为主流的?
  9. 关于Android写入文件失败的问题
  10. 七年级 电子计算机 教材分析,七年级信息技术教学计划表