应用篇03-图像拼接(上)-原理

本节介绍基于Halcon的图像拼接技术,分为两篇。此为上篇,介绍相关原理,并介绍一个典型的基于平面放射变换变换的图像拼接实例,通过该实例,介绍一些用于图像拼接的基础算子。

目录

1 图像拼接技术概述

1.1 基本原理

1.2 常用方法

(1)基于特征的方法

(2)基于区域的方法

(3)深度学习方法

1.3 基于图像特征的拼接步骤

2 基于Halcon的图像拼接

2.1 一般步骤

2.2 典型实例

(1) 读取图像

(2) 提取特征点

(3) 特征点匹配

(4) 图像配准

(5) 后处理

3 小结


1 图像拼接技术概述

图像拼接(Image Stitching)是将多张具有重叠区域的图像通过几何对齐和色彩融合,合成一张宽视角、高分辨率全景图像的技术。广泛应用于全景摄影、卫星遥感、医学成像等领域。

1.1 基本原理

图像拼接的核心是解决三个关键问题:

  • 图像对齐:通过匹配重叠区域的对应点,计算图像间的几何变换关系(如单应性矩阵)。
  • 图像变形:根据对齐结果将图像投影到统一的坐标系(如球面、圆柱面或平面)。
  • 融合处理:消除拼接缝和光照差异,实现平滑过渡(如多频段融合、渐入渐出)。

1.2 常用方法

根据技术路线,主要分为三类:

(1)基于特征的方法

  • 原理:提取图像中的显著特征点(如角点、边缘),匹配特征后计算变换矩阵。
  • 优点:对视角变化、光照鲁棒性强,适合复杂场景。
  • 代表算法:SIFT、SURF、ORB、AKAZE等特征提取+匹配。

(2)基于区域的方法

  • 原理:直接比较重叠区域的像素相似度(如互相关、相位匹配)。
  • 优点:适合纹理简单、特征少的场景(如医学图像)。
  • 缺点:计算量大,对旋转和缩放敏感。

(3)深度学习方法

  • 原理:使用CNN或Transformer端到端学习配准和融合(如DeepHomography、LoFTR)。
  • 优势:自动化程度高,适应大视差场景。

1.3 基于图像特征的拼接步骤

以SIFT特征为例,典型流程如下:

步骤1:特征提取
使用SIFT/SURF/ORB检测关键点并生成特征描述子。
示例:SIFT通过高斯差分金字塔检测尺度空间极值点。

步骤2:特征匹配
计算描述子间的距离(如欧氏距离),使用最近邻(NN)或比率测试筛选匹配对。
优化:RANSAC剔除误匹配,提高鲁棒性。

步骤3:变换矩阵估计
根据匹配点对,求解单应性矩阵(Homography,3×3矩阵),描述投影变换关系。

步骤4:图像变形与映射
将待拼接图像通过变换到参考图像的坐标系中(需处理透视变形)。

步骤5:图像融合
加权平均:重叠区域像素按距离权重混合。
多频段融合(Laplacian Pyramid Blending):分解不同频段分别融合,保留细节。

2 基于Halcon的图像拼接

2.1 一般步骤

HALCON采用基于图像特征的拼接方法进行图像拼接,主要的步骤分为:预处理、特征点提取、图像配准和图像融合。

  • 读取图像:读取需要拼接的图像。
  • 预处理:对图像进行必要的预处理,如几何矫正、去噪、增强对比度等,以提高特征检测的准确性。
  • 特征点提取:使用特征点检测算子来检测图像中的显著特征点。
  • 特征点匹配:使用特定的匹配算法,找到两组特征点之间的对应关系。
  • 计算变换矩阵:根据匹配的特征点对,计算投影变换矩阵。
  • 图像变换:使用估计的变换矩阵将第二幅图像变换到第一幅图像的坐标系中。
  • 图像融合:将变换后的第二幅图像与第一幅图像进行融合。比如对重叠的边界进行后处理,生成最终的拼接图像。
  • 图像显示:显示拼接后的图像。

由于在图像采集时光线强度的不均匀以及拍摄像机本身参数和拍摄环境的影响,在图像重叠区域存在明暗强度差异,所以在图像拼接处存在明显的拼接痕迹。因此,在图像融合过程中必须进行拼接痕迹的消除。消除拼接痕迹主要是利用图像在拼接处的光线强度平滑过渡来消除其突变的,从而实现整个图像的平滑过渡,以达到过渡区域更加符合人视觉习惯的目的。目前,可以消除拼接痕迹的方法主要三种:(1)直接平均法、(2)加权平均法、(3)中值滤波法。

2.2 典型实例

下面用一个简单的实例,解释图像拼接的一般过程,重点介绍所使用的相关算子。

