首页 > 编程语言 >基于harris角点和RANSAC算法的图像拼接matlab仿真

基于harris角点和RANSAC算法的图像拼接matlab仿真

时间:2024-05-09 22:22:57浏览次数:18  
标签:RANSAC ransac 角点 Lens harris 图像

1.算法运行效果图预览

 

 

 

2.算法运行软件版本

MATLAB2022a

 

3.算法理论概述

       Harris角点检测是一种局部特征检测方法,它寻找图像中具有显著局部曲率变化的位置,即边缘转折点或角点。主要通过计算图像窗口内的自相关矩阵M,并对其特征值进行评估。Harris响应函数H由自相关矩阵M的两个主特征值 λ1​ 和λ2​ 计算得到:

 

 

 

当H值较大时,窗口内像素的变化足够大,表明可能存在角点。

 

       在图像拼接过程中,RANSAC用于在两幅图像的重叠区域找到正确的对应点对,即使数据中存在大量噪声和异常点。

 

1.随机选择一组候选点对作为基础模型(通常是仿射或透视变换模型),计算此模型参数。

 

 

 

2.应用模型参数A预测所有剩余点对是否符合模型,统计一致样本数。

 

3.重复步骤1和2一定次数(迭代次数T),选取一致样本数最多的模型作为最优模型。

 

4.设定阈值(如变换残差阈值t),确定最终的内点集合(即那些变换误差小于阈值的所有点对)。

 

5.使用内点集合重新估计变换参数,以提高精度。

 

综上所述,图像拼接流程:

 

在每幅图像中检测Harris角点,并提取特征描述符。

利用匹配算法(如SIFT、SURF等)在重叠区域找到对应的角点对。

应用RANSAC算法找出最优变换模型。

根据最优变换模型对一幅图像进行几何校正,使两幅图像的重叠部分对齐。

最后,对齐后的图像通过融合算法(如加权平均、高斯金字塔融合等)拼接成全景图像。

 

 

 

4.部分核心程序

I1_harris   = func_harris(img1,3,para_harris,scales);% 使用自定义函数计算 img1 的角点响应
I2_harris   = func_harris(img2,3,para_harris,scales);% 使用自定义函数计算 img2 的角点响应
.........................................................................
% RANSAC 方法参数设定
% RANSAC 迭代次数
Miter = 500;
% 内点距离阈值
lvls  = 0.003;
% 最小内点数量要求
nums  = 10;
% RANSAC
[ransac_points,~]=func_ransac(harris_p1,harris_p2,mpoint,Miter,lvls,nums);
 
% 存储 RANSAC 匹配得到的正确匹配点坐标
Lens         =length(ransac_points);
X1_r=zeros(1,Lens);
Y1_r=zeros(1,Lens);
X2_r=zeros(1,Lens);
Y2_r=zeros(1,Lens);
 
for i=1:Lens
    p1=ransac_points(i,1);
    p2=ransac_points(i,2);
    X1_r(i)=x1(p1);
    Y1_r(i)=y1(p1);
    X2_r(i)=x2(p2);
    Y2_r(i)=y2(p2);
end
 
figure
subplot(1,2,1);
imshow(img1);
title('RANSAC匹配点')
hold on;
plot(Y1_r,X1_r,'ro');
 
subplot(1,2,2);
imshow(img2);
title('RANSAC匹配点')
hold on;
plot(Y2_r,X2_r,'go');
% 合成一幅图像展示 RANSAC 匹配结果
figure
img_match=[img1,img2];
imshow(img_match);
title('匹配结果')
hold on;
plot(Y1_r,X1_r,'rx','LineWidth',1,'MarkerSize',8);
plot(Y2_r+size(img1,2),X2_r,'gx','LineWidth',1,'MarkerSize',8);
 
Xm1_ransac=X1_r; 
Ym1_ransac=Y1_r;
match1=zeros(Lens,2);
match1(:,1)=Xm1_ransac; 
match1(:,2)=Ym1_ransac;
 
Xm2_ransac=X2_r;
Ym2_ransac=Y2_r+size(img1,2);
match2=zeros(Lens,2);
match2(:,1)=Xm2_ransac; 
match2(:,2)=Ym2_ransac;
% 绘制匹配线段连接匹配点
for i=1:Lens
    hold on;
    plot([match1(i,2) match2(i,2)], [match1(i,1) match2(i,1)],'LineWidth',1)
