图像处理

[English]

image – 图像处理 模块中的视觉算法来自 OpenMV 的 imlib 库,在本仓库 中以 components/imlib IDF 组件的形式维护。它们大致分为几类:点变换与几何变换、 邻域滤波、统计分析,以及特征检测。本页说明每一类的作用与适用场景。

典型处理流水线

多数颜色跟踪或检测脚本都遵循以下处理流程:

预处理可以组合使用 image.Image.to_grayscale()image.Image.gaussian()image.Image.histeq();分割通常使用 image.Image.binary();分析阶段再使用 image.Image.find_blobs()image.Image.get_statistics() 或特征检测器,随后由应用绘制结果或执行相应操作。

阈值化与分割

image.Image.binary() 通过把每个像素与一组颜色阈值比较,把图像转换为掩膜 (阈值为何用 LAB 表示见 图像模型)。只要像素落入 任一 阈值即为“有效”, 因此可同时跟踪多种颜色。配套的 image.Image.find_blobs() 在相同阈值上运行 8 连通分量标记,为每个连通区域返回一个 image.blob,包含质心、外接框、 像素数、朝向,以及圆度、实心度等形状描述子。

邻域(卷积)滤波

这些方法用像素 (2*ksize+1) 方形邻域的某个函数来替换该像素:

  • image.Image.mean() —— 盒式平均;快速模糊。

  • image.Image.gaussian() —— 用帕斯卡三角(二项式)近似高斯核的加权平均; 标准降噪模糊。设 unsharp=True 则改为锐化。

  • image.Image.laplacian() —— 二阶导数边缘响应;设 sharpen=True 可叠加 回原图以增强边缘。

  • image.Image.morph() —— 应用任意整数卷积核。muladd 缩放并偏置 结果;mul 默认为 1/sum(kernel),以保持图像亮度。

它们都带有 threshold/offset/invert 关键字,可在一次遍历中把滤波变成 自适应阈值化操作。

秩滤波与保边滤波

秩滤波对邻域排序而非求平均,能在较少模糊边缘的前提下去噪:

形态学

image.Image.erode()image.Image.dilate() 用方形结构元收缩或扩张 (通常为二值图像的)有效像素;image.Image.open()image.Image.close() 组合二者以去除小噪点或填补小孔。threshold 参数控制 需要多少个邻居为有效,从而推广了经典二值算子。

直方图与统计

image.Image.get_histogram() 按通道对像素值分箱;返回的 image.histogram 可计算 Otsu 阈值(image.histogram.get_threshold())、 百分位以及完整统计量。image.Image.get_statistics() 一次返回均值、中位数、 众数、标准差、四分位数与最小/最大值,便于在运行时自动整定阈值。

特征检测

更高层的检测器用于发现几何结构:

当前 ESP32-P4 板级配置还通过 ZXing-C++ 后端提供 image.Image.find_barcodes()

备注

本构建禁用了 OpenMV 中受 GPL 许可的代码路径(OMV_NO_GPL=1),因此少量上游 算法被有意排除。每块板子的 imlib_config.h 决定编译哪些可选算法;未启用的方法 会在调用时抛出异常。