此例程的测试图像共有2张,从左到右排列。该例程展示的是如何将这两张图像拼接成一张大的图像。

(1) 读取图像

首先进行一系列的初始化操作,包括创建窗口、设置显示背景、字体字号等等。

* 初始化
dev_update_off ()
* 读取待拼接图像
read_image (Image1, 'mosaic/building_01')
read_image (Image2, 'mosaic/building_02')
* 初始化显示设置
get_image_size (Image1, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'white', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')

然后显示两幅待拼接图像:

* 显示两幅待拼接图像
dev_display (Image1)
disp_message (WindowHandle, 'Image 1 to be matched', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_display (Image2)
disp_message (WindowHandle, 'Image 2 to be matched', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()

(2) 提取特征点

提取两幅图像的foerstner特征。该特征适合于需要高精度定位的场景,因为它不仅返回点的位置,还提供了关于点质量和形状的附加信息。

Halcon中使用points_foerstner算子检测图像中关键点(通常为角点或圆形点)。

算子声明

points_foerstner(Image : : SigmaGrad, SigmaInt, SigmaPoints, ThreshInhom, ThreshShape, Smoothing, EliminateDoublets : RowJunctions, ColJunctions, CoRRJunctions, CoRCJunctions, CoCCJunctions, RowArea, ColArea, CoRRArea, CoRCArea, CoCCArea)

输入参数说明

  • Image: 输入图像(单通道)
  • SigmaGrad: 用于梯度计算的高斯平滑参数(建议值: 1.0)
  • SigmaInt: 用于积分计算的高斯平滑参数(建议值: 3.0)
  • SigmaPoints: 用于点检测的高斯平滑参数(建议值: 1.5)
  • ThreshInhom: 非均匀性阈值(建议值: 0.2)
  • ThreshShape: 形状阈值(建议值: 0.7)
  • Smoothing: 平滑方法('mean'或'gauss')
  • EliminateDoublets: 是否消除重复点('true'或'false')

输出参数说明

  • RowJunctions, ColJunctions: 检测到的关键点坐标
  • CoRRJunctions, CoRCJunctions, CoCCJunctions: 关键点的协方差矩阵元素
  • RowArea, ColArea: 关键点所在区域的坐标
  • CoRRArea, CoRCArea, CoCCArea: 区域的协方差矩阵元素

使用说明

  • SigmaGrad: 控制梯度计算的平滑程度。值越小,对细节越敏感,但也更容易受噪声影响。
  • SigmaInt: 控制积分计算的平滑程度。较大的值可以检测更大的结构。
  • ThreshInhom: 控制点的非均匀性。值越小,检测到的点越多。
  • ThreshShape: 控制点的形状。值越大,检测到的点越接近圆形。
  • 通常可以先使用默认参数,然后根据具体应用场景进行调整。

代码段

points_foerstner (Image1, 1, 2, 3, 50, 0.1, 'gauss', 'true', Rows1, Columns1, CoRRJunctions, CoRCJunctions, CoCCJunctions, RowArea, ColumnArea, CoRRArea, CoRCArea, CoCCArea)
points_foerstner (Image2, 1, 2, 3, 50, 0.1, 'gauss', 'true', Rows2, Columns2, CoRRJunctions, CoRCJunctions, CoCCJunctions, RowArea, ColumnArea, CoRRArea, CoRCArea, CoCCArea)

    (3) 特征点匹配

    根据提取的特征点,选用采用RANSAC(Random Sample Consensus)算法进行特征点匹配,进而根据匹配特征点的坐标值,计算投影矩阵(一般至少需要3对匹配点)、

    Halcon使用proj_match_points_ransac算子用于特征点匹配,该算子声明如下:

    算子声明

    proj_match_points_ransac ( Image1, Image2 : : Rows1, Cols1, Rows2, Cols2, GrayMatchMethod, MaskSize, RowMove, ColMove, RowTolerance, ColTolerance, Rotation, MatchThreshold, EstimationMethod, DistanceThreshold, RandSeed : HomMat2D, Points1,
    Points2 )

    输入参数说明

    • Image1, Image2: 输入的两幅图像(用于灰度值匹配)
    • Rows1, Cols1: 第一幅图像中的点坐标
    • Rows2, Cols2: 第二幅图像中的点坐标
    • GrayMatchMethod: 灰度值匹配方法('ssd'、'sad'或'ncc',默认值是'ssd')
    • MaskSize: 匹配掩模大小,默认值是10
    • RowMove, ColMove: 行/列坐标平均位移量,默认值是0
    • RowTolerance, ColTolerance: 匹配搜索窗口的半高/宽,默认值是256
    • Rotation: 旋转角度,默认值是0
    • MatchThreshold: 灰度值匹配阈值,默认值是10
    • EstimationMethod: 变换矩阵估计方法('normalized_dlt'或'gold_standard',默认值是'normalized_dlt')
    • DistanceThreshold: RANSAC内点距离阈值(像素单位),默认值是0.2
    • RandSeed: 随机数种子,默认值是0
    • MaxNumTrials: 最大迭代次数

    输出参数说明

    • HomMat2D: 计算出的3×3单应性矩阵
    • Points1, Points2: 获得的匹配点在图像1与图像2中对应的索引

    使用说明

    • SigmaGrad: 控制梯度计算的平滑程度。值越小,对细节越敏感,但也更容易受噪声影响。
    • SigmaInt: 控制积分计算的平滑程度。较大的值可以检测更大的结构。
    • ThreshInhom: 控制点的非均匀性。值越小,检测到的点越多。
    • ThreshShape: 控制点的形状。值越大,检测到的点越接近圆形。
    • 通常可以先使用默认参数,然后根据具体应用场景进行调整。

    代码段

    proj_match_points_ransac (Image1, Image2, Rows1, Columns1, Rows2, Columns2, 'ncc', 10, 0, 0, Height, Width, 0, 0.5, 'gold_standard', 2, 42, HomMat2DUnrectified, Points1Unrectified, Points2Unrectified)
    

    (4) 图像配准

    Halcon使用gen_projective_mosaic算子用于生成投影拼接图像,它可以将多幅图像通过投影变换(单应性变换)拼接成一幅大的拼接图像。

    算子声明

    gen_projective_mosaic ( Images : MosaicImage : StartImage, MappingSource, MappingDest, HomMatrices2D, StackingOrder, TransformDomain : MosaicMatrices2D )

    输入参数说明

    • Images: 输入图像元组(需要拼接的多幅图像)
    • MosaicImage: 生成的拼接图像
    • StartImage: 起始图像的索引(决定拼接的基准图像)
    • MappingSource: 源图像映射方式('false'或'true')
    • MappingDest: 目标图像映射方式('false'或'true')
    • HomMatrices2D: 每幅图像到参考坐标系的3×3单应性矩阵元组
    • StackingOrder: 图像叠加顺序('first'或'last')
    • TransformRegion: 是否变换区域('false'或'true')
    • Width, Height: 输出马赛克图像的宽度和高度
    • MosaicMatrices2D(输出参数): 由 3×3 投影变换矩阵组成的数组,这些矩阵决定了图像在拼接图中的位置。

    代码段

    * 图像拼接
    concat_obj (Image1, Image2, Images)
    gen_projective_mosaic (Images, MosaicImageUnrectified, 1, 1, 2, HomMat2DUnrectified, 'default', 'false', MosaicMatrices2DUnrectified)
    
    * 显示融合结果
    get_image_size (MosaicImageUnrectified, Width, Height)
    dev_set_window_extents (-1, -1, Width, Height)
    dev_clear_window ()
    dev_display (MosaicImageUnrectified)
    * 标注拼接缝
    projective_trans_pixel (MosaicMatrices2DUnrectified[9:17], [0,493], [0,0], RowTrans, ColumnTrans)
    gen_contour_polygon_xld (Contour, RowTrans, ColumnTrans)
    set_line_style (WindowHandle, [1,5])
    dev_set_line_width (1)
    dev_set_color ('yellow')
    dev_display (Contour)
    set_line_style (WindowHandle, [])
    dev_set_draw ('margin')
    dev_set_color ('red')
    dev_set_line_width (3)
    gen_circle (Circle, [82,402], [228,223], [15,15])
    dev_display (Circle)
    Message := 'The mosaic image does not fit'
    Message[1] := 'perfectly, if radial distortions'
    Message[2] := 'are not taken into account.'
    disp_message (WindowHandle, Message, 'image', 200, 300, 'black', 'true')
    disp_continue_message (WindowHandle, 'black', 'true')
    stop ()

    下图显示处理结果:

    图中竖线显示的是拼接线所在位置,由于存在径向畸变(radial distortions),在拼接缝两侧存在明显的错误。类似问题也是基于单应性变换矩阵图像拼接技术常出现的问题。

    仔细观察图像拼接的接缝处,发现拼接的效果并不理想,接缝是错开的。原因是两张图像的径向畸变造成的。何为径向畸变?这是镜头固有的,当焦距很大或很小时,拍出的图像尤其明显,图像的边缘处向前凹,或者向里凸的效果,仔细观察原来的两张图像,边缘处是向里凸进去的。

    (5) 后处理

    针对上面提到的由类似径向畸变等问题导致的拼接缝附近存在明显误差的情况,可在特征点匹配是考虑这类情况。

    Halcon中提供了proj_match_points_distortion_ransac算子用于处理存在畸变情况下的特征点匹配。

    算子声明

    proj_match_points_distortion_ransac ( Image1, Image2 : : Rows1, Cols1, Rows2, Cols2, GrayMatchMethod, MaskSize, RowMove, ColMove, RowTolerance, ColTolerance, Rotation, MatchThreshold, EstimationMethod, DistanceThreshold, RandSeed : HomMat2D, Kappa,
    Error, Points1, Points2 )

    输入参数说明

    • NumImages: 输入图像的数量
    • ReferenceImage: (待修订)

    代码段

    get_image_size (Image1, Width, Height)
    proj_match_points_distortion_ransac (Image1, Image2, Rows1, Columns1, Rows2, Columns2, 'ncc', 10, 0, 0, Height, Width, 0, 0.5, 'gold_standard', 1, 42, HomMat2D, Kappa, Error, Points1, Points2)

    由于可能存在径向畸变,因此需要先对两幅待拼接的负向进行畸变校正。在此,Halcon使用了gen_cam_par_area_scan_telecentric_division算子是Halcon中用于生成经过捆绑调整(bundle adjustment)优化的拼接图像的算子。注意,该算子在2024版的halcon中已经不能使用。

    并结合change_radial_distortion_cam_par算子和change_radial_distortion_image算子,完成相机参数的改变。

    算子声明

    change_radial_distortion_cam_par ( : : Mode, CamParamIn, DistortionCoeffs : CamParamOut )

    change_radial_distortion_image ( Image, Region : ImageRectified : CamParamIn, CamParamOut : )

    输入参数说明

    • NumImages: 输入图像的数量
    • ReferenceImage: (待修订)

    代码段

    * 构建相机参数
    gen_cam_par_area_scan_telecentric_division (1.0, Kappa, 1.0, 1.0, 0.5 * (Width - 1), 0.5 * (Height - 1), Width, Height, CamParDist)
    * 去除径向畸变
    change_radial_distortion_cam_par ('fixed', CamParDist, 0, CamPar)
    change_radial_distortion_image (Image1, Image1, Image1Rect, CamParDist, CamPar)
    change_radial_distortion_image (Image2, Image2, Image2Rect, CamParDist, CamPar)
    * 图像拼接
    concat_obj (Image1Rect, Image2Rect, ImagesRect)
    gen_projective_mosaic (ImagesRect, MosaicImage, 1, 1, 2, HomMat2D, 'default', 'false', MosaicMatrices2D)
    * 显示矫正处理后的拼接结果
    get_image_size (MosaicImage, Width, Height)
    dev_set_window_extents (-1, -1, Width, Height)
    dev_clear_window ()
    dev_display (MosaicImage)
    * Display seam line
    projective_trans_pixel (MosaicMatrices2D[9:17], [0,493], [0,0], RowTrans, ColumnTrans)
    gen_contour_polygon_xld (Contour2, RowTrans, ColumnTrans)
    set_line_style (WindowHandle, [1,5])
    dev_set_line_width (1)
    dev_set_color ('yellow')
    dev_display (Contour2)
    set_line_style (WindowHandle, [])
    dev_set_draw ('margin')
    dev_set_color ('green')
    dev_set_line_width (3)
    gen_circle (Circle, [124,496], [244,239], [15,15])
    dev_display (Circle)
    Message := 'The mosaic image fits perfectly,'
    Message[1] := 'if radial distortions are taken'
    Message[2] := 'into account.'
    disp_message (WindowHandle, Message, 'image', 200, 300, 'black', 'true')

    经过畸变校正后的图像如下:

    最终的拼接结果如下图所示:

    3 小结

    本节介绍了与图像拼接相关的基本原理、方法,以及基于图像特征的图像拼接基本步骤,然后通过一个Halcon官方实例,介绍了基于2D变换的图像拼接实例。

    下一节将介绍图像拼接的高级部分,介绍更复杂的拼接所实例,以及基于金字塔表示的图像融合(目的是得到视觉效果更好的拼接缝)

    一文详解halcon图像拼接技术-电子发烧友网

    (初稿完成,最新更新2025-04-03)

    本专栏将介绍基于Halcon的各种视觉应用技术,涵盖了常见的视觉应用领域。作为机器视觉技术的入门教程。

    感谢大家的支持和浏览,本专栏将持续更新,每篇的篇幅控制在5000字左右,这样大家阅读起来也比较轻松。估计2025年上半年完成全部内容,欢迎加收藏。但由于到了假期,更新的速度不会很快。

    本人保证,在专栏全部完成之前,将会一直免费。

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值