文章目录
前言
之前做项目一直用的opencv最近发现halcon做图像项目更加的精确,也更适合工业大项目,所以进行学习,接下来我将会不断更新我的学习教程,方便以后自己查阅,也为了方便广大网友;
学习目录
由于我有opencv的基础所以就照着opencv的学习思路进行学习,算法都是相通的,他们的底层原理都一样我接下来主要熟悉halcon的语法,以及MVTec HDevelop操作界面的一些基本操作;
- HDevelop 界面熟悉:程序窗口、变量窗口、图形窗口、单步调试、断点、F1 帮助
- 基础算子:read_image、dev_open_window、dev_close_window、dev_display、dev_clear_window、write_image
- 读取图片,创建窗口,绘制矩形 ROI,保存处理后的图像
熟悉界面
- 界面介绍
在HDevelop界面中有三部分,以下图片中
第一部分是程序窗口,进行程序的编写;
第二部分是图形窗口,显示图像的;
第三部分是变量窗口,显示程序中所涉及到的所有的变量;

如果不小心以上窗口被关闭了,可以在窗口 导航栏重新打开;

以上导航栏中默认罗列着一些常用的功能,像运行(F5),单步调试(F6),注释程序(F4)等,可以自己在软件里面进行熟悉一下。
- 我们学习halcon最好的办法就是跟着官方教程来学习,我们可以从帮助导航栏查看官方文档;

还可以跟着官网的例子教程学习,在导航栏文件 那一栏里面有一个浏览示例程序的选项,我们可以跟着程序学习会更快速,也更有助于理解;

- 如果在程序中遇到不会的函数可以把光标放到该函数处按F1就会出现该函数的帮助文档;如下图所示。

参数和数据结构
- Halcon有两种基本的数据形态:
图像数据:例如: Image、Region、Xld(亚像素)
控制数据:例如:浮点数、整数、字符串、handle 等等 - 所有的运算算子参数都是以相同的参数方式排列:
输入图像:输出图像:输入控制:输出控制
并不是所有的算子都有以上四类参数,但是参数的排列的顺序是相同的;
例如:如果一个算子没有输入控制,和输出控制,那在相应位置处的参数是空的;如下算子

同理如果别的参数没有的话,参数的对应位置也是空的;

基础算子
基础的图片I/O和窗口操作
bash
#读取一张图片并把图片数据赋值给Image
read_image (Image, 'printer_chip/printer_chip_01')
#重新打开一个长宽都是512个像素,背景为黑色的窗口
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
#关闭最新打开的窗口
dev_close_window ()
#显示读取的图片
dev_display (Image)
#清除最新打开窗口里面的内容
dev_clear_window ()
#把图片保存在你设置的路径里面
write_image (Image, 'png', 0, 'D:/learn/halcon/test.png')
图像色彩空间转换
- 灰度转换
bash
#输入一张图片
read_image (Image, 'D:/learn/halcon/lena.png')
#对图片灰度化处理(Image为一个三通道的图片)
rgb1_to_gray (Image, GrayImage)
- 通道的分离
bash
#读取一张三通道的图片
read_image (Image, 'D:/learn/halcon/lena.png')
#分离一个三通道的图片
decompose3 (Image, Image1, Image2, Image3)
#星号里面的代码都是为了把三张图片并排在一个窗口显示而写的
***************
concat_obj (Image1, Image2, ObjectsConcat)
concat_obj (ObjectsConcat, Image3, ObjectsConcat1)
tile_images (ObjectsConcat1, TiledImage, 3, 'vertical')
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
dev_display (TiledImage)
***************
#合并三个单通道的图片成一张三通道的图片
compose3 (Image1, Image2, Image3, MultiChannelImage)

以上图片依次是R、G、B通道的图片;
- 转换到hsv颜色空间
bash
#读取一张三通道图片
read_image(Image,'patras')
dev_display(Image)
#通道分离
decompose3(Image, Image1, Image2, Image3)
#从rgb颜色空间转换到hsv颜色空间
trans_from_rgb(Image1,Image2,Image3,ImageH,ImageS,ImageV,'hsv')
#从hsv颜色空间转换到rgb颜色空间
trans_to_rgb(ImageH,ImageS,ImageV,ImageR,ImageG,ImageB,'hsv')
#合并三个通道的图片成三通道的图片
compose3(ImageR,ImageG,ImageB,Multichannel)
dev_display(Multichannel)
示例:通过HSV空间分割出图片中红色区域
bash
read_image(Image,'patras')
decompose3(Image, Image1, Image2, Image3)
trans_from_rgb(Image1,Image2,Image3,ImageH,ImageS,ImageV,'hsv')
threshold (ImageH, Region_low, 0, 20)
threshold (ImageH, Region_high, 245, 255)
union2 (Region_low, Region_high, RegionH)
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
dev_display (RegionH)
运行结果:

从上图可以看出红色区域基本被分割出来;
阈值算子
- threshold --- 使用全局阈值分割图像
bash
#读取一张图片
read_image(Image,'fabrik')
#全局固定阈值
threshold (Image, Region, 185, 255)
- auto_threshold --- 根据图像直方图自动生成阈值进行图像分割
bash
read_image(Image,'fabrik')
auto_threshold (Image, Regions, 2)
- dyn_threshold --- 使用局部阈值对图像进行分割
bash
read_image(Image,'fabrik')
dyn_threshold (Image, Image, RegionDynThresh, 5, 'light')
三种阈值算子的区别:
threshold:固定全局灰度区间,整张图统一阈值
auto_threshold:基于直方图,自动多区域全局阈值
dyn_threshold:局部动态阈值,原图与平滑背景对比
滤波算子
- 高斯滤波
作用:可以去除高斯噪声,颗粒随机噪点,随机噪声
bash
#输入一张图片
read_image (Image, 'D:/learn/halcon/lena.png')
#在这张图片上加入高斯噪声(白噪声)
add_noise_white (Image, ImageNoise, 60)
#高斯滤波算子
gauss_filter (ImageNoise, ImageGauss, 7)
#创建一个窗口
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
#展示经过高斯滤波后的图片
dev_display (ImageGauss)

以上图片左侧为原图,中间为加了高斯噪声的图片,右侧为高斯滤波处理过的图片;
- 中值滤波
作用:可以去除椒盐噪声
bash
#输入一张图片
read_image (Image, 'D:/learn/halcon/jiaoyan.png')
#中值滤波处理图片
median_image (Image, ImageMedian, 'circle', 1, 'mirrored')
#把原图和中值滤波后的图片放到一个元组里面
concat_obj (Image, ImageMedian, ObjectsConcat)
#打开一个窗口方便显示图片
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
#把两张图片在一个窗口里面显示
tile_images (ObjectsConcat, TiledImage, 2, 'horizontal')

以上图片左侧为有椒盐噪声的图片,右侧为经过中值滤波处理后的图片;可以看到处理效果还是很不错的;
- 双边滤波
作用:平滑平坦区域,边缘不模糊;
bash
read_image (Image, 'tooth_rim')
bilateral_filter (Image, Image, ImageBilateral, 3, 20, [], [])
- 引导滤波
作用:性能接近双边滤波,运算速度更快,适合流水线视觉项目。
bash
read_image (Image, 'tooth_rim')
guided_filter (Image, Image, ImageGuided, 3, 20)
以上是halcon的基础操作,如果帮到您了请点赞加收藏,如果有错误欢迎指正!