Halcon算子应用和技巧15
本篇博文主要用于记录学习Halcon中算子的应用场景,及其使用代码和图像展示。只讲通俗易懂使用方法,不讲原理,不讲原理,不讲原理,重要的事情说三遍。提示:以下是本篇文章正文内容,下面案例可供参考, 注意参数坐标的使用,能帮助你理解算子。
提示:若没有查找的算子,可以评论区留言,会尽快更新
Halcon算子应用和技巧15
前言
提示:可以使用搜索小工具搜索对应算子名称:
本篇博文主要用于记录学习Halcon中算子的应用场景,及其使用代码和图像展示。只讲通俗易懂使用方法,不讲原理,不讲原理,不讲原理,重要的事情说三遍。
提示:以下是本篇文章正文内容,下面案例可供参考, 注意参数坐标的使用,能帮助你理解算子
一、Halcon应用?
Halcon 是一个强大的图像处理工具,该工具是为了解决机器视觉项目任务而创建的。
二、算子汇总
每一博文仅展示10个算子,点击此链接进行查询所有算子,并点击对应算子跳转相应博文。
三、应用算子
141. min_max_gray()
先上代码:
read_image (Image, 'mreut')
get_image_size (Image, Width, Height)
dev_display (Image)
dev_set_draw ('margin')
* Create two regions
gen_rectangle1 (Rectangle1, 350, 100, 450, 200)
min_max_gray (Rectangle1, Image, 5, Min1, Max1, Range1)
解析
获得指定区域(比如红色矩形)的灰度值的最小和最大值,以及灰度值的范围。
PS:注意通过百分比控制区域的灰度直方图有效范围,eg: percent = 5, 则表示灰度值最低丢弃5%, 灰度值最高丢弃5%。这里我给出官方例子:
Example:
With area = 60, Percent = 5, d.h. i.e. 3 pixels, histogram = [2,8,0,7,13,0,0,…,0,10,10,5,3,1,1],
Minimum = 0, Maximum = 255, range = 255
min_max_gray returns: Min = 1, Max = 253, Range = 252.
这里丢弃的是像素个数,因此灰度值0一共2个像素,灰度值1是8个像素,需要丢弃3个,所以灰度值0的没了,灰度值1的还有7个像素,所以最小灰度是1.
142. dual_threshold()
先上代码:
dev_close_window ()
* 第一次拍摄
read_image (Traffic1, 'traffic1')
* 第二次拍摄
read_image (Traffic2, 'traffic2')
convert_image_type (Traffic1, ImageConverted1, 'int2')
convert_image_type (Traffic2, ImageConverted2, 'int2')
* 图像做差
sub_image (ImageConverted1, ImageConverted2, ImageSub, 1, 0)
*筛选区域
dual_threshold (ImageSub, RegionDiff, 500, 20, 10)
解析
该算子选择灰度值 >= Threshold的正区域,或者灰度值 <= -Threshold的负区域。并且要求区域面积大于MinSize,区域内最大灰度值要大于MinGray。
总结如下:
选择的是(dual region)双区域,即正区域和负区域
对最小区域尺寸和灰度值有限制。
上图是同一辆车在道路上运行时,拍摄的两幅图像做差后得到的图像。黑色部分是当前时刻的车位置,白色部分是下一时刻的车位置。做差后得到的图像灰度值有正有负。黑色部分灰度值都远小于0,白色部分灰度值都远大于0,背景部分灰度值接近0.
接下来对差值图像做处理。dual_threshold (ImageSub, RegionDiff, 500, 20, 10)算子首先设置Threshold =10,选择出灰度值大于10的白色部分和灰度值小于-10的黑色部分。MinSize=500和MinGray=20分别对最小区域尺寸和区域内灰度值做了进一步筛选。MinGray=20是对区域的最大绝对灰度值小于 20的区域被抑制。这意味着:灰度值分别位于 - Threshold和 Threshold、 - MinGray和 MinGray之间的区域不予考虑。建议运行官方的例子去一行一行理解。
143. watersheds()
先上代码:
read_image (Br2, 'particle')
gauss_filter (Br2, ImageGauss, 9)
invert_image (ImageGauss, ImageInvert)
watersheds (ImageInvert, Basins, Watersheds)
dev_set_draw ('margin')
dev_set_colored (12)
dev_display (Br2)
解析
其又称为:分水岭算法,这是一种典型的基于边缘的图像分割算法。通过寻找区域之间的分界线,对图像进行分割。他的思想是:把图像看作是一张地形图,其中像素的灰度值表示为区域高度。灰度值越高,地势越高。
低地聚集地方如同一块盆地,如果模拟向这片区域注水,那么每块区域将组织成一个积水区域,即图像上的分割区域, 区域和区域之间的边界就是区域的边界。其特别适用于蜂窝状的内容划分。如果前景目标比较亮而背景比较暗,可以使用convert_image算子对颜色进行翻转。

144. watersheds_threshold()
先上代码:
*输入待检测的木材图像
read_image (Image, 'data/woodboard')
*将原始图转化为灰度图。便与后续的平滑处理
rgb1_to_gray (Image, GrayImage)
*对单通道图像进行高斯平滑处理,以去除噪声
gauss_filter (GrayImage, ImageGauss, 11)
*对高斯平滑后的图像进行分水岭处理,阈值分割,提取出盆地区域
watersheds (ImageGauss, Basins1, Watersheds)
watersheds_threshold(ImageGauss, Basins, 50)
解析:
除了watersheds算子外,也可以使用watersheds_threshold算子进行分水岭分割。二者的区别在于,后者比前者多了一步操作,即在得到初步的分水岭分割结果之后,将灰度小于阈值的分水岭合并。具体来说,假设分水岭的最小灰度Wmin, 水岭两侧的“洼地”区域的最小灰度分别为B1,B2,如果max{(Wmin-B1),(Wmin-B2)}的值小于阈值,则将这两个“洼地”区域合并,分水岭消失。通过这样的阈值处理,符合灰度阈值条件的灰度“洼地”区域即被提取出来。

一位博主的解释很形象,大家参考一下:参考博文
满足条件,将合并为一个区域:

145. draw_circle ()
解析:
顾名思义:使用鼠标绘制圆形,配合gen_circle使用,获得绘制的区域
146. pow_Image()
先上代码:
read_image (Image, 'printer_chip/printer_chip_01')
pow_image (Image, PowImage, 2)
解析:
对图像进行幂次运算,其会自动将byte图像转为real图像,比如图像坐标点的灰度值是:223
经过幂次为2的处理,将变为real图像格式,即223^2 = 49729, 大家可以自行观察一下。

147. tuple_gen_const ()
先上代码:
tuple_gen_const (10, 25, Newtuple)
解析:
在halcon中有类似数组一样的构建函数,生成数组的长度和值内容,上面语句是生成了长度为10,每一个值都是25的数组列表Newtuple。
148. tuple_find_first ()
先上代码:
tuple := [1, 25, 15, 20, 8 ,5]
tuple_find_first (tuple, 15, Index)
解析:
查询数组中第一次出现你要查找的元素下标,Index = 2。
149. tuple_find_last()
先上代码:
tuple := [1, 25, 15, 20, 15 ,5]
tuple_find_last (tuple, 15, Index)
解析:
查询数组中最后一次出现你要查找的元素下标,Index = 4。和tuple_find_first()恰好相反。
150. tuple_div()
先上代码:
* 情形1:
tuple1 := [1, 25, 15, 20, 8 , 5]
tuple2 := [1, 25, 15, 20, 15 ,5]
tuple_div (tuple2, tuple1, Quot)
* Quot = [1, 1, 1, 1, 1, 1]
* 情形2:
tuple1 := [5]
tuple2 := [1, 25, 15, 20, 15 ,5]
tuple_div (tuple2, tuple1, Quot)
* Quot = [0, 5, 3, 4, 3, 1]
* 情形3, 浮点:
tuple1 := [5.0]
tuple2 := [1, 25, 15, 20, 15 ,5]
tuple_div (tuple2, tuple1, Quot)
* Quot = [0.2, 5.0, 3.0, 4.0, 3.0, 1.0]
解析:
Quot := Q1 / Q2,将两个数组相除,其是相同长度;或者其中一个是长度为1的数组。
以上内容陆续更新。。。
如有问题,欢迎大家指出,谢谢!!!
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)