2025-11-24halcon 仿射变换

halcon采图

  • halcon.net
  • halcon.dll 放到debug下

sdk1采图

采集流程

  • 转正 (ROI目标区转正)仿射变换

    • 平移

    • 选择

    • 缩放

  • 分割 二值化 - >二值图

  • 形态学分析

    • 膨胀
    • 腐蚀
    • 开运算 细小腐蚀
    • 闭运算 细小膨胀
  • 特征提取

    • 定位
      • 图像预处理
      • 图像分割
      • 颜色
      • 轮廓定位
  • 图像分类

二值图形态学分析

灰度图的形态学分析


放射变换






效果越好时间越长


halcon 实现仿射变换

画出区域做基础的仿射变换

* 1. 关闭之前的窗口(避免多个窗口干扰)
dev_close_window ()

* 2. 新建512x512的黑色窗口(Width=512,Height=512,背景黑色)
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)

* 3. 手动画区域(在窗口内拖动鼠标画任意形状,右键确认)
disp_message (WindowHandle, '拖动鼠标画区域(右键确认)', 'window', 12, 12, 'white', 'true')
draw_region (Region, WindowHandle)

* 4. 显示原始区域(让你看到画的区域在哪里)
dev_display (Region)
disp_message (WindowHandle, '原始区域', 'window', 36, 12, 'green', 'true')
stop ()  // 暂停,按F5继续

* 5. 定义仿射变换矩阵(平移→缩放,顺序:后定义的变换先执行)
hom_mat2d_identity (HomMat2DIdentity)  // 初始化单位矩阵(无任何变换)

* 5.1 平移:相对于窗口左上角(0,0),向右移64,向下移64(row=64,column=64)
hom_mat2d_translate (HomMat2DIdentity, 64, 64, HomMat2DTranslate)

* 5.2 缩放:相对于窗口左上角(0,0),x/y方向均放大2倍(scale_x=2,scale_y=2)
hom_mat2d_scale (HomMat2DTranslate, 2, 2, 0, 0, HomMat2DScale)  // 最终变换矩阵:缩放+平移

* 6. 对区域执行仿射变换(关键:用最终的HomMat2DScale,不是HomMat2DTranslate)
affine_trans_region (Region, RegionAffineTrans, HomMat2DScale, 'nearest_neighbor')

* 7. 显示变换后的区域(清空窗口→显示原始区域→显示变换后区域,对比效果)
dev_clear_window ()
dev_display (Region)  // 原始区域(黑色窗口中白色部分)
dev_set_color ('red')  // 变换后的区域设为红色,方便区分
dev_display (RegionAffineTrans)  // 变换后的区域(红色)

* 8. 提示信息
disp_message (WindowHandle, '黑色=原始区域 | 红色=平移+缩放后区域', 'window', 12, 12, 'white', 'true')

