时间:2025-03-18 17:17
人气:
作者:admin
原文作者:aircraft
原文链接:https://www.cnblogs.com/DOMLX/p/18779326
有兴趣可以多看其他的halcon教程
本来今天想写一下halcon深度学习教程(三)目标检测的,不过今天有显卡的那台电脑连不上,干脆总结一下halcon的学习入门中的一些知识好了,如果你想入门halcon图像处理,那么看完我这篇至少大概了解一些halcon的图像处理知识了,语法这里就不会写了。halcon的入门教程主要的已经写了七七八八了,应该会对大家有帮助,因为我也是大学时期自己自学过来的,网上很少有halcon的入门教程!!!
因为学习这个之前你肯定有编程基础的比如c#.c++什么的,看到halcon的语句和例子自然就会使用了它的语法了,或者可以单独百度一下halcon语法。好多时候都是用halcon来测试算法,测试完自己在去转为c#或者c++语言编写一遍,通过halcon直接转换的数量少还好,数量一多,可读性和维护性就很差,毕竟也不是你的编程习惯写出来的,放一段时间你看的都懵逼。
一.halcon简介
HALCON是德国MVTec公司开发的一套完善的标准的机器视觉算法包,拥有应用广泛的机器视觉集成开发环境。它节约了产品成本,缩短了软件开发周期——HALCON灵活的架构便于机器视觉,医学图像和图像分析应用的快速开发。在欧洲以及日本的工业界已经是公认具有最佳效能的Machine Vision软件。 二.halcon入门学习路线 学习halcon最重要的是要会去看halcon提供的一个个官方的实例,里面基本把视觉算法常见的各个运用场景的例子都写出来了。实例就是最好的老师。 但是实例太多太多了,如果你是个刚开始学halcon的建议先学习下面halcon实例画线的部分。比如Blob分析,边缘提取,图像匹配定位,缺陷检测,一维量测,一,二维条码识别,OCR识别,特征提取等等最常见的先学习,后面我也会不断的补充教程,有兴趣可以关注一下。 掌握了这些后,你再去不断加深自己的halcon使用能力。其中Blob分析是入门中最重要的,也是最应该先花时间去掌握的,因为后面的各种实例里面都在疯狂的使用着Blob分析的各个知识,下面只略微介绍一下Blob分析。 Blob的定义:Blob是图像中具有相同或相似属性的连通区域(例如相同的灰度值、颜色或纹理)。
预处理:
二值化:
连通区域标记:
特征提取:
筛选与分析:

接下来进入正文。
三.halcon图像预处理(图像平滑,图像增强) 我们在进行一些图像识别定位,或者缺陷检测,目标识别分类等等工作任务的时候,最前面的第一个步骤就是图像预处理,图像预处理里面就包括了常见的图像变换和校正、平滑与去噪、以及增强处理,有了图像预处理后,我们才能更好的去进行后续的工作任务。 举个例子就是你分类垃圾,没有预处理这就是一堆杂乱的垃圾堆积在一起,各种品种都交错杂乱,预处理后,你可能要做的是把这边一样的垃圾和那边一样的垃圾选择一下他们的归类。 先从大家最喜欢看到的算子均值滤波开始(读取图像不用说吧,就是read_image()算子直接读就行了哈。。。): 1.图像平滑之均值滤波算子:
mean_image(Image : ImageMean : MaskWidth, MaskHeight : ):
Image:输入图像(单通道灰度图像)。MaskWidth, MaskHeight:滤波掩模的宽度和高度(需为奇数,如 3, 5, 7 等)。ImageMean:输出图像,滤波后的结果。均值滤波:
MaskWidth × MaskHeight 邻域内的所有像素灰度值,计算平均值后替换原像素值。通俗的话来讲就是把图像想象成一个二维的数组,你拿着一个5*5的矩形框在数组上滑动,滑动到哪颗像素,就把这个像素在框内的周边像素的值全部加起来做个除法均值,在把均值放回这颗像素里作为他的值。作用:
* 读取图像
read_image(Image, 'particle.jpg')
* 均值滤波(使用5×5掩模)
mean_image(Image, ImageMean, 5, 5)
* 显示结果
dev_display(ImageMean)

2.图像平滑之高斯滤波算子:gauss_filter(Image : ImageGauss : Size : ):
Image:输入图像(单通道灰度图像)。Size:高斯核的尺寸(通常为奇数值,如 3, 5, 7 等)。ImageGauss:滤波后的输出图像。高斯核:

