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

matlab图像拼接的四种方法
 1、直接拼接,
 2、亮度调整后拼接,
 3、按距离比例融合,
 4、亮度调整后按距离比例融合


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

4。再把左 各 右图 拼接

5。权重融合

左图------------重合区----------------------右图(相加)

100%-----------50%------------------------0%

0%--------------50%------------------------100%

%读入原图 (左 右)
img1=imread('2.jpg');
img2=imread('1.jpg');
matlab图像拼接融合(四种方法)matlab图像拼接融合(四种方法)

%查找它们的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) ;
matlab图像拼接融合(四种方法)

1、直接拼接

  1. [H,W,k]=size(img1);%图像大小
  2. l_r=W-des1(1,2)+des2(1,2);%只取水平方向(第一个匹配点)重叠宽度
  3. % 1、直接拼接-------------------------------------------------
  4. %[H,W,k]=size(img1);
  5. %l_r=405;%重叠宽度(W-宽 至 W)—如果不用特征匹配这里直接写重合区宽
  6. L=W+1-l_r;%左边起点
  7. R=W;%右边尾点
  8. n=R-L+1;%重叠宽度:就是l_r
  9. %直接拼接图
  10. im=[img1,img2(:,n:W,:)];%1全图+2的后面部分
  11. figure;imshow(im);title(‘直接拼接图’);
matlab图像拼接融合(四种方法)

2、亮度调整后拼接

  1. %根据之前H矩阵找到的两幅图的重叠(l_r)部分
  2. A=img1(:,L:R,:);
  3. B=img2(:,1:n,:);
  4. %A、B 是对应在两幅图中的重叠区域
  5. % A=uint8(A); figure;imshow(A);
  6. % B=uint8(B);figure;imshow(B);
  7. %
  8. [ma,na,ka]=size(A);
  9. I1=rgb2gray(A);%转换为灰度图像
  10. I1=double(I1);%转换为双精度
  11. v1=0;
  12. I2= rgb2gray(B);
  13. I2=double(I2);
  14. v2=0;
  15. for i=1:ma
  16. for j=1:na
  17. %I1(i,j)=0.59*A(i,j,1)+0.11*A(i,j,2)+0.3*A(i,j,3);%按点转化为灰度图
  18. v1=v1+I1(i,j);%所有亮度值相加(和)
  19. %I2(i,j)=0.59*B(i,j,1)+0.11*B(i,j,2)+0.3*B(i,j,3);
  20. v2=v2+I2(i,j);
  21. end
  22. end
  23. %figure;imshow(I1,[]);
  24. %figure;imshow(I2,[]);
  25. %亮度比例,并按比例调整第二个图
  26. k=v1/v2;
  27. BB2=img2(:,n:W,:)k;%乘比值
  28. im2=[img1,BB2];%拼接
  29. figure;imshow(im2);title(‘调整亮度后拼接图’);

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

3、按距离比例融合

  1. %[H,Y,t]=size(im);
  2. C=im;%继承前图
  3. D=im2;%继承前图(亮度)
  4. % n=拼缝宽;
  5. %for i=1:H %少一重循环
  6. for j=1:n
  7. d=1-(j)/n;%disp(d);% 距离权重
  8. C(1:H,L+j,:)=dA(1:H,j,:)+(1-d)B(1:H,j,:);%互补融合
  9. D(1:H,L+j,:)=dA(1:H,j,:)+(1-d)*B(1:H,j,:)*k;
  10. end
  11. %end
  12. C=uint8©;
  13. figure;imshow©;title(‘直接融合拼接图’);%3
  14. D=uint8(D);
  15. figure;imshow(D);title(‘亮度处理后融合拼接图’);%4
matlab图像拼接融合(四种方法)

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

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

