maltab-图像拼接(左右两幅图)

本文详细介绍使用Matlab进行图像拼接的过程,包括读取图像、灰度化、SURF特征点提取与匹配、MSAC算法误匹配点去除、图像变换与融合等步骤,最终实现高质量的图像拼接。

 

图像拼接

参考自 https://blog.youkuaiyun.com/m0_37565736/article/details/79865990 并修改了其中错误的地方,添加自己的讲解或者看法。

我要拼接的是一副画卷,如下(大小一样的,都是3000*4000像素)

 

 首先,就是读取图像

clear all
clc
file1='G:/picture/a.jpg';
file2='G:/picture/b.jpg';
I1=imread(file1);%读取图片
I2=imread(file2);

imgs=[I1,I2];
figure,imshow(imgs);%并排显示两幅待拼接图像
title('待拼接图像');

  但是,读出来的图像在imshow中被旋转了一下,出来是这个样子的

这样就这样吧。。不影响操作

下一步将其灰度化,并提取SURF特征点。

img1=rgb2gray(I1);
img2=rgb2gray(I2);
imageSize=size(img1); 

p1=detectSURFFeatures(img1);
p2=detectSURFFeatures(img2);%检测SURF特征点

  然后提取特征向量并加以匹配

[img1Features, p1] = extractFeatures(img1, p1);%使用64维向量表示特征描述子,
%第一个返回的参数即为每个特征点对应的特征描述子,第二个参数是特征点
[img2Features, p2] = extractFeatures(img2, p2);
boxPairs = matchFeatures(img1Features, img2Features);%特征描述子匹配

matchedimg1Points = p1(boxPairs(:, 1));%第二个参数:可以不加,因为其为n行1列的结构体数组
matchedimg2Points = p2(boxPairs(:, 2));

  

 

这时我们可以看到,匹配成功的特征点密密麻麻的,甚至篮圈里面的特征点匹配还有问题,怎么可能匹配上嘛。

所以,我们接下来要去除误匹配点,进行MSAC算法实现。另外,通过特征点匹配还得到了第二幅图的变换矩阵tform,第二幅图要经过变换矩阵变成和第一幅图的坐标一致

[tform, inlierimg2Points, inlierimg1Points] = ...
estimateGeometricTransform(matchedimg2Points, matchedimg1Points, 'projective');%射影变换,tfrom映射点对1内点到点对2内点
%该函数使用随机样本一致性(RANSAC)算法的变体MSAC算法实现,去除误匹配点
%The returned geometric transformation matrix maps the inliers in matchedPoints1 
%to the inliers in matchedPoints2.返回的几何映射矩阵映射第一参数内点到第二参数内点

showMatchedFeatures(I1, I2, inlierimg1Points, ...
    inlierimg2Points, 'montage');
title('Matched Points (Inliers Only)');

  

好,精确匹配之后,看到匹配的总体就好多了,看上去很准确。把两幅图共有的部分都匹配上了。

下一步进行图像合并,tform是变换矩阵,以第一幅图像为基准坐标,第二幅图要进行变换与其对应,

Rfixed就是第一幅图的世界二维坐标。
Rfixed = imref2d(size(I1));
[registered2, Rregistered] = imwarp(I2, tform);
%[registered1, Rregistered1] = imwarp(I1, tform);
figure()
imshowpair(I1,Rfixed,registered2,Rregistered,'blend');
title('图像差异');

  

按照特征点直接来拼接,是这个样子滴,看到第二幅图经过变换矩阵后稍微倾斜了一下,然后特征点匹配后会出现两条明显的边缘,在y=0和y=1500的地方。

下面的操作就是要消除这两个边缘。让其完美的融入。

我用的是参考博客上的渐入渐出的原理。大家有好的方法欢迎给博主分享。

渐入渐出融合

所谓渐入渐出就是将两幅图重合的区域按照距离两幅图的距离按照一定的权重重新分配重合部分图画的三原色权重。比如最中间的就是0.5 0.5的比例。

那么,下一步就是找到他们重叠区域了,也就是相同掩模区。

先确定一下整体的像素大小以及两幅图的实际具体位置。

[xlim, ylim] = outputLimits(tform, [1 imageSize(2)], [1 imageSize(1)]);%输出坐标范围 x:23.8~4334 y:-1844~1447
% 找到输出空间限制的最大最小值
xMin = min([1; xlim(:)]);%1
xMax = max([imageSize(2); xlim(:)]);%4334

yMin = min([1; ylim(:)]);%-1844
yMax = max([imageSize(1); ylim(:)]);%3000

% 全景图的宽高
width  = round(xMax - xMin);
height = round(yMax - yMin);



%创建2D空间参考对象定义全景图尺寸
xLimits = [xMin xMax];
yLimits = [yMin yMax];
panoramaView = imref2d([height width ], xLimits, yLimits);

% 变换图片到全景图.
unwarpedImage = imwarp(I1,projective2d(eye(3)), 'OutputView', panoramaView);
warpedImage = imwarp(I2, tform, 'OutputView', panoramaView);

 以第一幅图为基准找到重叠区域(掩模区)

 

第三张图就是两幅图的共同区域了。我们在这个区域里面对两幅图像色彩的权重进行重新的分配,然后显示图像。

这幅图就是 第一张图的权重分配,理他近的边缘权重为1,离他最远的重合位置边缘权重为0.为了避免使用for循环增加计算时间,我只能将整个x轴范围都采用了权重再分配,而不是那个精确的重叠区域不规则图形。

