当前位置: 首页 > ops >正文

[Halcon匹配] 创建形状模板自动设置对比度

  • 📢博客主页:https://loewen.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉
  • 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨

文章预览:

      • 一. 对比度参数作用
      • 二. 动态计算形状模型最佳参数
      • 三. 应用动态计算的形状模型参数


一. 对比度参数作用

对比度参数用于筛选图像中的有效边缘,确保模板仅包含鲁棒的特征:

  • 低对比度HysteresisLow):
    定义边缘检测的下限阈值。低于此值的边缘会被完全忽略,避免噪声或微弱变化干扰模板。
  • 高对比度HysteresisHigh):
    定义边缘检测的上限阈值。高于此值的边缘会被直接保留,确保显著特征始终被选中。
  • 双阈值机制(类似Canny边缘检测):
    介于低、高阈值之间的边缘,仅当它们连接到高阈值边缘时才会保留,从而形成连贯的轮廓。

示例场景

  • 低对比度图像
    若目标边缘模糊(如光照不足),需降低低阈值(HysteresisLow)以避免丢失有效边缘,但需配合最小轮廓长度(MinSize)过滤噪声
  • 高噪声图像
    提高高阈值(HysteresisHigh)以减少噪声干扰,同时调整低阈值平衡细节保留。

二. 动态计算形状模型最佳参数

// [2025-05-21][罗文][注释说明]
// 自动优化金字塔层级(num_levels)和对比度参数(HysteresisContrast、MinContrast)
// 算法原理:基于图像信噪比自动计算最优金字塔层级,通过直方图分析确定最佳对比度阈值
// 优点:减少手动调参时间,适合快速原型验证
// 缺点:自动参数可能在以下场景失效:
//       - 图像信噪比<15dB的低对比度场景
//       - 存在结构噪声干扰(如规则纹理背景)
// 建议使用场景:
//       - 光照条件稳定的检测环境
//       - 模板图像清晰度>80%的工况
HTuple parameterValue, HysteresisContrast, MinContrast;
HTuple parameterName = modelImg.DetermineShapeModelParams( "auto",  // ParametersHTuple(createParam.m_modelAngleStart).TupleRad(),   // AngleStartHTuple(createParam.m_modelAngleExtent).TupleRad(),  // AngleExtentcreateParam.m_ScaleMin, /* ScaleMin */  createParam.m_ScaleMax,  // ScaleMax"auto", /* m_Optimization */ "use_polarity",  /* m_Metric  */"auto", /* Contrast */       "auto",         /* MinContrast */  "all",   /* Genericity */&parameterValue);

参数名集合ParameterName与参数值parameterValue集合对应关系:

ParameterNameParameterValue
0‘num_levels’(金字塔)4
1‘angle_step’0.030651
2‘scale_step’0.0153249
3‘optimization’(最优化)‘none’(存储所有模型点)
4‘contrast_low’(低对比度)66
5‘contrast_high’(高对比度)72
6‘min_size’(最小轮廓长度)4
7‘min_contrast’(最小轮廓长度)66

三. 应用动态计算的形状模型参数

MS_CreateScaleShapeModelParam createParam = shapeModel().m_createScaleShapeModelParam;if (createParam.m_isAutoSetContrast == true) { //自动设置对比度determineShapeModelParams(_inImg, createParam, parameterValue);angleStep = parameterValue[1];scaleStep = parameterValue[2];hysteresisContrast = HTuple(parameterValue[4]).Append(parameterValue[5]).Append(parameterValue[6]);minContrast = HTuple(parameterValue[7]);}else{angleStep = "auto";     // 高级参数界面未开放,这里使用默认scaleStep = "auto";     // 高级参数界面未开放,这里使用默认hysteresisContrast = HTuple(createParam.m_contrast_1st).Append(createParam.m_contrast_2nd).Append(createParam.m_contrast_3rd);minContrast = "auto";   // 高级参数界面未开放,这里使用默认}if (createParam.m_ScaleMin == 1 && createParam.m_ScaleMax == 1){shapeModel().m_model = modelImg.CreateShapeModel(HTuple(createParam.m_pyramidLevel), \HTuple(-0.5 * createParam.m_modelAngleExtent).TupleRad().D(), \HTuple(createParam.m_modelAngleExtent).TupleRad().D(), \HTuple(angleStep), \HTuple(createParam.m_Optimization.toStdString().c_str()), \HTuple(createParam.m_Metric.toStdString().c_str()), \hysteresisContrast, minContrast);}else{shapeModel().m_model = modelImg.CreateScaledShapeModel(HTuple(createParam.m_pyramidLevel), \HTuple(-1 * createParam.m_modelAngleExtent).TupleRad(), \HTuple(2 * createParam.m_modelAngleExtent).TupleRad(), \HTuple(angleStep), /*角度步长*/ \HTuple(createParam.m_ScaleMin), \HTuple(createParam.m_ScaleMax), \HTuple(scaleStep), /*缩放步长*/\HTuple(createParam.m_Optimization.toStdString().c_str()), \HTuple(createParam.m_Metric.toStdString().c_str()), \hysteresisContrast, minContrast);}

可以看到,在创建模板算子的对比度参数hysteresisContrast中,还引入了最小轮廓长度(MinSize)的数值,其作用是即使边缘通过了对比度筛选,仍需通过长度过滤,三者共同作用,形成一个分层过滤机制:

  • 对比度阈值:初步筛选出显著边缘。
  • 最小轮廓长度:二次过滤,确保边缘具有实用几何意义,过滤到比该值小的轮廓,只要比该值大的轮廓做模板

除了自动获取创建模板所需要的对比度参数外,还可以手动微调,通过可视化的方式确认:

  • 观察边缘提取结果:
    使用EdgesImage可视化边缘,检查是否覆盖目标轮廓。
HEdges edges = Image.EdgesImage("canny", 1.0, 20, 40); // 调整阈值观察效果

下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。
http://www.xdnf.cn/news/8405.html

相关文章:

  • 算法修仙传 第一章 灵根觉醒:数组基础与遍历
  • Pluto实验报告——基于FM的音频信号传输并解调恢复
  • osal posix 区别
  • Vue3 数据可视化屏幕大屏适配 页面自适应 响应式 数据大屏 大屏适配
  • 用matlab提取abaqus odb文件中的节点信息
  • 动态规划-740.删除并获取节点-力扣(LeetCode)
  • ollama 部署模型休眠、释放问题
  • OpenJudge | 用二分法求方程的根
  • 怎么判断一个Android APP使用了Qt 这个跨端框架
  • 2步彻底卸载VScode
  • AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.12.15-2024.12.20
  • 408提示
  • Linux入门(九)任务调度
  • Claude 4:一场AI代理革命的起点
  • 古文时空重构:当AI把课本诗词做成4D电影
  • day34 python深度学习训练优化实践:CPU vs GPU
  • 基于SpringBoot+Vue的足球青训俱乐部管理后台系统的设计与开发
  • Three.js与Babylon.js对比
  • Flyweight(享元)设计模式 软考 享元 和 代理属于结构型设计模式
  • AI+制造:中小企业的低成本智能化转型
  • 迅为3568开发板实操-HDF驱动配置 UART-配置 rk3568_uart_config.hcs
  • 2025期中考复现
  • 【ubuntu】Ubuntu安装 XTerminal和使用
  • Widget进阶
  • redis常用命令
  • Fastrace:Rust 中分布式追踪的现代化方案
  • 【Oracle】创建公共数据连接
  • Jouier 普及组十连测 R3
  • 【人工智能】低代码-模版引擎
  • Pluto实验报告——基于2ASK的简易的通信系统