function [I,h]=ImgMatch(I1,I2,n,aspect)
%对图像 I1 和图像 I2 进行拼接
% aspect=0 为 y 方向(水平)连接; aspect=1 为 x 方向(垂直)连接
%输入检查
error(nargchk(2,4,nargin));
if nargin==2
n=8;
aspect=0;
elseif nargin==3
aspect=0;
end
if ndims(I1)~=ndims(I2)
error('Imgage I1 must be the same as Image I2');
end
if ndims(I1)>3
error('I1 and I2 must be image');
end
if ndims(I1)~=3&&ndims(I1)~=2
error('I1 and I2 must be RGB or gray image');
end
%转换图像成灰度模式
if ndims(I1)==3
f1=rgb2gray(I1);
f2=rgb2gray(I2);
else
f1=I1;
f2=I2;
end
%兴趣点检测并进行相似度检测
[pos,avb]=LACC(f1,f2,n);
if avb==0 % 2 幅图像没有相似度
error('match error');
end
%检查 pos,去除明显错误的点
if aspect==0 %垂直拼接
for i=size(pos,1):-1:1
if pos(i,2)<pos(i,4)
pos(i,:)=[];
end
end
else %水平拼接
for i=size(pos,1):-1:1
if pos(i,1)<pos(i,3)
pos(i,:)=[];
end
end
end
x=pos(1:end,1:2)';
x(3,1:size(x,2))=1;
y=pos(1:end,3:4)';
%{
%使用用最小中值法去除错误点
[h,RX,RY,avb]=LMeds(x,y,3,52);
if avb==0
error('Image match fail');
end
pos=[RX(1:2,:);RY(:,:)];
pos=pos';
%}
%{
%进行图像角度变换
%求 4 个角点
if aspect==0 % y 向连接
corner=[1 1 size(I2,1) size(I2,1);pos(1,4) size(I2,2) pos(1,4) size(I2,2)];
else % x 向连接
corner=[pos(1,3) pos(1,3) size(I2,1) size(I2,1);1 size(I2,2) 1 size(I2,2)];
end
[I2,yy,Corner]=Affine(I2,h,y,corner); %仿射变换
%黑颜色消除
if aspect==0
minx=max(Corner(1,1),Corner(1,2));
maxx=min(Corner(1,3),Corner(1,4));
if (maxx-minx+1)/size(I2,1)>0.9
I2=I2(minx:maxx,:,:);
yy(1,:)=yy(1,:)-minx+1;
end
else
miny=max(Corner(2,1),Corner(2,3));
maxy=min(Corner(2,2),Corner(2,4));
if (maxy-miny+1)/size(I2,2)>0.9
I2=I2(:,miny:maxy,:);
yy(2,:)=yy(2,:)-miny+1;
end
end
%将图像 I2 重新转换成灰度图像
if ndims(I2)==3
f2=rgb2gray(I2);
else
f2=I2;
end
%求拼接点
f1x=x(1,1);
f1y=x(2,1);
f2x=yy(1,1);
f2y=yy(2,1);
%}
%{'
f1x=pos(1,1);
f1y=pos(1,2);
f2x=pos(1,3);
f2y=pos(1,4);
%}
[m1,n1]=size(f1);
[m2,n2]=size(f2);
%图像拼接
if aspect==0 %水平向连接
%图像对齐
if m1-f1x>m2-f2x
I1=I1(1:end-((m1-f1x)-(m2-f2x)),:,:);
elseif m1-f1x<m2-f2x
I2=I2(1:end-((m2-f2x)-(m1-f1x)),:,:);
end
if f1x>f2x
I1=I1((f1x-f2x+1):end,:,:);
elseif f1x<f2x
I2=I2((f2x-f1x+1):end,:,:);
end
%连接
%{ '
I(:,1:f1y-f2y,:)=I1(:,1:f1y-f2y,:);
%重叠段,用重叠区线性过度的方法
ymax=n1;
ymin=f1y-f2y+1;
if ymax>ymin %不是刚刚重叠
for y=ymin:ymax
jq=(ymax-y)/(ymax-ymin); %计算权值
I(:,y,:)=jq*I1(:,y,:)+(1-jq)*I2(:,y-f1y+f2y,:);
end
end
I(:,(n1+1):(n2-f2y+f1y),:)=I2(:,(n1-f1y+f2y+1):n2,:);
%}
%{
%直接连接
I(:,1:f1y,:)=I1(:,1:f1y,:);
I(:,f1y+1:n2-f2y+f1y,:)=I2(:,f2y+1:n2,:);
%}
end
if aspect==1 %垂直连接
%图像对齐
if n1-f1y>n2-f2y
I1=I1(:,1:end-((n1-f1y)-(n2-f2y)),:);
elseif n1-f1y<n2-f2y
I2=I2(:,1:end-((n2-f2y)-(n1-f1y)),:);
end
if f1y>f2y
I1=I1(:,(f1y-f2y+1):end,:);
elseif f1y<f2y
I2=I2(:,(f2y-f1y+1):end,:);
end
%连接
I(1:f1x-f2x,:,:)=I1(1:f1x-f2x,:,:);
%重叠段,用重叠区线性过度的方法
xmax=m1;
xmin=f1x-f2x+1;
if xmax>xmin %不是刚刚重叠
for x=xmin:xmax
jq=(xmax-x)/(xmax-xmin); %计算权值
I(x,:,:)=jq*I1(x,:,:)+(1-jq)*I2(x-f1x+f2x,:,:);
end
end
I((m1+1):(m2-f2x+f1x),:,:)=I2((m1-f1x+f2x+1):m2,:,:);
%}
%{
%直接连接
I(1:f1x,:,:)=I1(1:f1y,:,:);
I(f1x+1:n2-f2x+f1x,:,:)=I2(f2x+1:n2,:,:);
%}
end
使用matlab实现的基于兴趣点的图像合并
5星 · 超过95%的资源 需积分: 9 8 浏览量
2012-10-06
10:43:06
上传
评论
收藏 4KB ZIP 举报
编程的猪
- 粉丝: 3
- 资源: 7
最新资源
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
- C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip
- 常用工具集参考用于图像等数据处理
- 音乐展示网页、基于Stenography的图像数字水印添加与提取,以及基于颜色矩和Tamura算法的图像相似度评估算法py源码
- 基于EmguCV(OpenCV .net封装),图像数字水印加解密算法的实现,其中包含最低有效位算法,离散傅里叶变换算法+文档书
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