滤波过程:
Size)越大或 σ 越大,平滑效果越强。| 特性 | 高斯滤波 | 均值滤波 |
|---|---|---|
| 权重分配 | 中心高,边缘低(符合高斯分布) | 邻域内均匀权重 |
| 边缘保留 | 较好(边缘模糊程度低) | 较差 |
| 抗噪能力 | 对高斯噪声更有效 | 对均匀噪声有效 |
| 计算速度 | 较慢(需计算高斯核) | 快 |
* 读取图像
read_image(Image, 'defect.jpg')
* 高斯滤波(核尺寸5×5,σ自动计算)
gauss_filter(Image, ImageGauss, 5)
* 显示结果
dev_display(ImageGauss)


3.图像平滑之中值滤波算子:median_rect(Image : ImageMedian :MaskWidth,MaskHeight:)
Image:输入图像(单通道灰度图像)。MaskWidth, MaskHeight:矩形掩模的宽度和高度(需为奇数,如 3, 5, 7 等)。ImageMedian:滤波后的输出图像。核心操作:
MaskWidth × MaskHeight 邻域内所有像素的灰度值。处理过程:参考均值滤波,说白了就是把矩形框内所有像素值排序取中间值填入像素。
特点:
噪声去除:
细节保留:
应用场景:
* 读取图像
read_image(Image, 'noisy_parts.jpg')
* 中值滤波(使用3×5矩形掩模)
median_rect(Image, ImageMedian, 3, 5)
* 显示结果
dev_display(ImageMedian)

4.图像增强之增强对比度算子:emphasize(Image : ImageEmphasize : MaskWidth, MaskHeight, Factor : )主要用于增强边缘和细节
Image:输入图像(单通道灰度图像)。MaskWidth, MaskHeight:定义局部邻域大小的掩模尺寸(需为奇数,如 3, 5, 7 等)。Factor:增强因子,控制细节增强的强度(通常 ≥ 0)。ImageEmphasize:处理后的输出图像。核心原理
emphasize 的实现基于 高频增强算法,核心步骤如下:

通俗的讲就是
1.使用 宽为 MaskWidth,高为MaskHeight的 mean_image (均值滤波器) 进行均值滤波。滤波后的图像灰度记为 mean, 滤波前的灰度记为 orig
2.将图像按如下公式进行计算得到结果图像
res := round((orig - mean) * Factor) + orig
功能与作用
实例代码:
* 读取图像
read_image(Image, 'scratched_surface.jpg')
* 增强处理(掩模5×5,Factor=1.5)
emphasize(Image, ImageEmphasize, 5, 5, 1.5)
* 显示结果
dev_display(ImageEmphasize)

5.图像增强之直方图均衡化算子:equ_histo_image(Image : ImageEquHisto : : )
Image:输入图像(单通道灰度图像)。ImageEquHisto:直方图均衡化后的输出图像。直方图均衡化的目标是拉伸图像的灰度分布,使其覆盖更广的动态范围,从而增强对比度。具体步骤如下:

说白了就是统计图像中的灰度出现的次数作为直方图,然后将主要的各个直方图的灰度区域和领域的区别增大增亮,让你可以清晰的看到各个灰度分布的成像
实例代码:
* 读取图像
read_image(Image, 'low_contrast.jpg')
* 直方图均衡化
equ_histo_image(Image, ImageEquHisto)
* 显示结果
dev_display(ImageEquHisto)

6.图像增强之按比例增强算子:
scale_image_max(Image : ImageScaleMax : : )
Image:输入图像(单通道灰度图像,支持8位、16位等数据类型)。ImageScaleMax:输出图像,灰度范围被拉伸到当前数据类型允许的最大值(如8位图像为0-255)。
| 特性 | scale_image_max | equ_histo_image(直方图均衡化) |
|---|---|---|
| 原理 | 线性拉伸灰度范围 | 非线性重分布直方图 |
| 对比度增强 | 全局均匀拉伸 | 局部自适应增强 |
| 直方图形状 | 保持原分布形状 | 近似均匀分布 |
| 噪声影响 | 可能放大噪声 | 可能增强噪声或产生伪影 |
| 适用场景 | 灰度范围狭窄的图像 | 直方图分布不均的图像 |
* 读取低对比度图像
read_image(Image, 'dark_surface.jpg')
* 自动拉伸灰度范围
scale_image_max(Image, ImageScaleMax)
* 显示结果
dev_display(ImageScaleMax)
而有时候常用的反而是自己调参的scale_image(Image : ImageScaled : Mult, Add : )算子,缩放图像的灰度值,基本是让亮的区域更亮,暗的区域更暗来增强图像对比度。

