Halcon批量图像几何矫正(入门)

文章详细介绍了如何使用Halcon进行图像矫正,包括几何校正和灰度校正的过程。首先,通过已知参考点建立映射关系来校正图像的几何变形;然后,进行灰度值的内插处理。在Halcon环境中,通过读取图像、转换灰度、反转色彩,以及处理TXT文件中的坐标信息,结合图形窗口操作,实现目标区域的选取和角度变换。最终,通过透视变换完成图像的校正。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图像矫正:

图像校正主要分为两类:几何校正和灰度校正

其思路是通过一些已知的参考点,即无失真图象的某些象素点和畸变图象相应象素的坐标间对应关系,拟合出映射关系中的未知系数,并作为恢复其它象素的基础。

几何校正的基本方法是:

首先建立几何校正的数学模型

其次利用已知条件确定模型参数;

最后根据模型对图像进行几何校正。

具体操作通常分两步:

①对图像进行空间坐标变换;首先建立图像像点坐标(行、列号)和物方(或参考图)对应点坐标间的映射关系,解求映射关系中的未知参数,然后根据映射关系对图像各个像素坐标进行校正;

②确定各像素的灰度值灰度内插)。

新建Halcon文件:

1、打开Halcon程序选择“文件”新程序

haicon菜单栏

菜单栏中选择窗口,分别打开“图形窗口”,“程序窗口”,“变量窗口”,“算子窗口”。

2、在程序窗口中输入(** 注:输入算子名称双击Tab键自动补全代码

dev_update_off()  //关闭图形窗口更新
dev_close_window()  //关闭图形窗口

输入图片路径

输入目标坐标文件(.txt文件) ** 注:可不输入

list_files ('D:/***/***/***_files', ['files','follow_links'], ImageFiles) //自己图片路径
list_files('D:/***/***/***_files', ['files','follow_links'], TxtFiles)  //自己Txt文件路径

筛选图片文件

筛选TXT文件 ** 注:可不输入

tuple_regexp_select (ImageFiles, ['\\.(bmp|jpg)$','ignore_case'], ImageFiles)
tuple_regexp_select(TxtFiles, ['\\.(txt)$','ignore_case'], TxtFiles)

遍历图像

for Index := 0 to |ImageFiles| - 1 by 1 
    *********************     //图形窗口处理
    **********************    // 图像处理程序

endfor

在遍历图像循环函数内,---图形窗口处理

    read_image (Image, ImageFiles[Index])  // 读取图像
    get_image_size(Image, Width, Height) // 获取图像尺寸
    dev_clear_window()  // 清理图形窗口
    dev_open_window_fit_image(Image, 0, 0, -1, -1, WindowHandle) // 打开一个窗口,适应图像尺寸
    dev_display(Image)  // 显示图像
    rgb1_to_gray(Image, GrayImage)  // 彩色图像转灰度图像
    invert_image(GrayImage, ImageInvert)  // 图像色彩反转

在图形窗口处理下,----遍历TXT文件内部坐标信息 (** 注:可不输入)

 * 遍历txt文件
    open_file (Files[Index], 'input', FileHandle)  // 读取txt文件
    tuple_piex := []  // 创建空坐标列表
    i := 0
    for i := 0 to 3 by 1  // 遍历txt文件内容,获取目标区域坐标
        fread_string (FileHandle, OutString1, IsEOF1) // 按行读取txt
        tuple_number(OutString1, Number)  //string转int
        tuple_piex[i] := Number  // 输出坐标列表
    endfor

画出特征明显区域,方便后面进行角度变换

方法一:

输入gen_rectangle1双击Tab补全代码,在内部直接输入坐标位置

方法二:

在图形窗口选择“绘制新ROI”框选特征区域

框选之后点击鼠标“右键”确定目标区域,之后可以通过拖动鼠标从新调整位置,确定目标区域之后选择“在程序中插入代码”,然后关闭ROI即可

输入reduce_domain双击Tab补全代码,减去除目标区域外的图像

gen_rectangle1 (Rectangle1, 30, 20, 100, 200)  // 目标矩形区域

reduce_domain(ImageInvert, ROI_0, ImageReduced)  // 矩形区域裁剪

图像处理程序

对目标区域图像进行常规处理

mean_image(ImageReduced, ImageMean, 9, 9)  // 图像滤波
dyn_threshold(Image, ImageMean, RegionDynThresh, 185, 'light')  // 图像阈值处理
dilation_circle(RegionDynThresh, RegionDilation, 3.5)  //图像膨胀
fill_up(RegionDilation, RegionFillUp)  // 目标空白区域填充
connection(RegionFillUp, ConnectedRegions)  // 区域分割
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 1200, 4500)  // 面积筛选目标
union1(SelectedRegions, RegionUnion)  // 目标区域连通
shape_trans (RegionUnion, RegionTrans, 'convex')  // 目标凸性区域填充

