原文作者:aircraft
原文链接:https://www.cnblogs.com/DOMLX/p/18779326
有兴趣可以多看其他的halcon教程
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是图像中具有相同或相似属性的连通区域(例如相同的灰度值、颜色或纹理)。Blob分析的步骤
- 预处理:
- 去噪(如高斯滤波、中值滤波)。
- 增强对比度或调整光照不均。
- 二值化:
- 将图像转换为黑白二值图(例如通过阈值分割),使目标区域(Blob)与背景分离。
- 连通区域标记:
- 扫描图像,为每个连通区域分配唯一标签(如使用种子填充法或两次扫描算法)。
- 特征提取:
- 计算每个Blob的特征,例如:
- 几何特征:面积、周长、质心、外接矩形、长宽比、圆形度。
- 灰度/颜色特征:平均灰度、颜色分布。
- 高阶特征:方向(主轴)、矩(用于形状描述)。
- 筛选与分析:
- 根据特征过滤无关区域(例如排除面积过小的噪声点)。
- 分类或统计目标Blob的数量、位置、形状等。
接下来进入正文。
三.halcon图像预处理(图像平滑,图像增强) 我们在进行一些图像识别定位,或者缺陷检测,目标识别分类等等工作任务的时候,最前面的第一个步骤就是图像预处理,图像预处理里面就包括了常见的图像变换和校正、平滑与去噪、以及增强处理,有了图像预处理后,我们才能更好的去进行后续的工作任务。 举个例子就是你分类垃圾,没有预处理这就是一堆杂乱的垃圾堆积在一起,各种品种都交错杂乱,预处理后,你可能要做的是把这边一样的垃圾和那边一样的垃圾选择一下他们的归类。 先从大家最喜欢看到的算子均值滤波开始(读取图像不用说吧,就是read_image()算子直接读就行了哈。。。): 1.图像平滑之均值滤波算子:mean_image(Image : ImageMean : MaskWidth, MaskHeight : ):
- 输入参数:
- Image:输入图像(单通道灰度图像)。
- MaskWidth, MaskHeight:滤波掩模的宽度和高度(需为奇数,如 3, 5, 7 等)。
- 输出参数:
功能与原理
- 均值滤波:
- 对图像中每个像素,取其周围 MaskWidth × MaskHeight 邻域内的所有像素灰度值,计算平均值后替换原像素值。通俗的话来讲就是把图像想象成一个二维的数组,你拿着一个5*5的矩形框在数组上滑动,滑动到哪颗像素,就把这个像素在框内的周边像素的值全部加起来做个除法均值,在把均值放回这颗像素里作为他的值。
- 作用:
- 平滑图像:抑制高频噪声(如高斯噪声、椒盐噪声)。
- 模糊细节:可用于预处理中降低纹理干扰(如 Blob 分析前去除细小噪声)。
实例代码:- * 读取图像
- 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 等)。
- 输出参数:
高斯滤波原理:
- 高斯核:
- 高斯滤波通过定义一个二维高斯函数(钟形曲线)作为卷积核,对图像进行加权平均。
- 高斯函数公式:
- 其中 σ 是标准差,控制滤波的平滑强度。
- 滤波过程:
- 对图像中每个像素,用高斯核覆盖其邻域,计算邻域内像素的加权平均值,权重由高斯函数决定。
- 特点:
- 中心权重高,边缘权重低,保留更多边缘信息。
- 核尺寸(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 等)。
- 输出参数:
中值滤波原理
- 核心操作:
- 对图像中每个像素,取以该像素为中心的 MaskWidth × MaskHeight 邻域内所有像素的灰度值。
- 将邻域内的像素值排序,取中间值(中位数)作为当前像素的新值。
- 处理过程:参考均值滤波,说白了就是把矩形框内所有像素值排序取中间值填入像素。
- 特点:
- 非线性滤波:不依赖线性运算,对极端噪声(如椒盐噪声)鲁棒。
- 边缘保留:中位数对局部极值不敏感,能有效保护边缘信息。
功能与作用
- 噪声去除:
- 特别适用于椒盐噪声(随机出现的黑白点)或脉冲噪声。
- 对小面积孤立噪声效果显著,但对高斯噪声效果有限。
- 细节保留:
- 相比均值滤波或高斯滤波,中值滤波在平滑噪声的同时,能更好地保留图像边缘和纹理。
- 应用场景:
- 工业检测:去除金属表面划痕检测中的噪声。
- 医学成像:消除 X 光或显微镜图像中的随机噪声。
- 文档处理:清理扫描文件中的斑点。
实例代码:- * 读取图像
- 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)。
- 输出参数:
核心原理
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 : : )
- 输入参数:
- 输出参数:
- ImageEquHisto:直方图均衡化后的输出图像。
核心原理
直方图均衡化的目标是拉伸图像的灰度分布,使其覆盖更广的动态范围,从而增强对比度。具体步骤如下:
说白了就是统计图像中的灰度出现的次数作为直方图,然后将主要的各个直方图的灰度区域和领域的区别增大增亮,让你可以清晰的看到各个灰度分布的成像
功能与作用
- 对比度增强:
- 扩展图像的灰度范围,使暗区更亮、亮区更暗,提升整体对比度。
- 细节突出:
- 增强隐藏在高光或阴影中的细节(如医学图像中的组织、工业图像中的缺陷)。
- 适用场景:
- 低对比度图像(如背光拍摄、雾天图像)。
- 医学成像(X光、MRI图像增强)。
- 工业检测(表面缺陷的视觉增强)。
实例代码:- * 读取图像
- 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_maxequ_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:加法因子(偏移量)。
- 输出参数:
核心功能
- 像素级运算:
- 对两幅图像的每个像素进行乘法和加法操作,生成新图像。
- 应用场景:
- 图像融合:通过乘法叠加掩模(如 ROI 区域提取)。
- 对比度增强:结合乘法(调整对比度)和加法(调整亮度)。
- 传感器校准:校正非线性响应或添加固定偏移量。
参数说明
参数作用Mult控制乘积结果的幅度,Mult > 1 放大对比度,0 < Mult < 1 降低对比度。Add调整输出图像的全局亮度,正值增亮,负值减暗。 与其他算子的对比
算子公式适用场景mult_imageI1×I2×M+A图像融合、对比度与亮度调整add_imageI1+I2图像叠加、亮度叠加scale_imageI×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'。
- 输出参数:
(解释的话这里假定参考图像就是做过均值滤波的图像,此函数适用于缺陷提取中总是存在图像灰度均匀区域中总有特别亮于此区域或者暗于此区域的瑕疵提取)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:全局阈值分割算子。它根据输入的阈值下限和上限,将图像中的像素分为两部分,满足条件的像素被归为一个区域。这种方法简单直接,但只适用于图像灰度分布较为均匀的情况。
2、auto_threshold:直方图阈值分割算子。它通过分析图像的直方图,自动确定一个或多个阈值来进行分割。这种方法对于具有明显双峰或多峰的直方图图像效果较好。
3、bin_threshold:已过时的算子,建议使用binary_threshold替代。它使用自动确定的阈值分割单通道的灰度图像。首先确定输入图像的相对直方图,然后从直方图中提取相关的最小值作为阈值操作的参数。
4、binary_threshold:二值阈值分割算子。它使用自动确定的全局阈值分割单通道图像,并在输出区域中返回分割后的结果。适用于在均匀照明的背景下分割字符等对象。
5、dyn_threshold:局部阈值分割算子。它根据图像的局部特征来确定阈值,因此可以处理灰度分布不均匀的图像。通常,阈值图像是原始图像的平滑版本,通过比较原始图像和阈值图像来确定分割区域,该算子使用前一般会先使用平滑算子将图像平滑。
6、fast_threshold:fast_threshold从输入图像中选取灰度值g满足以下条件的像素:MinGray |