公式截图放大点好看点

7.图像增强之像素乘加操作算子:mult_image(Image1, Image2 : ImageResult : Mult, Add : )作用也是都差不多,白的区域更白,黑的区域更黑
Image1, Image2:输入图像(需尺寸相同且数据类型一致,如均为 byte、uint2 或 real)。Mult:乘法因子(缩放系数)。Add:加法因子(偏移量)。ImageResult:输出图像,计算公式为:
| 参数 | 作用 |
|---|---|
Mult |
控制乘积结果的幅度,Mult > 1 放大对比度,0 < Mult < 1 降低对比度。 |
Add |
调整输出图像的全局亮度,正值增亮,负值减暗。 |
| 算子 | 公式 | 适用场景 |
|---|---|---|
mult_image |
I1×I2×M+A | 图像融合、对比度与亮度调整 |
add_image |
I1+I2 | 图像叠加、亮度叠加 |
scale_image |
I×M+A | 单图像对比度/亮度调整 |
* 读取两幅图像(假设尺寸相同)
read_image(Image1, 'part1.jpg')
read_image(Image2, 'mask.jpg')
* 图像乘法与加法:ImageResult = (Image1 * Image2) * 0.5 + 50
mult_image(Image1, Image2, ImageResult, 0.5, 50)
* 显示结果
dev_display(ImageResult)

四.halcon 二值化和形态学分析 形态学分析也是图像处理中比较常用,又比较好理解的东西。主要针对二值图像(图像中任何像素的灰度值不是0就是255)的膨胀,腐蚀,开运算和闭运算的操作。 在这之前就要了解一下二值化操作。我们通常处理图像大部分的场景都是先将彩色图像转为灰度图
rgb1_to_gray (Image, GrayImage),如果本身就是单通道图像就不用了。灰度图就是灰度值分布在0-255之间的图像,而二值化就是将图像中的灰度变成0和255,比如大于100以上的你就变成255,以下的就是0,这样的黑白分明了。主要用于分割图像的时候。
1.图像二值化
常用的比如:全局阈值分割算子threshold(Image : Region : MinGray, MaxGray : )和局部阈值分割算子dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : )
threshold(Image : Region : MinGray, MaxGray : ):
Image:输入图像(单通道灰度图像)。MinGray, MaxGray:灰度阈值范围,闭区间 [MinGray, MaxGray]。Region:输出区域,包含所有灰度值在阈值范围内的像素。白话将就是提取灰度在MinGray到MaxGray之间的像素区域* 读取图像
read_image(Image, 'metal_part.jpg')
* 设定阈值范围(假设目标灰度在120-220之间)
threshold(Image, Region, 120, 220)
* 显示分割结果
dev_display(Image)
dev_display(Region)
dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : ):
OrigImage:原始输入图像(单通道灰度图像)。ThresholdImage:参考图像(通常为模糊后的图像,如高斯滤波或均值滤波结果)。Offset:阈值偏移量(用于放宽或收紧比较条件)。LightDark:比较模式,可选 'light'、'dark' 或 'equal'。RegionDynThresh:满足条件的区域。
(解释的话这里假定参考图像就是做过均值滤波的图像,此函数适用于缺陷提取中总是存在图像灰度均匀区域中总有特别亮于此区域或者暗于此区域的瑕疵提取)
LightDark参数为'light'时意思就是:提取原图中相对于均值图像灰度值还要大Offset的灰度值像素区域。
LightDark参数为'dark'时意思就是:提取原图中相对于均值图像灰度值还要小Offset的灰度值像素区域。
LightDark参数为'equal'时意思就是:提取原图中相对于均值图像灰度值灰度差值在Offset范围内的灰度值像素区域。
实例代码:
read_image(OrigImage, 'scratched_metal.jpg')
* 生成参考图像(高斯模糊)
gauss_filter(OrigImage, ThresholdImage, 15)
* 动态阈值分割(提取暗缺陷)
dyn_threshold(OrigImage, ThresholdImage, Scratches, 10, 'dark')
* 显示结果
dev_display(OrigImage)
dev_display(Scratches)
主要的阈值二值化的算子: 1、threshold:全局阈值分割算子。它根据输入的阈值下限和上限,将图像中的像素分为两部分,满足条件的像素被归为一个区域。这种方法简单直接,但只适用于图像灰度分布较为均匀的情况。
dilation_circle(Region : RegionDilation : Radius : ):
Region:输入区域(待处理的二值化区域)。Radius:圆形结构元素的半径(单位:像素)。RegionDilation:膨胀后的区域。
说白了就是你的一个滤波核这里是个半径为R的圆形滤波核,你在对一个矩形区域进行膨胀的时候就是滤波核在这个二维的区域数组中滑动遍历,内部的时候没有变化,到边缘的时候你的圆形区域中心在矩形边界的时候,一半的圆形都会在矩形外,然后把矩形外填充上像素,不断滑动不断填充。后面的腐蚀也是一样的原理

