Operator Blob_Analysis_1D

Operator Library: Blob

Blob_Analysis_1D 算子用于检测无限高度的二值图像中的对象并确定其属性。该算子的输出是多个代表每个对象属性的数据流。

[注意] Blob_Analysis_1D 是一个旧版算子

Blob_Analysis_1D 算子是一个旧版算子,仅出于向后兼容的原因保留。在新设计中,请改用 BlobDetector1D。

[注意] 您可能需要的是 2D 算子

Blob_Analysis_1D 算子适用于对象位于任意位置的采集。如果在您的线扫描应用中,可以通过图像触发确定对象位置,请改用 Blob_Analysis_2D 算子。

本算子参考手册包含以下信息:

  • 算子功能说明
  • 1D 应用的时序模型
  • 在 VisualApplets 高级仿真中使用算子
  • 算子输入和输出端口
  • I/O Property
  • 支持的链接格式
  • 参数
  • 使用示例

Explanation of the Operator's Functionality

有关斑点分析算子的总体介绍,必须阅读 Library Blob 中的介绍。

Blob Analysis 1D 算子专为无休止的一维图像而设计。通常,对于 2D Blob Analysis,对象特征与对象在帧中的位置相关,坐标原点是图像的左上角。对于无限高度的 1D 图像,这是不可能的。对象不能与 y 坐标相关联,因为该值会无限增长或导致溢出。

VisualApplets Blob Analysis 1D 算子允许使用对象可能处于任何位置的无休止图像。该算子扩展了一个参考输入“LineMarkerI”,对象与之相关联。例如,这可以是外部编码器和触发脉冲控制的 Counter 值。使用此方法,可以将通过斑点分析确定的每个对象分配到正确的参考位置。

输入链接“FlushI”用于刷新输出,即完成输出帧。例如,完成 DMA 传输需要执行此操作。

下图说明了 Blob Analysis 1D 算子的行为。它显示了算子输入端的示例数据以及生成的输出。左侧显示了由斑点分析处理的二值无休止图像。第二列表示 LineMarkerI 输入。在此,Counter 用于用参考值标记对象。为了更好地进行可视化,仅打印感兴趣的值。假设线标记输入的 Bit Width 为九位。因此,会在值 512 处发生溢出。第三列显示了刷新输入。在本示例中,只有一个刷新条件。右列表示斑点分析算子的输出。通过观察示例可以看出,图像连同线标记会在斑点分析期间进行处理。一旦某个对象完成,就会将其输出。所有对象的最终对象属性都标记有与相应对象的第一行图像一起设置的线标记。边界框坐标 X0 和 X1 类似于 Blob Analysis 2D 对象特征,而 Y1 坐标是对象的高度。Y0 坐标由 Blob Analysis 1D 算子的内部计数器产生。它从零开始,其最大值等于在算子 Property 对话框中设置的对象的最大高度。刷新条件会导致输出端出现帧结束标志。

Blob Analysis 1D 算子的行为

图 404. Blob Analysis 1D 算子的行为


与 2D 算子类似,Blob Analysis 1D 算子属于“M”类型,所有输出都是同步的。与 2D 相比,1D 算子具有三个输入。前两个输入“ImageI”和“LineMarkerI”是同步的,必须由同一个 M 型算子提供源。输入链接“FlushI”与图像异步,因此不需要任何同步。下图阐述了一种可能的配置(在众多配置中)。

VisualApplets 网络中 Blob 1D 算子的同步

图 405. VisualApplets 网络中 Blob 1D 算子的同步


Generation of Output Frames - Flush, Empty Frames, Discarding Data

如上所述,刷新用于完成输出帧,即生成帧结束标志。根据刷新输入的时序和图像中的对象,可能会生成空帧以及包含大量数据的输出帧。为了控制此行为,可以使用参数 output_frame_size_overflow_handling 和 suppress_empty_output_frames(参见下文参数说明)。以下波形图显示了参数设置、数据和刷新输入的各种组合的草图。“Blob Data”表示输出时序。