end
% 计算 RANSAC 方法得到的仿射变换矩阵
H_ransac = func_affine(X2_r,Y2_r,X1_r,Y1_r);
 
 
%生成一张新的全景图
[I1_ransac,I2_ransac]=func_trans(img1,img2,H_ransac);
 
 
 
figure
I_ransac= I1_ransac+I2_ransac ;
imshow(I_ransac);
title('RANSAC拼接结果')

  

标签:RANSAC,ransac,角点,Lens,harris,图像
From: https://www.cnblogs.com/matlabworld/p/18183195

相关文章

  • 为什么在有@Transactional注解的方法,一定要加rollbackFor异常回滚的异常类型?
    在spring项目中,@Transactional注解默认会回滚运行时异常(RuntimeException)及其子类当你在一个有@Transactional注解方法里面抛了一个Expection类型的异常,呢它是不支持事务回滚的,异常继承体系我们在一个方法里面要对事务进行操作,如果要抛异常,应该抛出untimeException,不能直接......
  • Jenkins发版时报错Failed to instantiate [io.seata.spring.annotation.GlobalTransac
    Failedtoinstantiate[io.seata.spring.annotation.GlobalTransactionScanner]:Factorymethod'globalTransactionScanner'threwexception;nestedexceptionisjava.lang.ExceptionInInitializerError一开始以为是seata配置有问题,但最近也没有动过,直接执行发版脚本就没事......
  • 两个事务方法导致异常抛出Transaction rolled back because it has been marked as ro
    异常现场(背景)在springboot事物操作开发中,如果A方法调用B方法,A和B方法都在不同的类中,且A和B都加了@Transactional注解,A调用B方法时,将B方法trycatch了。代码:@ServicepublicclassBService{@Transactional(rollbackFor=Exception.class)publicvoidb......
  • DAPPER 事务 TRANSACTION
    https://www.cnblogs.com/friend/p/16754184.html\ publicasyncTask<int>Save(longmoldProducedProductId,List<MoldStandardResource>list){intresult=0;stringdelSql="DeleteMoldStandardResourceWhereMoldProducedProductId......
  • [转帖]MySQLdump之single-transaction详解
     作者:@张扶摇本文为作者原创,转载请注明出处:https://www.cnblogs.com/zhangshengdong/p/9196128.html目录MySQLdump之single-transaction详解single-transaction保存点的日志分析查看当前会话级别导出文件的字符集类型MySQLdump之single-transaction详解single-transact......
  • Java开启事务(@Transactional)
    开始事务的代码可以使用Spring的事务管理器来实现。具体步骤如下:1.在Spring配置文件中配置事务管理器和事务通知器:```<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><propertyname="dataSource"ref="......
  • 2.Harris角点检测
    将输入图像转换为灰度图像。计算图像的梯度,可以使用Sobel算子计算水平和垂直方向的梯度。对图像中的每个像素应用一个高斯加权窗口,以考虑像素周围的局部区域。计算每个像素的Harris矩阵。Harris矩阵是一个2x2的矩阵,包含了局部区域的梯度信息。计算每个像素的Harris......
  • 浅谈@Transactional 注解的使用
    在SpringBoot的开发项目中,在Controller控制层,我们一般只做入参的校验;在Service服务层,我们把业务逻辑都写在这里,在服务层的方法中,我们会调用其它的服务层接口或者mapper层方法,所以,需要在服务层的方法上,我们需要增加:@Transactional(rollbackFor=Exception.class)添加该注解后......
  • Lock wait timeout exceeded; try restarting transaction 问题分析
    问题描述在项目中有一个MySQL数据库归档程序,每天会定时跑,在归档逻辑中,会涉及到对大表的查询(根据创建时间查询,它是索引),这个过程中会锁数据(行级锁),然后我们插入新的数据就会报错:获取锁超时Causedby:com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException:Lockwait......
  • Transaction rolled back because it has been marked as rollback-only
    背景最近在看程序日志的时候,发现频繁出现Transactionrolledbackbecauseithasbeenmarkedasrollback-only这个异常,查了很久资料才知道是什么原因导致抛出这异常的,下面解析一下;原因字面上的意思就是:事务已回滚,因为它已被标记为仅回滚,那为什么会标记为仅回滚呢?其实原因就......