[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",  // Parameters
	HTuple(createParam.m_modelAngleStart).TupleRad(),   // AngleStart
	HTuple(createParam.m_modelAngleExtent).TupleRad(),  // AngleExtent
	createParam.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); // 调整阈值观察效果

下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶布布

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值