第一个示例显示了在达到最大帧大小后新帧的生成。斑点算子在输出完成输出帧的最后一个斑点之后生成帧结束。刷新信号将生成额外的帧结束:

Blob 1D 时序 - 生成新帧

图 406. Blob 1D 时序 - 生成新帧


下一个示例显示了对空输出帧的抑制。如您所见,第一次刷新被忽略。第二次刷新被延迟,直到有可用于输出的斑点。通过这种方式,算子可以延迟刷新输出:

Blob 1D Timing - Suppression of Empty Frames

Figure 407. Blob 1D Timing - Suppression of Empty Frames


在第三个示例中,我们可以看到 flush 输入端常数 1 的行为。由于 suppress_empty_output_frame 设置为 "yes",该算子将在每个 blob 输出之后生成一个帧结束信号。警告:如果 suppress_empty_output_frame 意外设置为 "no",常数 1 可能会导致数百万个帧结束信号。如果此输出连接到 VisualApplets 输出(DMA 算子),可能会导致 PC 过载!

Blob 1D Timing - Constant Flush

Figure 408. Blob 1D Timing - Constant Flush


最后一个示例展示了对象的丢弃情况,因为参数 "output_frame_size_overflow_handling" 被设置为 "discard_exceeding_objects"。

Blob 1D Timing - Discarding of Objects

Figure 409. Blob 1D Timing - Discarding of Objects


请注意,输出时序取决于输出流水线。如果数据无法被处理,即 blob 算子后面的后续算子阻塞了处理,则可能会丢失 flush 信号。

性能

VisualApplets blob 分析算子是极少数处理速度(即带宽)取决于图像内容的算子之一。图像中的许多对象会导致庞大的对象列表,这可能会导致算子输入速度变慢。这仅适用于包含极强噪声的图像。在受控条件下,该算子的速度应该足够快。

延迟

该算子的设计旨在将延迟降至最低。输入图像逐行传输到 Blob Analysis。如果某个对象完全传输到算子中,一旦算子检测到其完成,就会立即输出该对象的特征。因此,Blob Analysis 会在对象完全传输到算子后立即将其输出。在仍在处理图像本身的同时,就可以开始对对象特征进行后处理。

请注意,DMA 和某些其他算子会等待帧结束信号,然后才会报告完成。请查阅 flush 输入的说明,了解 Blob_Analysis_1D 算子中的帧结束生成机制。

Simulation of the Operator

[警告] 谨慎使用 Blob_Analysis_1D 仿真

Blob 1D 仿真具有某些局限性。请务必谨慎使用仿真功能。

即使图像协议是 1D,VisualApplets 也使用普通的 2D 图像。因此,在仿真算子时,我们使用普通图像。每幅图像都是单独处理的。

算子的仿真与硬件行为不完全相同。存在两处差异:

  • 对象特征输出的顺序在硬件和软件中可能有所不同。这是因为硬件输出取决于无法在 VisualApplets 中进行仿真的数据的时序。

  • 第二个(也是最重要的)差异是 Flush 条件的行为。FlushI 输入与图像数据输入完全异步。FlushI 用于完成输出帧,即它会在输出流中插入帧结束标记。(参见上文以及下方的参数说明。)由于 flush 相对于图像数据是异步的,因此无法仿真出与硬件完全相同的行为。因此,VisualApplets 仿真使用了一种替代仿真模型。由于无法复制硬件的行为,因此故意将仿真模型实现得与硬件不同。它具有以下 Property:

    • 仿真尝试通过对两个输入的像素进行计数,来比较数据输入和 flush 输入之间的相关性。因此,如果数据输入和 flush 输入具有相同的图像尺寸,则相关性与像素位置保持 1:1。但是,如果 flush 输入的像素较少(例如每行 1 个像素),则只有仿真会比较像素位置。

    • 与硬件中根据对象的完成情况进行输出不同,flush 条件将根据对象的 Y0 坐标输出一个对象。

    • 在输出图像的最后一个对象之后,所有后续的 flush 信号都将被忽略。因此在仿真中,输入端的 flush 信号数量与帧输出数量并不相关。

    由于此行为,应谨慎使用仿真。

    以下图形显示了微型图像上的一些示例,解释了在仿真中使用 flush 信号的一些特殊条件。

    Simulation Scenario 1 - Flush and Y0 Relation

    Figure 410. Simulation Scenario 1 - Flush and Y0 Relation


    仿真场景 2 - 冲洗像素位置

    图 411. 仿真场景 2 - 冲洗像素位置


    仿真场景 3 - 帧末尾处丢弃的冲洗像素

    图 412. 仿真场景 3 - 帧末尾处丢弃的冲洗像素


    仿真场景 4 - 多个斑点

    图 413. 仿真场景 4 - 多个斑点


