Blob 分析的想法非常简单:在图像中,相关对象(也称为前景)的像素可以通过它们的灰度值来识别。 例如,图 1 显示了液体中的组织颗粒。 这些粒子是亮的,液体(背景)是暗的。 通过选择亮像素(阈值),可以轻松检测到粒子。 在许多应用中,这种暗像素和亮像素的简单条件不再成立,但可以通过额外的预处理或像素选择/分组的替代方法来实现相同的结果。
blob 分析的基本思想:(a) 原始图像,(b) 提取的带有计算中心点的 blob。
Blob 分析的优势在于 HALCON 在此上下文中提供的大量运算符带来的极大灵活性。 此外,这些方法通常具有非常高的性能。
从Blob分析中已知的方法也可以与许多其他视觉任务相结合,例如,作为灵活生成感兴趣区域的预处理步骤。
首先,获取图像。请参阅上文中的hanlcon之图像采集
获得图像后,任务是选择前景像素。 这也称为分段。 此过程的结果通常称为 blob(二进制大对象)。 在 HALCON 中,数据类型称为区域。
在最后一步,计算区域(即像素数)、重心或方向等特征。
这个基本概念的一个例子是下面的程序,它属于上面解释的例子。 这里,图像是从文件中获取的。 使用阈值选择所有比 120 亮的像素。 然后,引入了一个不太明显的额外步骤:operator connection 将所有亮像素的集合分成所谓的连通分量。 这一步的效果是我们现在有多个区域,而不是阈值返回的单个区域。 这个程序的最后一步是计算一些特征。 此处,操作符 area_center 确定大小(像素数)和重心。 请注意 area_center 为所有三个特征参数返回多个值(每个连接组件一个值)。
read_image (Image, 'particle')
threshold (Image, BrightPixels, 120, 255)
connection (BrightPixels, Particles)
area_center (Particles, Area, Row, Column)
在许多情况下,blob 的分割将比上面的例子更先进。 其原因是,例如,杂乱或不均匀的照明。 此外,通常需要后处理,例如将特征转换为真实世界单位或结果可视化。
Blob 分析可以通过使用感兴趣的区域来加速。 可以限制搜索 blob 的区域越多,搜索就会越快越健壮。
有关详细信息,请参阅Halcon之感兴趣的区域。
在某些应用中,感兴趣的区域必须相对于另一个对象对齐。 或者,图像本身可以对齐,例如,通过旋转或裁剪它。
解决方案指南 II-B 第 42 页的 2.4.3.2 节中描述了如何使用基于形状的匹配来执行对齐。
与对齐类似,可能需要校正图像,例如,消除镜头畸变或将图像转换为参考视点。
有关校正图像的详细信息,请参见第 91 页上的第 3.4 节中的解决方案指南 III-C。
下一个重要的部分是图像的预处理。 在这里,可以使用 mean_image 或 gauss_filter 等运算符来消除噪声。 gauss_filter 的一个快速但不太完美的替代方案是 binomial_filter。 运算符median_image 可用于抑制小点或细线。 算子 anisotrope_diff 用于边缘保留平滑,最后使用 fill_interlace 来消除由隔行相机引起的缺陷。
可以为每个图像动态提取它们,而不是使用固定的阈值。 一个例子是具有多个峰值的灰度值直方图,每个对象类别一个。 在这里,您可以使用运算符 gray_histo_abs 和 histo_to_thresh。
作为一种高级替代方法,您可以将算子强度与仅包含背景的参考图像结合使用:在设置期间,您可以确定背景区域的平均灰度值。
在检查期间,您再次确定该平均灰度值。 如果它已更改,则相应地调整阈值。
对于分割,可以使用各种方法。 最简单的方法是阈值,即指定一个或多个属于前景对象的灰度值范围。 另一种非常常用的方法是 dyn_threshold。 在这里,第二张图像作为参考传递。 通过这种方法,使用局部阈值而不是全局阈值。 这些局部阈值存储在参考图像中。 参考图像可以是静态的,也可以是通过拍摄空背景的图片,也可以是使用平滑过滤器(如 mean_image)动态确定的。
一旦 blob 区域被分割,通常需要修改它们,例如,通过抑制小区域、给定方向的区域或靠近其他区域的区域。 在这种情况下,形态算子opening_circle 和opening_rectangle1 常用于抑制噪声,而Closing_circle 和closed_rectangle1 常用于填补空白。
可以使用 select_shape、select_shape_std 和 select_shape_proto 选择具有特定特征的 Blob。
为了完成图像处理,提取斑点的特征。 所需的功能类型取决于应用程序。
区域或重心等特征通常必须转换为世界坐标。 这可以通过 HALCON 相机校准来实现。
如何将结果转换为世界坐标在解决方案指南 III-C 第 86 页的第 3.3 节中有详细描述。
最后,您可能希望显示图像、blob(区域)和特征。
有关详细信息,请参阅Halcon之可视化。
本节简要介绍如何使用 HALCON 进行 blob 分析
Example: solution_guide/basics/crystal.hdev
* crystal.hdev: extraction of hexagonally shaped crystals via local thresholding and region post-processing
*
dev_close_window ()
dev_update_window ('off')
* ****
* step: acquire image
* ****
read_image (Image, 'crystal')
get_image_size (Image, Width, Height)
dev_open_window_fit_image (Image, 0, 0, Width, Height, WindowID)
set_display_font (WindowID, 12, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (2)
dev_display (Image)
disp_continue_message (WindowID, 'black', 'true')
stop ()
* ****
* step: segment image
* ****
* -> using a local threshold
mean_image (Image, ImageMean, 21, 21)
dyn_threshold (Image, ImageMean, RegionDynThresh, 8, 'dark')
* -> extract connected components
connection (RegionDynThresh, ConnectedRegions)
dev_display (ConnectedRegions)
disp_continue_message (WindowID, 'black', 'true')
stop ()
* ****
* step: process regions
* ****
shape_trans (ConnectedRegions, ConvexRegions, 'convex')
select_shape (ConvexRegions, LargeRegions, 'area', 'and', 600, 2000)
select_gray (LargeRegions, Image, Crystals, 'entropy', 'and', 1, 5.6)
dev_display (Image)
dev_display (Crystals)
图 提取六边形晶体中a 显示了在高层大气中拍摄的图像,其中收集了晶体样本。 任务是分析对象以确定特定形状的频率。 重要的物体之一是六边形晶体。
图 :提取六边形晶体:(a) 原始图像,带有标记要提取的晶体的箭头,(b) 初始分割的结果,© 最终选择的斑点。
首先,使用 read_image 从文件中读取图像。 由于与非均匀背景相结合的晶体对比度相对较低,因此使用局部阈值执行对象分割。 背景由平均滤波器 mean_image 确定。 选择过滤器遮罩尺寸,使其具有暗区宽度的大约三倍。 dyn_threshold 现在将平滑后的灰度值与原始灰度值进行比较,选择那些比 8 个灰度值对比度更暗的像素。 连接将对象分成连接的组件。 图 4.2b 显示了这个初始分割的结果。
read_image (Image, 'crystal')
mean_image (Image, ImageMean, 21, 21)
dyn_threshold (Image, ImageMean, RegionDynThresh, 8, 'dark')
connection (RegionDynThresh, ConnectedRegions)
在接下来的处理步骤中,现在的任务是仅选择六边形晶体。 为此,它们首先被转换成它们的凸包。 这就像在每个区域周围放一根橡皮筋。 从这些区域中,选择那些大 (select_shape) 并具有给定灰度值分布 (select_gray) 的区域。 确定选择参数,以便仅保留相关晶体(见图 4.2c)。
shape_trans (ConnectedRegions, ConvexRegions, 'convex')
select_shape (ConvexRegions, LargeRegions, 'area', 'and', 600, 2000)
select_gray (LargeRegions, Image, Crystals, 'entropy', 'and', 1, 5.6)
Example: solution_guide/basics/atoms.hdev
在这里插入代码片
专用显微镜能够确定单个原子的粗略位置。 这很有用,例如,分析 p-n 结处晶体的网格变化。 分水岭方法是一种在此类图像上效果很好的分割方法。 在这里,每个暗盆都作为一个区域返回。 因为在图像的外部原子只是部分可见,所以第一个任务是只提取那些不接近图像边界的原子。 最后,提取不规则性。 这是通过寻找那些具有异常(挤压)形状的原子来完成的
Example: hdevelop/Applications/Measuring-2D/particle.hdev
* particle.hdev: Measurement of small particles
*
dev_update_off ()
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowID)
set_display_font (WindowID, 14, 'mono', 'true', 'false')
read_image (Image, 'particle')
dev_display (Image)
disp_message (WindowID, 'Original image', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowID, 'black', 'true')
stop ()
threshold (Image, Large, 110, 255)
* Dilate regions with a circular structuring element
dilation_circle (Large, LargeDilation, 7.5)
dev_display (Image)
dev_set_draw ('margin')
dev_set_line_width (3)
dev_set_color ('red')
dev_display (LargeDilation)
dev_set_draw ('fill')
disp_message (WindowID, 'Exclude large areas from processing', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowID, 'black', 'true')
stop ()
* Continue to calculate small regions
* Return the complement of a region
complement (LargeDilation, NotLarge)
reduce_domain (Image, NotLarge, ParticlesRed)
mean_image (ParticlesRed, Mean, 31, 31)
* Segment the image using a local threshold
dyn_threshold (ParticlesRed, Mean, SmallRaw, 3, 'light')
opening_circle (SmallRaw, Small, 2.5)
connection (Small, SmallConnection)
dev_display (Image)
dev_set_colored (12)
dev_display (SmallConnection)
disp_message (WindowID, 'Extracted small particles', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowID, 'black', 'true')
stop ()
* Continue to select several regions and to get information
dev_set_color ('green')
dev_display (Image)
dev_set_draw ('margin')
dev_display (SmallConnection)
Button := 1
while (Button == 1)
disp_message (WindowID, ['Select object with left mouse button','Right button to quit'], 'image', 5, 5, 'black', 'true')
dev_set_color ('green')
get_mbutton (WindowID, Row, Column, Button)
dev_display (Image)
dev_display (SmallConnection)
dev_set_color ('red')
select_region_point (SmallConnection, SmallSingle, Row, Column)
dev_display (SmallSingle)
count_obj (SmallSingle, NumSingle)
if (NumSingle == 1)
intensity (SmallSingle, Image, MeanGray, DeviationGray)
area_center (SmallSingle, Area, Row, Column)
disp_message (WindowID, ['Area = ' + Area,'Intensity = ' + MeanGray$'.3'], 'image', Row + 10, Column - 90, 'black', 'true')
endif
endwhile
dev_set_line_width (1)
dev_update_on ()
此示例的任务是分析液体中的粒子。 此应用程序的主要困难在于存在两种类型的对象:大的明亮对象和低对比度的小对象。 此外,噪声的存在使分割复杂化。
该程序使用两种不同的方法分别分割两类对象:全局阈值和局部阈值。 通过额外的后处理,可以以稳健的方式提取小颗粒。
threshold (Image, Large, 110, 255)
dilation_circle (Large, LargeDilation, 7.5)
complement (LargeDilation, NotLarge)
reduce_domain (Image, NotLarge, ParticlesRed)
mean_image (ParticlesRed, Mean, 31, 31)
dyn_threshold (ParticlesRed, Mean, SmallRaw, 3, 'light')
opening_circle (SmallRaw, Small, 2.5)
connection (Small, SmallConnection)
Example: hdevelop/Applications/Object-Recognition-2D/forest.hdev
dev_close_window ()
dev_update_window ('off')
read_image (Forest, 'forest_air1')
get_image_size (Forest, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
decompose3 (Forest, Red, Green, Blue)
dev_display (Red)
threshold (Blue, BlueBright, 80, 255)
connection (BlueBright, BlueBrightConnection)
select_shape (BlueBrightConnection, Path, 'area', 'and', 100, 100000000)
dev_set_color ('red')
dev_set_draw ('margin')
dev_display (Path)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
threshold (Red, RedBright, 120, 255)
connection (RedBright, RedBrightConnection)
select_shape (RedBrightConnection, RedBrightBig, 'area', 'and', 1500, 10000000)
closing_circle (RedBrightBig, RedBrightClosing, 7.5)
opening_circle (RedBrightClosing, RedBrightOpening, 9.5)
connection (RedBrightOpening, RedBrightOpeningConnection)
select_shape (RedBrightOpeningConnection, BeechBig, 'area', 'and', 1000, 100000000)
select_gray (BeechBig, Blue, Beech, 'mean', 'and', 0, 59)
dev_display (Red)
dev_display (Beech)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
union1 (Beech, BeechUnion)
complement (BeechUnion, NotBeech)
difference (NotBeech, Path, NotBeechNotPath)
reduce_domain (Red, NotBeechNotPath, NotBeechNotPathRed)
threshold (NotBeechNotPathRed, BrightRest, 150, 255)
connection (BrightRest, BrightRestConnection)
select_shape (BrightRestConnection, Meadow, 'area', 'and', 500, 1000000)
dev_display (Red)
dev_display (Meadow)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
union2 (Path, RedBrightClosing, BeechPath)
smooth_image (Red, RedGauss, 'gauss', 4.0)
invert_image (RedGauss, Invert)
watersheds (Invert, SpruceRed, Watersheds)
select_shape (SpruceRed, SpruceRedLarge, 'area', 'and', 100, 5000)
select_gray (SpruceRedLarge, Red, SpruceRedInitial, 'max', 'and', 100, 200)
gen_empty_obj (LocalThresh)
count_obj (SpruceRedInitial, NumSpruce)
dev_update_var ('off')
dev_update_pc ('off')
for i := 1 to NumSpruce by 1
select_obj (SpruceRedInitial, SingleSpruce, i)
min_max_gray (SingleSpruce, Red, 50, Min, Max, Range)
reduce_domain (Red, SingleSpruce, SingleSpruceRed)
threshold (SingleSpruceRed, SingleSpruceBright, Min, 255)
connection (SingleSpruceBright, SingleSpruceBrightCon)
select_shape_std (SingleSpruceBrightCon, MaxAreaSpruce, 'max_area', 70)
concat_obj (MaxAreaSpruce, LocalThresh, LocalThresh)
endfor
opening_circle (LocalThresh, FinalSpruce, 1.5)
dev_set_line_width (2)
dev_set_color ('red')
dev_display (Red)
dev_display (FinalSpruce)
dev_set_color ('green')
dev_display (Beech)
dev_set_color ('yellow')
dev_display (Meadow)
图 :(a) 原始图像; (b) 采伐树木和草地; © 提取的道路
此示例的任务是检测图 4.5 中描绘的彩色红外图像中的不同对象类别:树木(针叶树和落叶树)、草地和道路。
图像数据是彩色红外图像,由于道路的特定颜色,因此可以很容易地提取道路。 为此,多通道图像被分成三个通道,每个通道都被单独研究。 有关分解多通道图像的更多信息,请参见颜色处理。
read_image (Forest, 'forest_air1')
decompose3 (Forest, Red, Green, Blue)
threshold (Blue, BlueBright, 80, 255)
connection (BlueBright, BlueBrightConnection)
select_shape (BlueBrightConnection, Path, 'area', 'and', 100, 100000000)
threshold (Red, RedBright, 120, 255)
connection (RedBright, RedBrightConnection)
select_shape (RedBrightConnection, RedBrightBig, 'area', 'and', 1500, \
10000000)
closing_circle (RedBrightBig, RedBrightClosing, 7.5)
opening_circle (RedBrightClosing, RedBrightOpening, 9.5)
connection (RedBrightOpening, RedBrightOpeningConnection)
select_shape (RedBrightOpeningConnection, BeechBig, 'area', 'and', 1000, \
100000000)
select_gray (BeechBig, Blue, Beech, 'mean', 'and', 0, 59)
union1 (Beech, BeechUnion)
complement (BeechUnion, NotBeech)
difference (NotBeech, Path, NotBeechNotPath)
reduce_domain (Red, NotBeechNotPath, NotBeechNotPathRed)
threshold (NotBeechNotPathRed, BrightRest, 150, 255)
connection (BrightRest, BrightRestConnection)
select_shape (BrightRestConnection, Meadow, 'area', 'and', 500, 1000000)
使用分水岭方法提取针叶树,并在盆地内增加阈值以去除阴影区域。
union2 (Path, RedBrightClosing, BeechPath)
smooth_image (Red, RedGauss, 'gauss', 4.0)
invert_image (RedGauss, Invert)
watersheds (Invert, SpruceRed, Watersheds)
select_shape (SpruceRed, SpruceRedLarge, 'area', 'and', 100, 5000)
select_gray (SpruceRedLarge, Red, SpruceRedInitial, 'max', 'and', 100, 200)
gen_empty_obj (LocalThresh)
count_obj (SpruceRedInitial, NumSpruce)
for i := 1 to NumSpruce by 1
select_obj (SpruceRedInitial, SingleSpruce, i)
min_max_gray (SingleSpruce, Red, 50, Min, Max, Range)
reduce_domain (Red, SingleSpruce, SingleSpruceRed)
threshold (SingleSpruceRed, SingleSpruceBright, Min, 255)
connection (SingleSpruceBright, SingleSpruceBrightCon)
select_shape_std (SingleSpruceBrightCon, MaxAreaSpruce, 'max_area', 70)
concat_obj (MaxAreaSpruce, LocalThresh, LocalThresh)
endfor
opening_circle (LocalThresh, FinalSpruce, 1.5)
Example: hdevelop/Applications/Measuring-2D/fin.hdev
* fin.hdev: Detection of a fin
*
dev_update_window ('off')
read_image (Fins, 'fin' + [1:3])
get_image_size (Fins, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width[0], Height[0], 'black', WindowID)
set_display_font (WindowID, 14, 'mono', 'true', 'false')
for I := 1 to 3 by 1
select_obj (Fins, Fin, I)
dev_display (Fin)
binary_threshold (Fin, Background, 'max_separability', 'light', UsedThreshold)
dev_set_color ('blue')
dev_set_draw ('margin')
dev_set_line_width (4)
dev_display (Background)
disp_continue_message (WindowID, 'black', 'true')
stop ()
closing_circle (Background, ClosedBackground, 250)
dev_set_color ('green')
dev_display (ClosedBackground)
disp_continue_message (WindowID, 'black', 'true')
stop ()
difference (ClosedBackground, Background, RegionDifference)
opening_rectangle1 (RegionDifference, FinRegion, 5, 5)
dev_display (Fin)
dev_set_color ('red')
dev_display (FinRegion)
area_center (FinRegion, FinArea, Row, Column)
if (I < 3)
disp_continue_message (WindowID, 'black', 'true')
stop ()
endif
endfor
此示例的任务是检查塑料零件的外边界。 在这种情况下,一些物体显示出无缺陷零件不允许的翅片(见图 4.6)。
该程序首先提取背景区域(其中鳍显示为缩进)。
binary_threshold (Fin, Background, 'max_separability', 'light', UsedThreshold)
封闭区域和原始区域之间的显着差异是生产误差
Figure 4.6: Boundary with extracted fin.
difference (ClosedBackground, Background, RegionDifference)
opening_rectangle1 (RegionDifference, FinRegion, 5, 5)
Example: hdevelop/Applications/Completeness-Check/ball.hdev
* ball.hdev: Inspection of Ball Bonding
*
dev_update_window ('off')
dev_close_window ()
dev_open_window (0, 0, 728, 512, 'black', WindowID)
read_image (Bond, 'die/die_03')
dev_display (Bond)
set_display_font (WindowID, 14, 'mono', 'true', 'false')
disp_continue_message (WindowID, 'black', 'true')
stop ()
threshold (Bond, Bright, 100, 255)
shape_trans (Bright, Die, 'rectangle2')
dev_set_color ('green')
dev_set_line_width (3)
dev_set_draw ('margin')
dev_display (Die)
disp_continue_message (WindowID, 'black', 'true')
stop ()
reduce_domain (Bond, Die, DieGrey)
threshold (DieGrey, Wires, 0, 50)
fill_up_shape (Wires, WiresFilled, 'area', 1, 100)
dev_display (Bond)
dev_set_draw ('fill')
dev_set_color ('red')
dev_display (WiresFilled)
disp_continue_message (WindowID, 'black', 'true')
stop ()
opening_circle (WiresFilled, Balls, 15.5)
dev_set_color ('green')
dev_display (Balls)
disp_continue_message (WindowID, 'black', 'true')
stop ()
connection (Balls, SingleBalls)
select_shape (SingleBalls, IntermediateBalls, 'circularity', 'and', 0.85, 1.0)
sort_region (IntermediateBalls, FinalBalls, 'first_point', 'true', 'column')
dev_display (Bond)
dev_set_colored (12)
dev_display (FinalBalls)
disp_continue_message (WindowID, 'black', 'true')
stop ()
smallest_circle (FinalBalls, Row, Column, Radius)
NumBalls := |Radius|
Diameter := 2 * Radius
meanDiameter := sum(Diameter) / NumBalls
mimDiameter := min(Diameter)
dev_display (Bond)
disp_circle (WindowID, Row, Column, Radius)
dev_set_color ('white')
for i := 1 to NumBalls by 1
if (fmod(i,2) == 1)
disp_message (WindowID, 'D: ' + Diameter[i - 1], 'image', Row[i - 1] - 2.7 * Radius[i - 1], max([Column[i - 1] - 60,0]), 'white', 'false')
else
disp_message (WindowID, 'D: ' + Diameter[i - 1], 'image', Row[i - 1] + 1.2 * Radius[i - 1], max([Column[i - 1] - 60,0]), 'white', 'false')
endif
endfor
* dump_window (WindowID, 'tiff_rgb', './ball')
dev_set_color ('green')
dev_update_window ('on')
disp_continue_message (WindowID, 'black', 'true')
stop ()
dev_close_window ()
此示例的任务是检查图 4.7 中描述的球键合直径。
图 4.7:测量球键的直径
球键的提取分为两步:首先,通过分割明亮区域并将它们转换为最小的周围矩形来定位管芯。
threshold (Bond, Bright, 100, 255)
shape_trans (Bright, Die, 'rectangle2')
现在,使用reduce_domain 处理集中在模具内部的区域。 在此 ROI 中,程序会检查与线材相对应的暗区。
reduce_domain (Bond, Die, DieGrey)
threshold (DieGrey, Wires, 0, 50)
fill_up_shape (Wires, WiresFilled, 'area', 1, 100)
在去除不相关的结构并按预定义的顺序排列键后,提取所需的特征。
opening_circle (WiresFilled, Balls, 15.5)
connection (Balls, SingleBalls)
select_shape (SingleBalls, IntermediateBalls, 'circularity', 'and', 0.85, 1.0)
sort_region (IntermediateBalls, FinalBalls, 'first_point', 'true', 'column') smallest_circle (FinalBalls, Row, Column, Radius)
Example: solution_guide/basics/surface_scratch.hdev
此示例检测金属表面上的划痕(见图 4.8)。
图 4.8:检测金属表面的划痕:(a) 原始图像,(b) 提取的划痕仍然部分分割,© 合并划痕的最终结果。
分割的主要困难是不均匀的背景和划痕是薄结构的事实。 这两个问题都可以使用局部阈值来解决,即算子 mean_image 和 dyn_threshold。 连接后,主要是噪声的小物体被去除(见图4.8b)。
mean_image (Image, ImageMean, 7, 7)
dyn_threshold (Image, ImageMean, DarkPixels, 5, 'dark')
connection (DarkPixels, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10, 1000)
划痕是选择的一部分,但如果我们仔细观察,我们会发现它们被部分分割。 为了解决这个问题,我们再次将所有分数组合成一个大区域。 通过应用 dilation_circle,现在可以组合具有给定最大距离的相邻部分。 为了最终获得划痕的正确形状 - 现在由于扩张而变得太宽 - 骨架用于将形状细化到一个像素的宽度。
union1 (SelectedRegions, RegionUnion)
dilation_circle (RegionUnion, RegionDilation, 3.5)
skeleton (RegionDilation, Skeleton) connection (Skeleton, Errors)
最后一步是区分表面的小点和划痕。 这是通过 select_shape 实现的,使用大小作为特征。 图 4.8c 描述了结果。
select_shape (Errors, Scratches, 'area', 'and', 50, 10000)
select_shape (Errors, Dots, 'area', 'and', 1, 50)
请参阅图像采集方法
Please refer to the operator list for the method Region Of Interest (see section 3.4 on page 40).
Operators for rectifying images are described in the Solution Guide II-B.
Operators for rectifying images are described in the Solution Guide III-C.
Standard:
mean_image, gauss_filter, binomial_filter, median_image
Advanced:
smooth_image, anisotrope_diff, fill_interlace, rank_image
Standard: gray_histo_abs, histo_to_thresh
Advanced: intensity
Standard:
threshold, fast_threshold, binary_threshold, dyn_threshold, histo_to_thresh, gray_histo
Advanced:
local_threshold, var_threshold, watersheds, watersheds_threshold, regiongrowing, regiongrowing_mean
Standard:
connection, select_shape, opening_circle, closing_circle, opening_rectangle1, closing_rectangle1, difference, intersection, union1, shape_trans, fill_up
Advanced:
select_shape_proto, select_gray, clip_region, sort_region, skeleton, partition_dynamic, rank_region
形态学运算符可以在参考手册的“形态学”一章中找到。
Standard:
area_center, smallest_rectangle1, smallest_rectangle2, compactness, eccentricity, elliptic_axis, area_center_gray, intensity, min_max_gray
Advanced:
diameter_region, inner_rectangle1, inner_circle, gray_histo_abs, entropy_gray
Standard: image_points_to_world_plane
Advanced: gen_contour_region_xld, contour_to_world_plane_xld
解决方案指南 III-C 中描述了更多用于将结果转换为世界坐标的运算符。4.4.11 可视化结果
请参阅方法可视化的操作员列表(参见第 315 页的 19.4 节).
颜色处理(参见颜色处理说明)
颜色处理可以被认为是一种高级的Blob分析方法,它使用三个颜色通道而不是一个灰度值通道。 HALCON 提供了色彩空间变换、特征提取和像素分类的操作符,可与 blob 分析结合使用。
纹理分析(参见纹理分析说明)
纹理分析是一种发现规则或不规则结构的方法,例如,在物体表面上,因此如果纹理是待检查物体的特征并且简单的Blob分析是不够的,则它很有用。 对于纹理分析,不仅使用单个灰度值,而且使用更大的像素邻域。 HALCON 提供强调或抑制特定纹理的过滤器。 然后可以分割这些过滤器的结果。
OCR(参见OCR的说明)
Blob 分析通常用作 OCR 对字符进行分割的预处理步骤。
边缘提取(亚像素精度)(参见边缘提取 的说明)
在Blob分析中,区域由其像素的灰度值描述。 作为替代方案,可以通过边界处灰度值的变化来描述区域。 这种方法称为边缘检测。
分类(参见分类的说明)
要选择特定的灰度值,必须确定阈值。 在大多数情况下,使用固定值或当前值由特征运算符确定。 在某些情况下,如果系统自动确定范围是有用的。 这可以通过使用分类器来实现。 此外,还可以使用分类器根据提取的两个类的特征和样本自动区分好对象和坏对象。
默认情况下,即使您在屏幕上看到多个未连接的区域,大多数 HALCON 分段运算符(如阈值)也会返回一个区域。 要将这个区域转换为分离的对象(即 HALCON 命名法中的连接组件),必须调用连接。
许多在线应用程序需要最大速度。 由于其灵活性,HALCON 提供了许多方法来实现这一目标。 这里列出了最常用的方法。
感兴趣区域是通过仅处理需要检查对象的区域来提高速度的标准方法。 这可以使用预定义的区域来完成,也可以通过在线生成依赖于图像中发现的其他对象的感兴趣区域来完成。
如果对象具有特定的最小尺寸,则算子 fast_threshold 是阈值的快速替代方法。 这种快速算子也可以在调用阈值算子之前使用gen_grid_region和reduce_domain等算子直接生成。
默认情况下,HALCON 执行一些数据一致性检查。 这些可以使用 set_check 关闭。
默认情况下,HALCON 初始化新图像。 使用带有参数“init_new_image”的 set_system,可以更改此行为。
通常,线扫描相机被视为普通区域传感器。 但是,在某些情况下,必须处理的不是单个图像,而是显示物体(例如传送带上的物体)的“无限”图像序列。 在这种情况下,一张图像的结尾是下一张图像的开头。 这意味着部分位于两个图像中的对象必须合并为一个对象。 为此,HALCON 提供了操作符 merge_regions_line_scan。 该算子在分割一幅图像后调用,并将当前对象与先前图像的对象组合起来。 有关更多信息,请参阅解决方案指南 II-A。
有时需要高精度。 这对于 blob 分析来说很困难,因为对象只能用整数像素坐标提取。 但是请注意,可以为区域计算的许多特征,例如重心,将是亚像素精度的。 获得更高准确度的一种方法是使用更高的分辨率。 这会导致每个区域的像素数越多,估计重心 (area_center) 等特征的统计数据就越多。 作为替代方案,如果对象满足特定的灰度值要求,则可以使用灰度值特征(如 area_center_gray)。 在这里,更高的准确度来自于每个像素使用 255 个值而不是一个值(前景或背景)的事实。 如果需要非常高的精度,则应使用第 87 页上的亚像素精度边缘和线条提取。