完整的m文件:

  1. %matlab图像拼接(四种方法)
  2. % 1、直接拼接,
  3. % 2、亮度调整后拼接,
  4. % 3、按距离比例融合,
  5. % 4、亮度调整后按距离比例融合
  6. %流程:
  7. %1。读入左,右图,并取出重合部分,并转化为亮度图
  8. %2。分别把每点的亮度值相加,得到一个比值
  9. %3。把比值 乘以 右图
  10. %4。再把左 各 右图 拼接
  11. clear;close all,clc;
  12. %读入原图 (左 右)
  13. img1=imread(‘2.jpg’);
  14. img2=imread(‘1.jpg’);
  15. % figure;imshow(img1);%显示
  16. % figure;imshow(img2);
  17. %查找它们的SIFT特征,并返回匹配点对---------------------特征匹配 开始
  18. [des1, des2] = siftMatch(img1, img2);
  19. des1=[des1(:,2),des1(:,1)];%左右(x和y)交换 为基础矩阵F 过滤匹配准备参数
  20. des2=[des2(:,2),des2(:,1)];%
  21. %用 基础矩阵F 过滤匹配的特征点对
  22. matchs = matchFSelect(des1, des2) %匹配位置索引(掩码)
  23. des1=des1(matchs,:);%取出内点
  24. des2=des2(matchs,:);
  25. % 画出匹配特征点的连接线(好点)
  26. drawLinedCorner(img1,des1,img2, des2) ;
  27. %------------------------------------------------------特征匹配 结束
  28. [H,W,k]=size(img1);%图像大小
  29. l_r=W-des1(1,2)+des2(1,2);%只取水平方向(第一个匹配点)重叠宽度
  30. % 1、直接拼接-------------------------------------------------
  31. %[H,W,k]=size(img1);
  32. %l_r=405;%重叠宽度(W-宽 至 W)—如果不用特征匹配这里直接写重合区宽
  33. L=W+1-l_r;%左边起点
  34. R=W;%右边尾点
  35. n=R-L+1;%重叠宽度:就是l_r
  36. %直接拼接图
  37. im=[img1,img2(:,n:W,:)];%1全图+2的后面部分
  38. figure;imshow(im);title(‘直接拼接图’);
  39. % 2、亮度调整后拼接-------------------------------------------------
  40. %根据之前H矩阵找到的两幅图的重叠(l_r)部分
  41. A=img1(:,L:R,:);
  42. B=img2(:,1:n,:);
  43. %A、B 是对应在两幅图中的重叠区域
  44. % A=uint8(A); figure;imshow(A);
  45. % B=uint8(B);figure;imshow(B);
  46. %
  47. [ma,na,ka]=size(A);
  48. I1=rgb2gray(A);%转换为灰度图像
  49. I1=double(I1);%转换为双精度
  50. v1=0;
  51. I2= rgb2gray(B);
  52. I2=double(I2);
  53. v2=0;
  54. for i=1:ma
  55. for j=1:na
  56. %I1(i,j)=0.59*A(i,j,1)+0.11*A(i,j,2)+0.3*A(i,j,3);%按点转化为灰度图
  57. v1=v1+I1(i,j);%所有亮度值相加(和)
  58. %I2(i,j)=0.59*B(i,j,1)+0.11*B(i,j,2)+0.3*B(i,j,3);
  59. v2=v2+I2(i,j);
  60. end
  61. end
  62. %figure;imshow(I1,[]);
  63. %figure;imshow(I2,[]);
  64. %亮度比例,并按比例调整第二个图
  65. k=v1/v2;
  66. BB2=img2(:,n:W,:)k;%乘比值
  67. im2=[img1,BB2];%拼接
  68. figure;imshow(im2);title(‘调整亮度后拼接图’);
  69. % 3、按距离比例融合-------------------------------------------------
  70. % 4、亮度调整后按距离比例融合----------------------------------------
  71. % 图像融合消除拼接缝隙
  72. %用的渐入渐出融合即:距离权重融合
  73. %[H,Y,t]=size(im);
  74. C=im;%继承前图
  75. D=im2;%继承前图(亮度)
  76. % n=拼缝宽;
  77. %for i=1:H %少一重循环
  78. for j=1:n
  79. d=1-(j)/n;%disp(d);% 距离权重
  80. C(1:H,L+j,:)=dA(1:H,j,:)+(1-d)B(1:H,j,:);%互补融合
  81. D(1:H,L+j,:)=dA(1:H,j,:)+(1-d)*B(1:H,j,:)*k;
  82. end
  83. %end
  84. C=uint8©;
  85. figure;imshow©;title(‘直接融合拼接图’);%3
  86. D=uint8(D);
  87. figure;imshow(D);title(‘亮度处理后融合拼接图’);%4


特征点匹配函数取自一个 siftDemoV4 包

matlab 7.0 运行

感谢 浮华三生 的评论!

我把siftMatch放在后面,并去掉matchFSelect函数,用上包上的findHomography函数。

先在 这里下 http://www.cs.ubc.ca/~lowe/keypoints/siftDemoV4.zip

%查找它们的SIFT特征,并返回匹配点对---------------------特征匹配 开始
[des1, des2] = siftMatch(img1, img2);

%为单应矩阵过滤匹配准备参数
pts1=des1’;pts2=des2’;

%单应矩阵过滤匹配
[Ht matchs] = findHomography(pts1,pts2);
pts1=pts1(:,matchs);%取出内点
pts2=pts2(:,matchs);
des1=pts1’;%格式转回
des2=pts2’
;

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

替换前面部分

修改match函数为siftMatch:

% 此函数读取两幅图像,查找它们的SIFT特征
% 仅当匹配的距离小于与第二个最接近匹配的距离的阈值时,才接受匹配。
% 它返回两个图像的匹配点,matchLoc1 = [x1,y1;x2,y2;…]
%
%

function [matchLoc1 matchLoc2] = siftMatch(img1, img2)

% 在每个图像查找 SIFT 特征点
[des1, loc1] = mosaic_sift(img1);
[des2, loc2] = mosaic_sift(img2);

% 对于MATLAB中的效率,计算单位向量之间的点乘比欧式距离更快捷。请注意:
% 注意角的比率(单位矢量点积的反余弦)是小角度的欧氏距离之比的近似值。
%
% distRatio: 在这两队匹配中只保留矢量角从最近的第二近邻的比值小于distRatio的。
distRatio = 0.7;

% 在第一个图像中的每个描述符,选择它的匹配到第二个图像。
des2t = des2’; % 预计算矩阵转置
matchTable = zeros(1,size(des1,1));
for i = 1 : size(des1,1)
dotprods = des1(i,:) * des2t; % 计算点积向量
[vals,indx] = sort(acos(dotprods)); % 取逆余弦和排序结果

% 看看和最近的邻居角比率小于distRatio。
if (vals(1) < distRatio * vals(2))
matchTable(i) = indx(1);
else
matchTable(i) = 0;
end
end
% 保存匹配数据表

num = sum(matchTable > 0);
fprintf(‘找到 %d 对匹配点.\n’, num);

idx1 = find(matchTable);
idx2 = matchTable(idx1);
x1 = loc1(idx1,2);
x2 = loc2(idx2,2);
y1 = loc1(idx1,1);
y2 = loc2(idx2,1);

matchLoc1 = [y1,x1];%把y坐标放前面
matchLoc2 = [y2,x2];

end