基于Matlab的图像拼接与拼接后平均剪切实现
本例程主要实现:两张有重叠部分的PNG格式文件,通过灰度化、角点检测、特征点提取、NCC算法匹配和RANSAC算法滤除误匹配完成两张图像的拼接并保存拼接图像,最后并将拼接后的图像平均大小裁剪成两部分。
目录
主函数
效果一
效果二
主函数:
clc; clear all; close all % img1 = imread(projection_a.png);%读取拼接图1 % img2 = imread(projection_b.png);%读取拼接图2 img1 = imread(GDUT_left.png);%读取拼接图1 img2 = imread(GDUT_right.png);%读取拼接图2 img1Dup=rgb2gray(img1);%拼接图1灰度化 figure,imshow(img1Dup);%显示灰度化的拼接图1 title(Input gray image1); img1Dup=double(img1Dup);%转化为double数据类型 img2Dup=rgb2gray(img2);%拼接图2灰度化 figure,imshow(img2Dup);%显示灰度化的拼接图2 title(Input gray image2); img2Dup=double(img2Dup);%转化为double数据类型 %使用Harris角点检测进行特征点提取 [locs1] = Harris(img1Dup);%locs1存储拼接图1检测到的角点坐标 [locs2] = Harris(img2Dup);%locs2存储拼接图2检测到的角点坐标 %利用NCC匹配算法去寻找两幅图像之间的对应关系(相似程度),匹配好的特征点用红色线进行连接 %NCC(Normalized cross correlation)--归一化的交叉相关性 %matchLoc1存储拼接图1进行NCC匹配好的角点坐标 %matchLoc2存储拼接图2进行NCC匹配好的角点坐标 [matchLoc1 matchLoc2] = findCorr(img1Dup,img2Dup,locs1, locs2); %使用RANSAC算法滤除误匹配,寻找一个最佳单应矩阵H,RANSAC滤除匹配后特征点用蓝色线进行连接 %单应矩阵:同一平面下的点,从一个图像到另一个图像的投影映射 %RANSAC(RANdom SAmple Consensus)--随机抽样一致 %inlierIdx为RANSAC算法滤除误匹配后留下的特征点索引 [H inlierIdx] = estHomography(img1Dup,img2Dup,matchLoc2,matchLoc1); %打印单应矩阵H H %拼接图1和拼接图2进行拼接,得到拼接后图像imgout [imgout]=warpTheImage(H,img1,img2); %显示拼接后的图像 figure,imshow(uint8(imgout)); title(final mosaicing image); %保存拼接后的图片 imwrite(uint8(imgout), projection_mosaicing.jpg, jpg); %拼接图像裁剪为两部分 imgout_gray = rgb2gray(imgout); [m,n]=size(imgout_gray); X1 = imcrop(imgout,[0,0,n/2,m]); X2 = imcrop(imgout,[n/2,0,n/2,m]); figure,imshow(X1);%显示裁剪图1 figure,imshow(X2);%显示裁剪图2
效果一:
输入的两张png图像(注:jpgmp等格式图像本例程也适用):
拼接图1(GDUT_left.png) 拼接图2(GDUT_right.png)
NCC匹配算法去寻找两幅图像之间的对应关系(相似程度):
使用RANSAC算法滤除误匹配,寻找一个最佳单应矩阵H,RANSAC滤除匹配后特征点用蓝色线进行连接:
拼接图1和拼接图2进行拼接后图像:
拼接后图像裁剪为大小相同的两部分:
效果二:
换一份图像进行测试:
输入的两张png图像(注:jpgmp等格式图像本例程也适用):
拼接图1(HAUT_left.png) 拼接图2(HAUT_right.png)
NCC匹配算法去寻找两幅图像之间的对应关系(相似程度):
使用RANSAC算法滤除误匹配,寻找一个最佳单应矩阵H,RANSAC滤除匹配后特征点用蓝色线进行连接:
拼接图1和拼接图2进行拼接后图像:
拼接后图像裁剪为大小相同的两部分: