您的位置:首页 > 编程语言 > MATLAB

matlab图像拼接融合(四种方法)

2018-03-23 20:10 1031 查看
matlab图像拼接的四种方法
 1、直接拼接,
 2、亮度调整后拼接,
 3、按距离比例融合,
 4、亮度调整后按距离比例融合

流程:
1。读入左,右图,并取出重合部分,并转化为亮度图
2。分别把每点的亮度值相加,得到一个比值
3。把比值 乘以 右图
4。再把左 各 右图 拼接
5。权重融合
左图------------重合区----------------------右图(相加)
100%-----------50%------------------------0%
0%--------------50%------------------------100%
%读入原图 (左 右)
img1=imread('2.jpg');
img2=imread('1.jpg');





%查找它们的SIFT特征,并返回匹配点对---------------------特征匹配 开始
[des1, des2] = siftMatch(img1, img2);
des1=[des1(:,2),des1(:,1)];%左右(x和y)交换 % 为过滤匹配准备参数
des2=[des2(:,2),des2(:,1)];%

%用 基础矩阵F 过滤匹配的特征点对
matchs = matchFSelect(des1, des2) %匹配位置索引(掩码)
des1=des1(matchs,:);%取出内点
des2=des2(matchs,:);

% 画出匹配特征点的连接线(好点)
drawLinedCorner(img1,des1,img2, des2) ;



1、直接拼接
[H,W,k]=size(img1);%图像大小
l_r=W-des1(1,2)+des2(1,2);%只取水平方向(第一个匹配点)重叠宽度

% 1、直接拼接-------------------------------------------------

%[H,W,k]=size(img1);
%l_r=405;%重叠宽度(W-宽 至 W)---如果不用特征匹配这里直接写重合区宽
L=W+1-l_r;%左边起点
R=W;%右边尾点
n=R-L+1;%重叠宽度:就是l_r
%直接拼接图
im=[img1,img2(:,n:W,:)];%1全图+2的后面部分
figure;imshow(im);title('直接拼接图');



2、亮度调整后拼接
%根据之前H矩阵找到的两幅图的重叠(l_r)部分
A=img1(:,L:R,:);
B=img2(:,1:n,:);
%A、B 是对应在两幅图中的重叠区域

% A=uint8(A); figure;imshow(A);
% B=uint8(B);figure;imshow(B);
%
[ma,na,ka]=size(A);
I1=rgb2gray(A);%转换为灰度图像
I1=double(I1);%转换为双精度
v1=0;
I2= rgb2gray(B);
I2=double(I2);
v2=0;
for i=1:ma
for j=1:na
%I1(i,j)=0.59*A(i,j,1)+0.11*A(i,j,2)+0.3*A(i,j,3);%按点转化为灰度图
v1=v1+I1(i,j);%所有亮度值相加(和)
%I2(i,j)=0.59*B(i,j,1)+0.11*B(i,j,2)+0.3*B(i,j,3);
v2=v2+I2(i,j);
end
end

%figure;imshow(I1,[]);
%figure;imshow(I2,[]);

%亮度比例,并按比例调整第二个图
k=v1/v2;

BB2=img2(:,n:W,:)*k;%乘比值
im2=[img1,BB2];%拼接
figure;imshow(im2);title('调整亮度后拼接图');




3、按距离比例融合
%[H,Y,t]=size(im);
C=im;%继承前图
D=im2;%继承前图(亮度)
% n=拼缝宽;
%for i=1:H %少一重循环
for j=1:n
d=1-(j)/n;%disp(d);% 距离权重
C(1:H,L+j,:)=d*A(1:H,j,:)+(1-d)*B(1:H,j,:);%互补融合
D(1:H,L+j,:)=d*A(1:H,j,:)+(1-d)*B(1:H,j,:)*k;
end
%end
C=uint8(C);
figure;imshow(C);title('直接融合拼接图');%3
D=uint8(D);
figure;imshow(D);title('亮度处理后融合拼接图');%4



4、亮度调整后按距离比例融合



完整的m文件:
%matlab图像拼接(四种方法)
% 1、直接拼接,
% 2、亮度调整后拼接,
% 3、按距离比例融合,
% 4、亮度调整后按距离比例融合

%流程:
%1。读入左,右图,并取出重合部分,并转化为亮度图
%2。分别把每点的亮度值相加,得到一个比值
%3。把比值 乘以 右图
%4。再把左 各 右图 拼接

clear;close all,clc;
%读入原图 (左 右)
img1=imread('2.jpg');
img2=imread('1.jpg');
% figure;imshow(img1);%显示
% figure;imshow(img2);

%查找它们的SIFT特征,并返回匹配点对---------------------特征匹配 开始
[des1, des2] = siftMatch(img1, img2);
des1=[des1(:,2),des1(:,1)];%左右(x和y)交换 为基础矩阵F 过滤匹配准备参数
des2=[des2(:,2),des2(:,1)];%

%用 基础矩阵F 过滤匹配的特征点对
matchs = matchFSelect(des1, des2) %匹配位置索引(掩码)
des1=des1(matchs,:);%取出内点
des2=des2(matchs,:);

% 画出匹配特征点的连接线(好点)
drawLinedCorner(img1,des1,img2, des2) ;
%------------------------------------------------------特征匹配 结束

[H,W,k]=size(img1);%图像大小
l_r=W-des1(1,2)+des2(1,2);%只取水平方向(第一个匹配点)重叠宽度

% 1、直接拼接-------------------------------------------------

%[H,W,k]=size(img1);
%l_r=405;%重叠宽度(W-宽 至 W)---如果不用特征匹配这里直接写重合区宽
L=W+1-l_r;%左边起点
R=W;%右边尾点
n=R-L+1;%重叠宽度:就是l_r
%直接拼接图
im=[img1,img2(:,n:W,:)];%1全图+2的后面部分
figure;imshow(im);title('直接拼接图');

% 2、亮度调整后拼接-------------------------------------------------
%根据之前H矩阵找到的两幅图的重叠(l_r)部分
A=img1(:,L:R,:);
B=img2(:,1:n,:);
%A、B 是对应在两幅图中的重叠区域

% A=uint8(A); figure;imshow(A);
% B=uint8(B);figure;imshow(B);
%
[ma,na,ka]=size(A);
I1=rgb2gray(A);%转换为灰度图像
I1=double(I1);%转换为双精度
v1=0;
I2= rgb2gray(B);
I2=double(I2);
v2=0;
for i=1:ma
for j=1:na
%I1(i,j)=0.59*A(i,j,1)+0.11*A(i,j,2)+0.3*A(i,j,3);%按点转化为灰度图
v1=v1+I1(i,j);%所有亮度值相加(和)
%I2(i,j)=0.59*B(i,j,1)+0.11*B(i,j,2)+0.3*B(i,j,3);
v2=v2+I2(i,j);
end
end

%figure;imshow(I1,[]);
%figure;imshow(I2,[]);

%亮度比例,并按比例调整第二个图
k=v1/v2;

BB2=img2(:,n:W,:)*k;%乘比值
im2=[img1,BB2];%拼接
figure;imshow(im2);title('调整亮度后拼接图');

% 3、按距离比例融合-------------------------------------------------
% 4、亮度调整后按距离比例融合----------------------------------------

% 图像融合消除拼接缝隙

%用的渐入渐出融合即:距离权重融合

%[H,Y,t]=size(im);
C=im;%继承前图
D=im2;%继承前图(亮度)
% n=拼缝宽;
%for i=1:H %少一重循环
for j=1:n
d=1-(j)/n;%disp(d);% 距离权重
C(1:H,L+j,:)=d*A(1:H,j,:)+(1-d)*B(1:H,j,:);%互补融合
D(1:H,L+j,:)=d*A(1:H,j,:)+(1-d)*B(1:H,j,:)*k;
end
%end
C=uint8(C);
figure;imshow(C);title('直接融合拼接图');%3
D=uint8(D);
figure;imshow(D);title('亮度处理后融合拼接图');%4


特征点匹配函数取自一个 siftDemoV4 包
matlab 7.0 运行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: