本节将简要介绍Halcon中有关图像的两类基本运算,分别是代数运算和逻辑运算。除此之外,还介绍几种特殊的代数运算。
目录
1.引言
图像运算指以图像为像素为单位进行的操作(有时称为pixel-level)。具体的运算主要包括算术和逻辑运算。
- 算术运算:包括加、减、乘、除,以及基于四种基本运算的复合运算。
- 逻辑运算:包括与、或、非、同或、异或运算等等。
2. 基本运算
本节将逐一介绍上述各类基本运算的实现过程,重点介绍各类运算对应的Halcon算子。
Halcon提供的图像代数运算算子分为两类,一类是基础算子,包括“加、减、乘、除”,另一类是复合运算算子,比如线性加权运算。
为了讨论方便,本节分别用和
表示两幅待处理的图像,用
表示结果图像。
2.1 加法运算
图像的加法运算可用下式表示:
Halcon使用add_image算子实现图像相加运算,即对应位置的像素点相加。
add_image(Image1, Image2, ResultImage, Mult, Add)
参数说明:
- Image1:输入图像 1。
- Image2:输入图像 2。
- ResultImage:输出图像,存储运算结果。
- Mult:乘法因子(可选,默认为 1)。
- Add:加法因子(可选,默认为 0)。
2.2 减法运算
图像的减法运算可用下式表示:
Halcon使用sub_image算子实现图像相加运算,即对应位置的像素点相减。
sub_image(Image1, Image2, ResultImage, Mult, Add)
2.3 乘法运算
图像的乘法运算可用下式表示:
Halcon使用mult_image算子实现图像点乘运算,即对应位置的像素点相乘。
mult_image(Image1, Image2, ResultImage, Mult, Add)
2.4 除法运算
图像的除法运算可用下式表示:
Halcon使用div_image算子实现图像除法运算,即对应位置的像素点相除。
div_image(Image1, Image2, ResultImage, Mult, Add
2.5 综合实例
以下是一个完整的示例,展示如何对两幅图像进行加、减、乘、除运算:
* 读取图像
read_image(Image1, 'image1.png')
read_image(Image2, 'image2.png')
* 加法
add_image(Image1, Image2, AddResult, 1, 0)
* 减法
sub_image(Image1, Image2, SubResult, 1, 0)
* 乘法
mult_image(Image1, Image2, MultResult, 1, 0)
* 除法
div_image(Image1, Image2, DivResult, 1, 0)
* 显示结果
dev_display(AddResult)
dev_display(SubResult)
dev_display(MultResult)
dev_display(DivResult)
下面统一说明一些注意事项:
- 图像尺寸:参与运算的两幅图像必须具有相同的尺寸。
- 图像类型:通常要求图像类型一致(如 byte、uint2、real 等)。
- 溢出处理:运算结果可能会超出图像数据类型的范围,Halcon 会自动进行截断或归一化处理。
3. 逻辑运算
在 Halcon 中,图像的逻辑运算是对图像的像素值进行逐像素的逻辑操作(如与、或、非、异或等)。这些操作通常用于二值图像(像素值为 0 或 1),但也可以应用于多通道图像或灰度图像。
3.1 逻辑与运算
对两幅图像的像素值进行逐像素的逻辑与操作:
Halcon使用bit_and算子实现图像相加运算,即对应位置的像素点取逻辑“与”运算。
bit_and(Image1, Image2, ResultImage)
参数说明:
- Image1:输入图像 1。
- Image2:输入图像 2。
- ResultImage:输出图像,存储逻辑与运算的结果。
3.2 逻辑或运算
对两幅图像的像素值进行逐像素的逻辑或操作:
Halcon使用bit_or算子实现图像或运算,即对应位置的像素点取逻辑“或”运算。
bit_or(Image1, Image2, ResultImage)
3.3 逻辑非运算
对图像的像素值进行逐像素的逻辑非操作(取反):
Halcon使用bit_not算子实现图像非运算,即对应位置的像素点取逻辑“非”运算。
bit_not(Image, ResultImage)
3.4 逻辑异或运算
对两幅图像的像素值进行逐像素的逻辑异或操作:
Halcon使用bit_xor算子实现图像异或运算,即对应位置的像素点取逻辑“异或”运算。
bit_xor(Image1, Image2, ResultImage)
3.5 综合实例
以下是一个完整的示例,展示如何对两幅图像进行逻辑与、或、非、异或运算:
* 读取图像
read_image(Image1, 'image1.png')
read_image(Image2, 'image2.png')
* 逻辑与运算
bit_and(Image1, Image2, AndResult)
* 逻辑或运算
bit_or(Image1, Image2, OrResult)
* 逻辑非运算
bit_not(Image1, NotResult)
* 逻辑异或运算
bit_xor(Image1, Image2, XorResult)
* 显示结果
dev_display(AndResult)
dev_display(OrResult)
dev_display(NotResult)
dev_display(XorResult)
最后,说一下注意事项
- 图像类型:逻辑运算通常用于二值图像(像素值为 0 或 1),但也可以应用于灰度图像或多通道图像。
- 图像尺寸:参与运算的两幅图像必须具有相同的尺寸。
- 数据类型:如果图像不是二值图像,Halcon 会将其转换为二值图像后再进行逻辑运算。
4. 特殊运算
再介绍几种Halcon提供的几种特殊运算情况。
4.1 图像反转
Halcon中使用invert_image算子用于对图像的像素值进行反转操作。
对于灰度图像,图像的反转运算如下:
该算子的声明如下:
invert_image(Image, ImageInvert)
参数说明:
- Image:输入图像(可以是灰度图像或多通道图像)。
- ImageInvert:输出图像,存储反转后的结果。
注意事项:
- 图像类型:invert_image 适用于灰度图像和多通道图像。
- 数据类型:反转操作的结果与输入图像的数据类型一致(例如,8 位图像的反转结果仍然是 8 位图像)。
- 二值图像:对于二值图像(像素值为 0 或 1),反转操作会将 0 变为 1,1 变为 0。
以下是一个简单的示例,展示如何使用 invert_image 对图像进行反转操作:
* 读取图像
read_image(Image, 'example_image.png')
* 对图像进行反转操作
invert_image(Image, ImageInvert)
* 显示原图和反转后的图像
dev_display(Image)
dev_display(ImageInvert)
4.2 图像灰度缩放
Halcon中使用scale_image算子用于对图像的像素值进行灰度缩放操作。
对于灰度图像,图像的灰度缩放运算如下:
该算子的声明如下:
scale_image(Image, ImageScaled, Mult, Add)
参数说明:
- Image:输入图像(可以是灰度图像或多通道图像)。
- ImageScaled:输出图像,存储缩放和偏移后的结果。
- Mult:缩放因子(乘法系数)。
- Add:偏移量(加法系数)。
以下是一个简单的示例,展示如何使用 scale_image 对图像进行缩放和偏移操作:
* 读取图像
read_image(Image, 'example_image.png')
* 对图像进行缩放和偏移操作
Mult := 2.0 * 缩放因子
Add := 50 * 偏移量
scale_image(Image, ImageScaled, Mult, Add)
* 显示原图和缩放后的图像
dev_display(Image)
dev_display(ImageScaled)
注意事项:
- 数据类型:scale_image 的输出图像数据类型与输入图像一致。如果缩放后的像素值超出数据类型的范围,Halcon 会自动进行截断。
- 多通道图像:对于多通道图像(如 RGB 图像),scale_image 会对每个通道分别进行缩放和偏移操作。
(初稿完成,最新更新2025-02-02)
本专栏将介绍基于Halcon的各种传统经典的数字图像处理技术,所介绍内容基本与Gonzalez的教材保持一致。作为学习和实践DIP技术的入门教程。
感谢大家的支持和浏览,本专栏将持续更新,每篇的篇幅控制在5000字左右,这样大家阅读起来也比较轻松。估计2025年上半年完成全部内容,欢迎加收藏。但由于到了假期,更新的速度不会很快。
在专栏全部完成之前,所有内容将一直免费。