输入端口

Blob Analysis 的 ImageI 输入由一个二值一维图像表示,即具有 1 bit 的 Bit Width、指定的宽度和无限高度的图像。最多可选择 32 像素的 Parallelism。前景值假定为 ONE,而背景值必须为 ZERO。在二值化过程中必须考虑这一点。

由于 LineMarkerI 输入与图像数据输入同步,因此这些连接必须具有相同的图像尺寸和 Parallelism。但是,该连接可以具有任意 Bit Width。每条图像线的 LineMarker 值必须保持恒定。

输入连接“FlushI”与其它输入连接异步。它可以具有任意 Bit Width、Parallelism 和图像尺寸。如果任何并行组件的输入位之一被置位,则 Blob Analysis 输出将被冲洗。

Output Ports

每个输出端口代表一个对象特征 / 对象 Property。这些端口上的每个输出值代表一个对象。因此,对象 Property 会产生数据流。输出数据流的长度等于图像中找到的对象数量,并且可以中断为几个子帧。每个输出端口的高度为 1 像素,并具有特定的长度。它们表示为灰度 2D 图像。

输出端口通过使用算子参数和输入的 Property 进行配置。直接更改连接 Property 是不可能的。

ErrorFlagsO 端口输出多个溢出错误标志。每个 bit 都保留用于一个特殊的标志。详细说明可以在下方的参数描述中找到。下表进行了总结:

Bit # 描述 对象相关 提示
0, 1 标签溢出 没有

Blob Analysis 检测到的对象太多,无法全部存储在 Memory 中。要增加两行图像内的最大对象数,可以更改算子参数“LabelBits”。

该标志在检测到时一直置位,直到数据输出帧结束。到目前为止输出的所有对象属性都是有效的。

对于 Blob Analysis 1D 算子,该标志仅在下一个有效数据输出时处于高电平状态一个时钟周期。

置位该标志后,blob 分析的输出可能会导致错误的对象属性。如果可用足够的对象标签,算子将恢复正常功能。

2 输出被截断 是

图像中的对象数量超过了在算子参数对话框中设置的最大输出宽度。该标志与适合输出宽度的最后一个对象一起置位。

3 对象大小超过最大值 是

如果 1D Blob Analysis 的对象超过其最大高度,则会置位该标志。算子会将该超限对象切割为较小的对象。连续的对象会带有该标志,以便检测切割情况。

对于 2D Blob Analysis,该标志位被设置为常数零。

4 面积被截断 是

对象的面积与错误标志超出了面积位所允许的范围。

5 重心 X 被截断 是

X 方向的重心超出了位数所允许的范围。

6 重心 Y 被截断 是

Y 方向的重心超出了位数所允许的范围。

7 轮廓长度溢出 是

轮廓长度超出了为该算子配置的位数所允许的范围。

表 38. Blob 错误标志说明


I/O Property

Property 值
Operator Type M
输入链路 ImageI,图像数据输入
LineMarkerI,数据输入
FlushI,数据输入
Output Links LineMarkerO,数据输出
BoundingX0O,数据输出
BoundingX1O,数据输出
BoundingY0O,数据输出
BoundingY1O,数据输出
AreaO,数据输出
CenterXO,数据输出
CenterYO,数据输出
ContourOrthoO,数据输出
ContourDiaO,数据输出
ErrorFlagsO,数据输出

