本节将简要介绍Halcon中有关图像的基本操作,包括图像读取、显示、格式转换和保存等功能。了解这些内容,将为后续的图像处理做好准备。
目录
1. Halcon支持的图像格式
Halcon支持多种图像格式,包括BMP、JPEG、PNG、GIF、TIFF和RAW等。
在数据类型方面,Halcon同样支持丰富多样的类型,如byte、int1、uint2、int2、int4、int8、real、complex、vector_field_relative、vector_field_absolute、direction和cyclic等。
1.1 图像格式
- BMP格式:它是一种与硬件设备无关的图像文件格式,使用位映射存储格式,不采用其他任何压缩,因此文件占用空间较大。该格式支持1bit、4bit、8bit及24bit的图像深度,且在Windows环境中运行的图形图像软件都支持BMP图像格式。
- JPEG格式:它是一种有损压缩格式,其优点在于可以将图像压缩在较小的储存空间,适合网络传输。但缺点是图像中重复或不重要的资料会被丢失,容易造成图像数据的损伤。几乎所有的操作系统均支持该图像格式。
- PNG格式:全称是Portable Network Graphics,它是一种无损压缩的位图图像格式,广泛用于网页设计、图标制作等领域。它提供无损压缩图像文件,支持24位和48位真彩色图像,并支持透明背景和变显图像。
- GIF格式:全称是Graphics Interchange Format,用于以HTML语言方式显示索引彩色图像,在网络上应用广泛。支持透明背景和动画,网上流行的动图,都是GIF格式的。但该图像格式只支持256色,压缩率通常在50%左右。
- TIFF格式:全称是Tag Image File Format,它是一种灵活的位图格式,主要用来存储包括照片和艺术图在内的一种无损压缩格式,压缩比较低,只有2-3倍,但易于处理。是Adobe公司PS软件在处理图像时使用的一种标准图像。
- RAW格式:未经处理直接从CCD或CMOS上所得到的原始图像信息,文件超大,但特别适合后期出片调整。
- 为0到255。
1.2 Halcon支持的图像数据类型
- byte:每像素1字节,无符号,值范围为0到255。
- int1:每像素1字节,有符号,值范围为-128到127。
- uint2:每像素2字节,无符号,值范围为0到65535。
- int2:每像素2字节,有符号,值范围为-32768到32767。
- int4:每像素4字节,有符号,值范围为-2147483648到2147483647。
- int8:每像素8字节,有符号(仅适用于x64系统),值范围为-9223372036854775808到9223372036854775807。
- real:每像素4字节,浮点类型,6位有效十进制数字精度,值范围为-3.4e38到3.4e38。
- complex:real类型的两个矩阵,向量。
- vector_field_relative:real类型的两个矩阵,向量。
- vector_field_absolute:real类型的两个矩阵,绝对坐标。
- direction:每像素1字节,无符号,值范围为0到179,角度除以2。数值180到254被自动设置为值255,这被解释为未定义的角度。
- cyclic:每像素1字节,无符号,循环算术,范围为0到255。
2. Halcon读取图像文件
根据待读取图像文件的数目不同,Halcon提供了两种不同的图像文件读取方式,分别是:
- 只处理单幅图像,调用read_image算子或read_multi_channel_image算子;
- 如果一次性处理多幅图像(如图像序列),调用read_sequence算子或read_image_sequence算子。
本节将重点介绍第一种方式,也就是读取单幅图像的操作。它有几种不同的实现方式。
2.1 直接调用read_image算子读取图像
read_image算子是Halcon官方提供的读取图像文件的算子。使用它一次可读取一幅指定路径下具有特定文件名的图像文件。
该算子的定义和参数说明如下:
read_image (Demo, 'E:/Demo.jpg')
- Image为读取的图像变量名称,注意,这个变量名需是在程序里面使用的变量名;
- FileName为图像文件所在的完整路径以及文件名。需要注意的是,文件名是需要带后缀的,且后缀对应的图像格式必须是上一节介绍的Halcon支持的图像格式。
在调用时,通常需要录入上面两个参数,两个参数中间用逗号间隔开即可。
下面来一个实例。假设要打开“E:\Demo.jpg”的图像文件,使用第一种方式是直接键入一下语句
read_image (Demo, 'E:/Demo.jpg')
2.2 用“读取文件对话框”读取图像文件
这种方式可以视为第一种方式的一种快捷实现方式。具体的实现步骤是:
- 按CTRL+R快捷键打开读取图像对话框;
- 在对话框中选择文件名称所在的路径及变量名称;
- 选择语句插入位置;
- 点击确定。
其关键步骤是第二步,即在呼出的对话框中设定待读取的图像文件的路径和变量名称,然后自动添加对应的代码段。与第一种方式相比,这种方式有效减少录入路径和文件名所需要的时间,同时也能避免因为录入信息有误所导致的错误(比如路径信息不正确等)。在此为Halcon的设计者点赞,不愧是德国人设计的软件,用户至上。
第二种方式是在呼出的读取文件对话框中,可以手动选取图像文件,变量名称也可手动修改,默认值是文件名(无后缀),如下图所示。点击确定,就会在光标处插入对应的代码(和上面的一行代码完全一致)。大家可以自己练习一下。