[row,col] = find(mask1==1);
left = min(col);
right = max(col);%获得重叠区左右范围
up=min(row);
down=max(row);
mask = ones(size(mask1));
% figure()
% imshow(mask)
%mask(:,left:right) = repmat(linspace(0,1,right-left+1),size(mask,1),1);%复制平铺矩阵
mask(up:down,:) = repmat(linspace(1,0,down-up+1)',1,size(mask,2));%复制平铺矩阵
% BLEND EACH CHANNEL
warpedImage=double(warpedImage);
% figure()
% warpedImage=uint8(warpedImage);
% imshow(warpedImage)
% figure()
% imshow(mask)
warpedImage(:,:,1) = warpedImage(:,:,1).*mask;
warpedImage(:,:,2) = warpedImage(:,:,2).*mask;
warpedImage(:,:,3) = warpedImage(:,:,3).*mask;

% REVERSE THE ALPHA VALUE
%mask(:,left:right) = repmat(linspace(1,0,right-left+1),size(mask,1),1);
mask(up:down,:) = repmat(linspace(0,1,down-up+1)',1,size(mask,2));%复制平铺矩阵
newImage(:,:,1) = newImage(:,:,1).*mask;
newImage(:,:,2) = newImage(:,:,2).*mask;
newImage(:,:,3) = newImage(:,:,3).*mask;

newImage(:,:,1) = warpedImage(:,:,1) + newImage(:,:,1);
newImage(:,:,2) = warpedImage(:,:,2) + newImage(:,:,2);
newImage(:,:,3) = warpedImage(:,:,3) + newImage(:,:,3);

% newImage(:,:,1) = newImage(:,:,1).*black;
% newImage(:,:,2) = newImage(:,:,2).*black;
% newImage(:,:,3) = newImage(:,:,3).*black;
newImage=uint8(newImage);
figure()
imshow(newImage);
title('渐入渐出融合');

  

 

 看出,效果还是不错的,没有一点点边缘的痕迹。但是最下方有书本的阴影出现,我猜想是我对重叠区域的处理不够准确引起的。大家可以试试准确的处理这个不规则重叠区域的权重再分配。

欢迎大家向博主分享,一同学习。

 

posted on 2018-12-20 16:09 hyb965149985 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/hyb965149985/p/10150030.html

### 使用 MATLAB 实现图像配准的方法 #### 方法概述 图像配准是一种重要的数字图像处理技术,其目的是通过对两或多图像的空间变换使其在几何位置上对齐。常见的图像配准算法包括基于特征点匹配的 SURF、SIFT 和 KAZE 等[^3]。 以下是使用 MATLAB 实现图像配准的具体方法: --- #### 1. **加载待配准的图像** 在 MATLAB 中可以使用 `imread` 函数读取图像文件并将其存储为矩阵形式。 ```matlab % 加载参考图像和目标图像 referenceImage = imread('reference.jpg'); % 参考图像 targetImage = imread('target.jpg'); % 待配准的目标图像 ``` --- #### 2. **提取特征点** 利用 SURF 或 SIFT 提取图像的关键点及其描述符。这里以 SURF 算法为例: ```matlab % 创建 SURF 特征检测器对象 detector = vision.SURFPoints; % 检测关键点 pointsReference = detectSURFFeatures(referenceImage); pointsTarget = detectSURFFeatures(targetImage); % 提取特征描述子 [featuresReference, validPointsReference] = extractFeatures(referenceImage, pointsReference); [featuresTarget, validPointsTarget] = extractFeatures(targetImage, pointsTarget); ``` 上述代码实现了从两张图像中分别提取 SURF 关键点及对应的描述符[^1]。 --- #### 3. **匹配特征点** 通过计算两个图像之间的特征描述符相似度来找到最佳匹配点对。 ```matlab % 进行特征匹配 indexPairs = matchFeatures(featuresReference, featuresTarget); % 获取匹配后的关键点坐标 matchedPointsReference = validPointsReference(indexPairs(:, 1)); matchedPointsTarget = validPointsTarget(indexPairs(:, 2)); % 显示匹配结果 figure; showMatchedFeatures(referenceImage, targetImage, matchedPointsReference, matchedPointsTarget); title('Feature Matching Results'); ``` 此部分展示了如何将两组特征点进行匹配,并可视化匹配结果[^2]。 --- #### 4. **估计仿射变换参数** 根据匹配好的特征点对,估算用于校正目标图像到参考图像的几何变换模型(如刚体变换、仿射变换或透视变换)。 ```matlab % 计算仿射变换矩阵 tform = estimateGeometricTransform(matchedPointsTarget, matchedPointsReference, 'affine'); if isempty(tform) error('Not enough matching points were found.'); end ``` 此处采用最小二乘法拟合最优变换关系。 --- #### 5. **应用变换完成配准** 最后一步是对原始目标图像施加所求得的变换矩阵,得到最终配准后的图像。 ```matlab % 对目标图像执行变换操作 registeredImage = imwarp(targetImage, tform, 'OutputView', imref2d(size(referenceImage))); % 展示配准前后的对比 figure; imshowpair(referenceImage, registeredImage, 'montage'); title('Registered Image vs Reference Image'); ``` 这段脚本完成了整个图像配准流程,并提供了直观的结果展示[^4]。 --- ### 总结 综上所述,在 MATLAB 平台上借助内置工具箱能够高效便捷地实现多种类型的图像配准任务。无论是基础教学还是实际工程项目开发均具有较高实用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值