同步和异步输入

  • 同步组:ImageI、LineMarkerI
  • FlushI 与该组异步。

Supported Link Format

Link Parameter 输入链接 ImageI 输入连接 LineMarkerI 输入链接 FlushI 输出连接 LineMarkerO 输出 Link BoundingX0O 输出 Link BoundingX1O 输出 Link BoundingY0O 输出 Link BoundingY1O 输出 Link AreaO 输出 Link CenterXO 输出 Link CenterYO 输出 Link ContourOrthoO 输出 Link ContourDiaO 输出 Link ErrorFlagsO
Bit Width 1 any any auto1 auto2 auto3 auto4 auto5 auto6 auto7 auto8 auto9 auto10 8
Arithmetic unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned
Parallelism {1, 2, 4, 8, 16, 32} 同 ImageI any 1 1 1 1 1 1 1 1 1 1 1
Kernel Columns 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Kernel Rows 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Img Protocol VALT_IMAGE1D VALT_IMAGE1D VALT_IMAGE1D VALT_IMAGE1D VALT_IMAGE1D VALT_IMAGE1D VALT_IMAGE1D VALT_IMAGE1D VALT_IMAGE1D VALT_IMAGE1D VALT_IMAGE1D VALT_IMAGE1D VALT_IMAGE1D VALT_IMAGE1D
Color Format VAF_GRAY VAF_GRAY VAF_GRAY VAF_GRAY VAF_GRAY VAF_GRAY VAF_GRAY VAF_GRAY VAF_GRAY VAF_GRAY VAF_GRAY VAF_GRAY VAF_GRAY VAF_GRAY
Color Flavor FL_NONE FL_NONE FL_NONE FL_NONE FL_NONE FL_NONE FL_NONE FL_NONE FL_NONE FL_NONE FL_NONE FL_NONE FL_NONE FL_NONE
Max. Img Width any 同 ImageI any auto11 auto12 auto13 auto14 auto15 auto16 auto17 auto18 auto19 auto20 auto21
Max. Img Height any 同 ImageI any 1 1 1 1 1 1 1 1 1 1 1

1 2 3 4 5 6 7 8 9 10

输出 Bit Width 取决于对象特征的参数设置。如果某个特征被禁用,则输出被设置为始终为零值的单个位。

11 12 13 14 15 16 17 18 19 20 21

最大输出图像宽度取决于参数 output_frame_size 的设置。

参数

label_bits
键入 static 参数
默认 7
范围 [5, 31]

此参数用于设置内部标记对象时所使用的位数。它还会影响由 2^label_bits 决定的两行图像中可能共存的最大对象数。请注意,Blob 分析所需的 Memory 资源几乎每增加一位就会翻倍。该参数的一个良好取值范围在 7 到 9 位之间,这对于几乎所有应用来说都应该足够了。

如果检测到此地址空间的溢出,运算符将在端口 "ErrorFlagsO" 的位 0 和位 1 上输出错误标志。这些标志在检测到溢出时置位,并在输出帧结束时清零。

neighborhood
键入 static 参数
默认 eight_connected
范围 {four_connected, eight_connected}

选择 Object Detection 所需的邻域。有关像素邻域的详细说明,请参阅 'Definition'。

max_object_height_bits
键入 static 参数
默认 10
范围 [3, 31]

需要此参数来指定对象的最大高度。例如,10 bit 的高度将不允许对象超过 1024 个图像线的高度。

如果对象超过此限制,它将被分割为两个或多个分离的对象。如果发生这种情况,ErrorFlagsO 端口的第 3 位处的错误标志将与恢复的对象一起置位。

max_output_frame_size
键入 static 参数
默认 65536
范围 [1, 67108864]

选择最大输出帧大小,即一个输出帧中的最大对象数。

output_frame_size_overflow_handling
键入 static 参数
默认 generate_new_frame
范围 {generate_new_frame, discard_exceeding_objects}