**注:在对图像进行阈值处理面积筛选时可以通过Halcon快捷工具进行动态筛选

**注:在对图像进行面积筛选前,必须进行区域分割

获取目标最小外接矩形,通过角度进行透视变换

smallest_rectangle2(RegionTrans, Row, Column, Phi, Length1, Length2)  // 获取目标区域最小外接矩形及角度和边长
gen_rectangle2_contour_xld(Rectangle, Row, Column, Phi, Length1, Length2)  // 根据目标最小外接矩形坐标画出外接框
**  图像透视变换
vector_angle_to_rigid(Row, Column, Phi, Row, Column, 0, HomMat2D)  // 获取最小矩形区域与水平夹角、计算透视变换矩阵
affine_trans_image(Image, ImageAffineTrans, HomMat2D, 'constant', 'false')  // 进行透视变换
dev_display(ImageAffineTrans)  //显示旋转后图像

**注:在vector_angle_to_rigid算子中Phi:表示目标需要旋转的弧度,0:表述旋转之后的状态水平

旋转前

旋转后

### HALCON 图像几何矫正的方法 #### 1. 基本概念 图像几何矫正是指通过特定的数学模型(如仿射变换或透视变换),将输入图像转换到目标坐标系下的过程。这种技术常用于校正镜头畸变、调整视角偏差以及实现空间映射等功能[^4]。 --- #### 2. 使用 `affine_trans_image` 进行仿射变换 在 HALCON 中,可以通过 `affine_trans_image` 算子完成图像的仿射变换操作。该算子允许用户定义一个 2×3 的变换矩阵来描述平移、旋转、缩放和剪切等几何变化。 以下是具体步骤: - **计算变换矩阵** 变换矩阵可通过其他算子(如 `hom_mat2d_identity`, `hom_mat2d_translate`, `hom_mat2d_rotate` 或者手动指定)生成。 - **应用变换** 利用 `affine_trans_image` 对原始图像执行变换。 ```hdevelop * 定义初始变换矩阵 hom_mat2d_identity (HomMat2D) * 添加平移 hom_mat2d_translate (HomMat2D, -100, -50, HomMat2DTranslate) * 添加旋转 hom_mat2d_rotate (HomMat2DTranslate, rad(30), 200, 150, HomMat2DRotate) * 应用仿射变换至图像 affine_trans_image (Image, ImageAffinTrans, HomMat2DRotate, 'constant', 'false') ``` 上述代码实现了对图像的一系列几何变换,包括平移、旋转等操作。 --- #### 3. 使用 `projective_trans_image` 实现透视变换 当需要处理更加复杂的场景变形时,可以采用透视变换(也称为投影变换)。此方法适用于纠正因相机角度引起的梯形失真等问题。 - **创建透视变换矩阵** 使用 `vector_to_proj_hom_mat2d` 或 `proj_match_points_ransac` 来获取透视变换所需的 3×3 齐次矩阵。 - **实施变换** 调用 `projective_trans_image` 执行实际的图像变换。 ```hdevelop * 创建一组对应点 Row1 := [0, 0, 200, 200] Col1 := [0, 200, 200, 0] Row2 := [50, 80, 220, 190] Col2 := [30, 210, 230, 70] * 计算透视变换矩阵 vector_to_proj_hom_mat2d (Row1, Col1, Row2, Col2, HomMat2DProjective) * 应用透视变换至图像 projective_trans_image (Image, ImageProjTrans, HomMat2DProjective, 'bilinear', 'false') ``` 这段脚本展示了如何基于给定的四组匹配点建立透视关系并将其作用于原图上。 --- #### 4. 结合 Halcon 和 OpenCVSharp 的优势 虽然 HALCON 提供了丰富的工具集来进行高级别的图像处理任务,但在某些情况下可能还需要借助第三方库比如 OpenCVSharp 来补充额外的功能或者提升性能表现。例如,在大规模数据集中批量运行这些算法时可能会遇到效率瓶颈,则可考虑混合编程方式以充分利用两者各自的强项[^1]。 --- ### 总结 无论是简单的仿射变换还是复杂度更高的投影变换,Halcon 都能提供全面的支持方案满足不同层次的需求。以上介绍了两种主要类型的几何矫正手段及其对应的 Halcon 示例代码片段,希望能帮助理解其工作机制与实践技巧。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值