斑点分析工具介绍#

章节目标#

  • 了解什么场景下应该选用斑点分析工具

  • 了解斑点分析工具中配置器和算子的连接关系

  • 了解斑点分析工具中的配置器和算子

  • 如何设置推理参数

支持的使用场景#

  • 形状检测和分析:斑点分析通过将不同灰度范围内的图像看成感兴趣区域(即斑点),通过一系列操作(如形态学、连通等)操作不断调整区域的形态和数量,最终筛选出一系列符合条件的区域。当前该工具内部只支持对单通道或三通道Depth8U类型的图像进行处理,对于其他图像类型,可以自行用pipeline或脚本转换为能处理的图像类型。

  • 适应场景:背景比较简单,或目标灰度与背景可完全区分的场景,如金属、玻璃、塑料等材料的划痕、污点、气泡等,或在食品、药品等领域,用于检测粉末、液体中的颗粒大小等。

  • 不适应场景:斑点特征模糊或重叠、复杂背景干扰或非刚性物体。

斑点分析工具中配置器和算子的连接关系#

斑点分析工具中的配置器#

斑点分析参数配置器(blob_analysis.conf)#

  • 描述:用于配置斑点分析工具推理中的各项参数(visionflow::param::BlobAnalysisParameters),具体含义如下:
    • image_page:图像页

    • use_full_script:是否完全使用脚本

    • blob_analysis_pipeline:斑点分析流程(不使用脚本时生效)

    • result_item:斑点分析输出项(不使用脚本时生效)

    • script:斑点分析脚本(使用脚本时生效)

每项都支持get()获取属性和set()设置属性。

斑点分析工具中的算子#

推理算子(oper::blob_analysis)#

  • 描述:对输入图像进行斑点分析,有两种运行模式可以选择:
    • 使用斑点分析流程:由输入图像’image’和视图’views’搭建计算流程,最终得到输出项。输出项的类型必须为 visionflow::rle::MultiRleRegion 。 将输入的视图减去掩码,与输出区域相交得到最终缺陷区域,再转换成 visionflow::props::PolygonRegionList 类型输出。

    • 使用脚本:用户直接写一段可执行的Python脚本,并输出 visionflow::props::PolygonRegionList 类型的对象。其中blob_analysis 函数必须存在,其参数为’image’和’views’,计算过程完全由用户指定,只要输出的类型符合要求即可。

如何设置推理参数#

斑点分析的推理参数与其他工具完全不同,它不是几个简单值的设置,而是需要自行搭建检测流程。

使用斑点分析流程:首先先设置使用脚本为否。然后设置最终输出的区域,最终输出的区域result_item有且只有一个,且只会计算这个区域依赖的中间结果,不依赖的不计算。 然后搭建斑点分析的检测流程,一般第一步是图像二值化,支持多种类型二值化(可以参考visionflow::img命名空间下的二值化算子及所需参数), 提取图像中感兴趣的区域。用一个名字指定该区域,接着进行形态学、连通、筛选等操作(可以参考VisionFlow官网 https://visionflow.aqrose.com -详细使用教程-区域操作和分析一节, 也可以参考visionflow::rle命名空间下的函数及所需参数),每个得到的区域都用一个名字表示。最终通过一系列操作得到最终输出的区域result_item。

示例如下:

visionflow::param::BlobAnalysisParameters param;
param.set_use_full_script(false);
param.get_blob_analysis_pipeline()
    .add_item("region1", "visionflow.rle.RleRegion")
    .set_arg("region1", "img", "image")
    .set_arg("region1", "low", "128")
    .set_arg("region1", "high", "255")
    .set_arg("region1", "invert", "False");
param.get_blob_analysis_pipeline()
    .add_item("result", "visionflow.rle.erosion_rectangle")
    .set_arg("result", "region", "$", "region1")
    .set_arg("result", "ksize", "visionflow.geometry.Size2i(3, 3)");
param.set_result_item("result");

该代码实现了一个简单的斑点分析流程,首先对图像进行二值化得到region1区域,然后对region1进行腐蚀操作得到最终结果result。

使用脚本:使用Python脚本工具,设置使用脚本为是,直接编写代码。这个脚本要求blob_analysis函数必须存在,输入为image和views,输出是PolygonRegionList类型。函数里面内容不限,用户可以使用VisionFlow提供任意函数。最后把脚本设置进斑点分析的参数即可。

示例如下:

visionflow::param::BlobAnalysisParameters param;
param.set_use_full_script(true);
const std::string script = R"(
import visionflow as vf
from visionflow import props as prop
from visionflow import rle as rl
from visionflow import geometry as geo
def blob_analysis(image: prop.Image, views: prop.ViewList) -> prop.PolygonRegionList :
    region_all = rl.RleRegion(image.image(), 100, 200)
    region_vec = rl.connection(region_all)
    multi_polys = rl.find_contours(region_vec, False)
    ply_region_list = prop.PolygonRegionList()
    for multi_poly in multi_polys:
        for poly in multi_poly:
            region = vf.PolygonRegion(geo.Polygon2f(poly), "NG")
        ply_region_list.add(region)
    return ply_region_list
)";
param.set_script(script);