[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 */¶meterValue);
参数名集合ParameterName
与参数值parameterValue
集合对应关系:
ParameterName | ParameterValue | |
---|---|---|
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); // 调整阈值观察效果
下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。 |