最大输出帧大小由参数 "max_output_frame_size" 指定。如果对象数量超过此大小,算子可以生成新帧或丢弃超出的对象。生成新帧会导致帧结束,即该帧已完成。如果丢弃对象,算子将在 ErrorFlagsO 端口的位编号 2 处输出一个错误标志,并伴随该帧的最后一个有效对象。

请注意,通过 flush 输入也会生成新帧。

suppress_empty_output_frames
键入 static 参数
默认 是
范围 {yes, no}

该参数用于抑制由 flush 条件且无对象数据引起的空输出帧。

详细的时序图可以在 'Generation of Output Frames - Flush, Empty Frames, Discarding Data' 中找到。

line_marker
键入 static 参数
默认 used
范围 {used, not_used}

每个对象的 "line_marker" 在 "LineMarkerO" 处输出。Bit Width 由输入 LineMarkerI 输入链路决定。如果未使用线标记,则 Bit Width 设置为 1,其输出为恒定的零。

bounding_box_x0
键入 static 参数
默认 used
范围 {used, not_used}

边界框表示包围对象的最小轴平行矩形。每个坐标值均相对于图像的左上角。Bounding box X0 表示每个对象的最低 x 坐标。它在 "BoundingX0O" 处输出。Bit Width 由输入图像决定。如果未使用边界框,则 Bit Width 设置为一位,其输出为常数零。

bounding_box_x1
键入 static 参数
默认 used
范围 {used, not_used}

边界框表示包围对象的最小轴平行矩形。每个坐标值均相对于图像的左上角。Bounding box X1 表示每个对象的最高 x 坐标。它在 "BoundingX1O" 处输出。Bit Width 由输入图像决定。如果未使用边界框,则 Bit Width 设置为一位,其输出为常数零。

bounding_box_y0
键入 static 参数
默认 used
范围 {used, not_used}

边界框 y0 表示每个对象的最低 y 坐标。此坐标基于算子的内部 Counter。它从处理的第一行图像开始计数。其最大值等于通过参数 max_object_height_bits 设置的最大高度。发生溢出后,Counter 将重新从零开始。

此功能可以替代线标记使用。然而,线标记提供了更多的可能性并允许进行复杂的配置。

该功能在 "BoundingY0O" 处输出。Bit Width 由输入图像决定。如果未使用边界框,则 Bit Width 设置为 1,其输出为恒定的零。

bounding_box_y1
键入 static 参数
默认 used
范围 {used, not_used}

对于 1D 算子(与 2D 算子相反),边界框 y1 表示对象的高度。它在 "BoundingY1O" 处输出。Bit Width 由输入图像决定。如果未使用边界框,则 Bit Width 设置为 1,其输出为恒定的零。

area_mode
键入 static 参数
默认 use_area_with_maximum_required_bits
范围 {area_not_used, use_area_with_maximum_required_bits, use_area_with_specified_bits}

对象的面积定义为所有对象前景像素的总和。此参数用于选择所需的面积模式。如果选择了 "use_area_with_maximum_required_bits",运算符将自动确定对象最大可能尺寸所需的 Bit Width。对象最大可能尺寸取决于输入链路 I 上的最大宽度和高度。如果图像的所有像素都由前景值组成(即由一个大对象组成的白色输入图像),则可达到对象的理论最大值。

如果用户可以确保对象不会超过指定的面积大小,则可以对此进行参数化设置。如果已知最大对象大小,请选择“use_area_with_specified_bits”。使用参数“area_bits”指定位数。如果完全不需要面积,请选择“area_not_used”。在“area_not_used”模式下,Bit Width 设置为 1,且输出端始终为常量零。

area_bits
键入 static 参数
默认 not_used
范围 {not_used, used}

仅当参数“area_mode”设置为“use_area_with_specified_bits”时,此参数才处于启用状态。如果对象的面积大于所选位数允许的范围,斑点分析将在输出链路“ErrorFlagsO”的第 4 位输出溢出标志。

