ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

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

2026/9/12 10:20:41 拓冰建站 浏览量
两种图像拼接(无重叠相邻图有重叠相邻图)以及matlab实现(边线查找法) 文章目录[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]表示其中n1~图像B的列数注意Bb是列向量集合不是行向量b1,b2是列向量不是一个数第三步计算Bb列向量集合中的每一个列向量与列向量mb的差值其差值用列向量集合mx[c1,c2,c3,c4,c5,…,cn]表示其中n1~图像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制作两张无重叠左右图片 jpgimread(R-C.jpg); [row,col,~]size(jpg); mx_colceil(col*0.5); jpg_leftjpg(:,(1:mx_col),:); jpg_rightjpg(:,(mx_col1: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(裁剪后的无重叠右图片); %拼接两个无重叠且相邻的图片 image1jpg_left; image2jpg_right; %整个图片拼接的核心部分是下面这一句 image[image1,image2]; figure; imshow(image); title(无重叠左右图片拼接结果);运行结果必要解释介于我这个算法需要两张图片的行数必须相同但由于某些电脑软件裁剪图片有误差会导致两张图片的行数不同而且网络上也很难找到左右相邻接而且行数相同的图片所以就利用matlab制作了两张邻接图片左右比例1:1在确保图片相邻且行数相同的话其他比例也可以。我们在处理遥感影像时两块无重叠区域且行数一样的图像时可以使用以上的简单算法下图为上面两张图的拼接结果利用语句 *image[image1,image2];*进行简单拼接。二、程序二代码程序清单rgb2gray函数此函数用于将图像转为灰度图像是为了方便计算重叠区域的位置[行数列数]find(矩阵条件)此函数用于查找矩阵中符合某条件的元素的行列位置%首先利用matlab制作两张有重叠部分的左右图片 jpg1imread(R-C.jpg); [row1,col1,mix]size(jpg1); %注意此处我采用的比例,即左图占原图左基准的7/10右图占原图右基准的7/10重叠部分是2/10 mx_col1ceil(col1*0.7); jpg_left1jpg1(:,(1:mx_col1),:); jpg_right1jpg1(:,(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(裁剪后的有重叠右图片); %拼接两个有重叠且相邻的图片 image3jpg_left1; image4jpg_right1; [rows3,cols3,m3]size(image3); [rows4,cols4,m4]size(image4); dou_image3rgb2gray(image3); dou_image4rgb2gray(image4); mbdou_image3(:,cols3); mxabs(dou_image4(:,:)-mb); sum_mxsum(mx); min_mxmin(sum_mx); [rows,cols]find(sum_mxmin_mx); mx_image4image4(:,(cols:cols4),:); image[image3,mx_image4]; figure; imshow(image); title(有重叠左右图片拼接结果)运行结果必要解释下面的两张重叠图片的重叠度占总图片的2/10同样其两张图片的行数必须要相同才能利用这个算法进行拼接对上面的两张重叠图片的拼接结果三、实例废话不多说我们直接将上面的思想应用于实例。利用matlab进行对图像直接处理效果很明显没有出现错位和悬挂。image3imread(待拼接左.jpg); image4imread(待拼接右.jpg); [rows3,cols3,m3]size(image3); [rows4,cols4,m4]size(image4); dou_image3rgb2gray(image3); dou_image4rgb2gray(image4); mbdou_image3(:,cols3); mxabs(dou_image4(:,:)-mb); sum_mxsum(mx); min_mxmin(sum_mx); [rows,cols]find(sum_mxmin_mx); mx_image4image4(:,(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(左右拼接结果)结果