| 操作 | 结构元素 | 适用场景 |
|---|---|---|
dilation_circle |
圆形 | 各向同性扩展(无方向偏好) |
dilation_rectangle1 |
矩形 | 水平/垂直方向扩展 |
dilation2 |
自定义结构元素 | 复杂形状或非对称扩展 |
read_image(Image, 'metal_part.jpg')
* 二值化分割目标区域
threshold(Image, Region, 120, 255)
* 膨胀处理(半径3像素)
dilation_circle(Region, RegionDilation, 3)
* 显示结果
dev_display(Image)
dev_display(RegionDilation)
(2)腐蚀(Erosion)
erosion_circle(Region : RegionErosion : Radius : )算子:
Region:输入区域(待处理的二值化区域)。Radius:圆形结构元素的半径(单位:像素)。RegionErosion:腐蚀后的区域。

| 操作 | 结构元素 | 适用场景 |
|---|---|---|
erosion_circle |
圆形 | 各向同性收缩(无方向偏好) |
erosion_rectangle1 |
矩形 | 水平/垂直方向收缩 |
erosion2 |
自定义结构元素 | 复杂形状或非对称收缩 |
read_image(Image, 'noisy_parts.jpg')
* 二值化分割目标区域
threshold(Image, Region, 200, 255)
* 腐蚀处理(半径2像素)
erosion_circle(Region, RegionErosion, 2)
* 显示结果
dev_display(Image)
dev_display(RegionErosion)
(3)开运算(opening) opening_circle(Region : RegionOpening : Radius : )算子:先腐蚀后膨胀,主要就是将只有一点点藕断丝连的区域断开,比如两个岛之间有条短桥,把这个短桥给断开
Region:输入区域(待处理的二值化区域)。Radius:圆形结构元素的半径(单位:像素)。RegionOpening:开运算处理后的区域。
| 操作 | 结构元素 | 适用场景 |
|---|---|---|
opening_circle |
圆形 | 各向同性处理,均匀去噪 |
opening_rectangle1 |
矩形 | 水平/垂直方向去噪或分离目标 |
opening |
自定义结构元素 | 复杂形状或非对称处理 |
read_image(Image, 'noisy_objects.jpg')
* 阈值分割提取目标
threshold(Image, Region, 100, 255)
* 开运算去噪(半径2像素)
opening_circle(Region, RegionOpening, 2)
* 显示结果
dev_display(Image)
dev_display(RegionOpening)

(4)闭运算(closing) closing_circle(Region : RegionClosing : Radius : )算子:先膨胀后腐蚀
Region:输入区域(待处理的二值化区域)。Radius:圆形结构元素的半径(单位:像素)。RegionClosing:闭运算处理后的区域。

| 操作 | 结构元素 | 适用场景 |
|---|---|---|
closing_circle |
圆形 | 各向同性处理,均匀填充孔洞 |
closing_rectangle1 |
矩形 | 水平/垂直方向连接断裂区域 |
closing |
自定义结构元素 | 复杂形状或非对称处理 |
read_image(Image, 'defective_part.jpg')
* 阈值分割提取目标
threshold(Image, Region, 80, 255)
* 闭运算填充孔洞(半径3像素)
closing_circle(Region, RegionClosing, 3)
* 显示结果
dev_display(Image)
dev_display(RegionClosing)
OK,本篇就写这么多,后面再继续更新halcon入门教程 参考博客:https://blog.csdn.net/liuming1992/article/details/144377754 https://blog.csdn.net/weixin_46079046/article/details/135589576?spm=1001.2014.3001.5502 https://www.cnblogs.com/ZHIZRL/p/18316077 https://blog.csdn.net/m0_37302966/article/details/140076055 转发和使用本文,请注明作者信息和原文地址---本文原作者为aircraft ---大家好我是徐飞机,有没有大佬们的公司招c++开发/图像处理/opengl/opencv/halcon实习的啊,带上我一个呗QAQ。。。hhhhhh 想要免费获取前端,后端,c/c++,matlab,Python,opencv,机器学习,深度学习,安卓,java,等等全套视频教程请关注机器视觉开发公众号,转发集赞28即可百度云获得hhhhhhhh