除了上面介绍的针对读取单幅图像操作之外,还可以通过其他算子完成针对图像序列数据的读取。等到用到时再详细介绍。
3. Halcon显示图像文件
完成图像数据的读取后,通常跟着一系列的处理算子。为了更直接地观察处理过程,通常需要在指定窗口中显示某个处理结果,此时就需要图像显示功能。
Halcon提供的丰富的图像显示操作算子,在此主要介绍三种常见方式:
- 简单图像显示操作,通过调用disp_image算子;
- 彩色图像显示操作,通过调用disp_color算子;
- 通用图像显示操作,通过调用dev_display算子。
需要提前说明的是,上述各种显示图像的方式,都是在某个窗口里面显示图像信息的。该窗口可以提前创建,也可以临时创建。临时创建的优点是随用随创建,代码量小,但如果想在同一个窗口中完成不同的操作,则需要该窗口的句柄信息,这种情况下推荐提前创建窗口。
创建窗口的步骤一点都不复杂,首先使用dev_open_window算子创建一个窗口,然后使用dev_set_window算子将该窗口设置为活动窗口(即激活该窗口)。
具体操作可参考以下两行代码:
* 打开一个窗口
dev_open_window(0, 0, 512, 512, 'Demo', WindowHandle)
* 设置活动窗口
dev_set_window(WindowHandle)
以上代码完成的是,创建一个512*512大小的窗口,窗口名字是“Demo”,该名称会显示在床后的标题栏中,窗口的句柄是WindowsHandle,相当于该窗口对应的变量名。
下面详细介绍三种文件显示方法,最后配上一个实例,比较三种方法。
3.1 直接调用disp_image算子显示图像
使用disp_image算子显示图像非常简单,一般有两种方式,一种提供窗口句柄,一种是不需要提供句柄信息,如下:
- disp_image(Image, WindowHandle)
- disp_image(Image)
以后者为例,下面的代码完成读取图像和显示图像的功能,仅供参考。
* 读取图像
read_image(Image, 'example.tiff')
* 显示图像
disp_image(Image)
3.2 调用disp_color算子显示彩色图像
该算子只用于显示彩色图像,或者更准确地说,只用于显示RGB三通道的图像。
因此,在使用disp_color算子进行显示前,请确认带显示的图像是以RGB三通道形式存在。对于单通道的灰度图,需要提前使用convert_image_type算子可以将其转换为RGB格式:
* 将单通道灰度图Image转换为RGB三通道彩色图
convert_image_type(Image, ImageRGB, 'byte')
* 调用算子显示彩色图像
disp_color(ImageRGB)
其他方面,与disp_image算子使用要求一致。
3.3 调用dev_display算子显示多通道图像
最后介绍的dev_display算子是一种通用显示算子,能显示包括图像、区域、轮廓等在内的各类特定对象。该算子会根据输入参数中数据的类型信息,自动完成显示功能。
对于图像显示功能来说,disp_image算子和disp_color算子能做的事情,dev_display算子都能做,且可直接显示包括二值图像、单通道灰度图像、多通道彩色图像,等等。
在此也给出一个简单的实例,不再详细加以说明。
read_image(Image, 'example_image')
dev_display(Image)
4. Halcon保存图像文件
针对图像操作的三个基本操作,读取、显示和保存,本子节介绍最后的保存图像操作。
相对于读取和显示功能,在Halcon中实现图像保存操作的算子比较单一,主要通过write_image算子实现。该算子允许将图像保存为多种格式,如BMP、PNG、JPEG、TIFF等。以下是相关介绍及实例。
该算子的声明如下:
write_image(Image, Format, FillColor, FileName)
参数说明:
- Image: 要保存的图像。
- Format: 图像保存格式,如 'bmp', 'png', 'jpeg', 'tiff' 等。
- FillColor: 填充颜色,通常用于单通道图像保存为多通道格式时。
- FileName: 保存的文件路径及名称。
下面给出一个简单的实例
read_image(Image, 'particle')
* 保存图像
write_image(Image, 'bmp', 0, 'output_image.bmp')
5. Halcon获取图像信息
图像通常有空间分辨率(即长度宽度)、通道(单色图像还是彩色图像)、存储数据类型(单个像素点对应的存储数据类型)、图像格式等信息。Halcon提供了丰富的算子,方便快捷地获取上述图像信息。
5.1 获取图像的尺寸信息
可以使用get_image_size算子获取图像的尺寸信息。该算子的声明如下:
get_image_size(Image, Width, Height)
图像的宽度和高度信息,分别赋值给指定的变量中。
下面给出一个使用该算子进行指定窗口大小显示图像的实例。
* 读取图像
read_image(Image, './source.jpg')
* 获取图像尺寸
get_image_size(Image, Width, Height)
* 打开窗口并显示图像
dev_open_window(0, 0, Width, Height, 'black', WindowHandle1)
dev_display(Image)
在上述代码中,首先使用 read_image 算子读取图像,然后使用 get_image_size 算子获取图像的宽度和高度。接下来,使用 dev_open_window 和dev_display算子在指定大小的窗口(与图像尺寸一致)中显示图像。
5.2 获取图像的数据类型信息
可以使用get_image_type算子获取图像的类型信息。该算子的声明如下:
get_image_type(Image, Type)
该算子返回的图像类型包括12种,即Type ='byte', 'complex', 'cyclic', 'direction', 'int1', 'int2', 'int4', 'int8', 'real', 'uint2', 'vector_field_absolute', 'vector_field_relative'。
至于各种类型的具体含义,以及对应的图像类型,在此不再详细介绍。另外,对于多通道的输入图像,该算子返回第一个通道的类型。
本节小结:
简要介绍了Halcon提供的图像操作基本三件套:读取、显示和保存。各位需要牢记每一种各种基本操作对应的算子。此外,还介绍了获取图像尺寸信息和数据类型信息的两个算子。
下一节将介绍Halcon有关图像几何变换的各种算子。
(初稿完成,最新更新2025-01-29)
本专栏将介绍基于Halcon的各种传统经典的数字图像处理技术,所介绍内容基本与Gonzalez的教材保持一致。作为学习和实践DIP技术的入门教程。
感谢大家的支持和浏览,本专栏将持续更新,每篇的篇幅控制在5000字左右,这样大家阅读起来也比较轻松。估计2025年上半年完成全部内容,欢迎加收藏。但由于到了假期,更新的速度不会很快。
本人保证,在专栏全部完成之前,将会一直免费。