在图片中选出区域进仿射变换

    dev_update_off ()  // 关闭实时更新,加快运行速度
    dev_close_window ()  // 关闭旧窗口
    
    * 1. 选择并加载图像
    dev_open_file_dialog ('read_image', 'default', 'default', Selection)
    if (Selection == '')  // 防错:用户未选图像直接取消
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
    read_image (Image, Selection)
    
    * 2. 新建窗口(适配图像大小,避免拉伸)
    get_image_size (Image, ImageWidth, ImageHeight)
    dev_open_window (0, 0, ImageWidth, ImageHeight, 'black', WindowHandle)
    dev_display (Image)
    disp_message (WindowHandle, '原始图像', 'window', 12, 12, 'white', 'true')
    stop ()  // 暂停,按F5继续
    
    * 3. 画矩形框选区域(水平矩形,右键确认)
    disp_message (WindowHandle, '拖动鼠标画矩形(框选目标区域,右键确认)', 'window', 40, 12, 'white', 'true')
    draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
    
    * 4. 生成矩形区域+抠图(两种抠图方式,按需选择)
    gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)  // 生成矩形区域
    reduce_domain (Image, Rectangle, ImageReduced)  // 方式1:保留原图尺寸,仅限制有效域(后续变换用这个)
    crop_domain (ImageReduced, ImagePart)  // 方式2:裁剪为矩形大小的独立小图像(可选)
    
    * 显示抠图结果
    dev_clear_window ()
    dev_display (ImagePart)  // 显示裁剪后的小图像(更直观)
    disp_message (WindowHandle, '抠图后的区域', 'window', 12, 12, 'white', 'true')
    stop ()  // 暂停,按F5继续
    
    * 5. 计算矩形区域的中心坐标(变换基准点)
    area_center (Rectangle, Area, RegionCenterRow, RegionCenterCol)
    
    
    * 6. 变换1:平移+旋转组合(基于区域中心)
    tuple_rad (45, RotAngle)  // 目标旋转角度:45度→弧度
    * 刚性变换矩阵:原始中心(RegionCenterRow,RegionCenterCol)、无旋转(0) → 新中心(上移50,右移30)、旋转45度
    vector_angle_to_rigid (RegionCenterRow, RegionCenterCol, 0, RegionCenterRow-50, RegionCenterCol+30, RotAngle, HomMat2D_TransRotate)
    * 对图像执行变换(constant=填充色,true=保持原图尺寸)
    affine_trans_image (ImageReduced, ImageAffineTrans_TransRotate, HomMat2D_TransRotate, 'constant', 'true')
    * 对区域执行变换(和图像变换一致)
    affine_trans_region (Rectangle, RegionAffineTrans_TransRotate, HomMat2D_TransRotate, 'nearest_neighbor')
    
    * 显示平移+旋转结果
    dev_clear_window ()
    stop ()
    dev_display (Image)  // 显示原图作为背景参考
    stop ()
    dev_display (ImageAffineTrans_TransRotate)  // 变换后的图像
    stop ()
    dev_set_color ('red')
    dev_display (RegionAffineTrans_TransRotate)  // 变换后的区域(红色框)
    
    
    disp_message (WindowHandle, '平移+旋转后的区域(红框)', 'window', 12, 12, 'white', 'true')
    stop ()  // 暂停,按F5继续
    
    * 7. 变换2:纯旋转(中心不变,仅旋转45度)
    tuple_rad (45, RotAngle_Pure)  // 目标旋转角度:45度→弧度
    * 刚性变换矩阵:原始中心、无旋转 → 同一中心、旋转45度(无平移)
    vector_angle_to_rigid (RegionCenterRow, RegionCenterCol, 0, RegionCenterRow, RegionCenterCol, RotAngle_Pure, HomMat2D_PureRotate)
    * 对图像执行纯旋转
    affine_trans_image (ImageReduced, ImageAffineTrans_PureRotate, HomMat2D_PureRotate, 'constant', 'true')
    * 对区域执行纯旋转
    affine_trans_region (Rectangle, RegionAffineTrans_PureRotate, HomMat2D_PureRotate, 'nearest_neighbor')
    
    * 显示纯旋转结果
    dev_clear_window ()
    dev_display (Image)  // 原图背景
    stop ()
    dev_display (ImageAffineTrans_PureRotate)  // 纯旋转后的图像
    stop ()
    dev_set_color ('green')
    dev_display (RegionAffineTrans_PureRotate)  // 纯旋转后的区域(绿色框)
    stop ()
    
    disp_message (WindowHandle, '纯旋转后的区域(绿框)', 'window', 12, 12, 'white', 'true')

通过投影给畸变图片复原



dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)

read_image (Image, 'C:/Users/12613/Documents/xwechat_files/wxid_zh4dvw96777z22_8506/msg/file/2025-11/微信图片_20251124144244_455_151.png')

*投影变换
x:=[0,324,216,532]
y:=[0,493,111,590]

x1:=[0,0,535,535]

y1:=[0,590,0,590]

hom_vector_to_proj_hom_mat2d (x, y, [1,1,1,1], x1, y1, [1,1,1,1], 'normalized_dlt', HomMat2D)

projective_trans_image (Image, TransImage, HomMat2D, 'bilinear', 'false', 'false')

均值化直方图

缩放直方图

让亮的更亮 暗的更暗


通过动态阈值(差值匹配图像)

代码

* read_image (Image, 'C:/Users/Public/Documents/MVTec/HALCON-19.11-Progress/examples/images/vessel.png')
*均值化直方图
* equ_histo_image (Image, ImageEquHisto)
*缩放量的更亮暗的更暗
* scale_image (Image, ImageScaled, 1.97674, -77)
 
* read_image (Image, 'C:/Users/Public/Documents/MVTec/HALCON-19.11-Progress/examples/images/datacode/ecc200/ecc200_cpu_015.png')
 *处理失焦指令
*  shock_filter (Image, SharpenedImage, 0.5, 10, 'canny', 1)
*  read_image (Image, 'C:/Users/Public/Documents/MVTec/HALCON-19.11-Progress/examples/images/circle_plate.png')
 *均值滤波
*  mean_image (Image, ImageMean, 9, 9)
 *中值滤波
*  median_image (ImageMean, ImageMedian, 'circle', 1, 'mirrored')
*  read_image (Image, 'C:/Users/Public/Documents/MVTec/HALCON-19.11-Progress/examples/images/egypt1.png')
 *自动阈值 直方图平滑
*  auto_threshold (Image, Regions, 4)
  read_image (Image, 'C:/Users/Public/Documents/MVTec/HALCON-19.11-Progress/examples/images/photometric_stereo/embossed_01.png')
  mean_image (Image, ImageMean, 59, 59)
  
dyn_threshold (Image, ImageMean, RegionDynThresh1, 15, 'not_equal')
*膨胀
closing_circle (RegionDynThresh1, RegionClosing, 8.5)
opening_circle (RegionClosing, RegionOpening, 5.5)
connection (RegionOpening, ConnectedRegions) 
*最小外接圆
smallest_circle (ConnectedRegions, Row, Column, Radius)
gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, 6.28318, 'positive', 1)
 dev_display (Image)
 dev_display (ContCircle)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容