center_of_gravity_x_mode
键入 static 参数
默认 use_cX_with_maximum_required_bits
范围 {cX_not_used, use_cX_with_maximum_required_bits, use_cX_with_specified_bits}

有关重心的说明,请参阅 'Center of Gravity'。

请注意,为了获得正确的结果,在斑点分析之后,必须将输出除以面积。

如果该参数设置为“use_cX_width_maximum_required_bits”,算子将自动确定输出 Bit Width。如果使用较大的输入图像,所需的 Bit Width 可能会非常高。

如果参数值使用“use_cX_with_specified_bits”,则 Bit Width 是可调节的。

如果不需要 x 方向的重心,可以通过选择“cX_not_used”将其关闭。

center_of_gravity_x_bits
键入 static 参数
默认 29
范围 [2, auto]

如果“center_of_gravity_x_mode”设置为“use_cX_with_specified_bits”,则可以在此处更改 Bit Width。否则,该参数将被禁用。

center_of_gravity_x_overflow_flag
键入 static 参数
默认 not_used
范围 {not_used, used}

如果手动设置 x 方向重心的 Bit Width,则此参数将被激活并可设置为“used”。如果检测到溢出,算子随后将在输出链路“ErrorFlagsO”的第 5 位输出 1。

center_of_gravity_y_mode
键入 static 参数
默认 use_cY_with_maximum_required_bits
范围 {cY_not_used, use_cY_with_maximum_required_bits, use_cY_with_specified_bits}

有关重心的说明,请参阅 'Center of Gravity'。

请注意,为了获得正确的结果,在斑点分析之后,必须将输出除以面积。

如果该参数设置为“use_cY_width_maximum_required_bits”,算子将自动确定输出 Bit Width。如果使用较大的输入图像,所需的 Bit Width 可能会非常高。

如果参数值使用“use_cY_with_specified_bits”,则 Bit Width 是可调节的。

如果不需要 y 方向的重心,可以通过选择“cY_not_used”将其关闭。

center_of_gravity_y_bits
键入 static 参数
默认 29
范围 [2, auto]

如果在 "center_of_gravity_y_mode" 中设置了 "use_cY_with_specified_bits",则可以在此处更改 bit 数。否则,该参数将被禁用。

center_of_gravity_y_overflow_flag
键入 static 参数
默认 not_used
范围 {not_used, used}

如果手动设置 y 方向重心的 bit 数,此参数将被激活并可设置为 "used"。如果检测到溢出,算子随后将在输出连接 "ErrorFlagsO" 的第 6 个 bit 上输出数字 1。

contour_length_mode
键入 static 参数
默认 contour_length_not_used
范围 {contour_length_not_used, contour_length_used}

对象的轮廓长度包括所有边缘,甚至包括孔洞处的边缘。详细解释请参见 'Contour Length'。

如果选择了此功能,可以根据所选的邻域,通过参数 "contour_length_bits_orthogonal_connected" 和 "contour_length_bits_diagonal_connected" 来选择所需的位数。如果选择了 4 邻域,则只能在正交方向上确定轮廓长度。如果选择了 8 邻域,则在正交和对角方向上确定轮廓长度。

contour_length_bits_orthogonal_connected
键入 static 参数
默认 16
范围 [1, 31]

如果将 "contour_length_mode" 设置为 "contour_length_used",则可在此处选择表示正交连接像素的轮廓长度所需的位数。

contour_length_bits_diagonal_connected
键入 static 参数
默认 16
范围 [1, 31]

如果将 "contour_length_mode" 设置为 "contour_length_used",则可在此处选择表示对角连接像素的轮廓长度所需的位数。只有在选择了 8 邻域时才可能这样做。否则,此参数将被禁用。

contour_length_overflow_flag
键入 static 参数
默认 not_used
范围 {not_used, used}

轮廓长度可能会导致溢出。如果使用了该标志,一旦发生溢出,就会在端口 "ErrorFlagsO" 的第 7 个 bit 上设置一个错误标志。

使用示例

以下示例展示了 Blob_Analysis_1D 算子的使用方法: