Blobby! - 形状/斑点识别代码
一个关于彩色形状/斑点识别的项目。
引言
我在工作中遇到了需要在项目中用到形状识别的需求。 让我很惊讶的是,我找不到多少可以使用的代码或示例。 棘手的部分是,我只有大约两周的时间来专注于图像处理/斑点分析部分。 因此,我设计了自己的形状/斑点识别算法,它包含一个简单的核心思想,简单而有效。
请注意,我没有编写基于已发表研究文献的工业级形状识别代码。 我已经联系了几家有信誉的图像处理软件供应商,询问了他们的产品,我可以告诉你,他们确实有针对特定需求的非常精细的工具,例如缺陷检测、细胞分析等。 但是,我相信可能有些人需要将一些基本的形状识别功能集成到他们的项目中,但没有购买此类产品的奢侈。 因此,我希望这里贡献的代码可以为一些基本用途提供一个起点,或者为进一步开发提供一个平台。
背景
在深入研究代码的工作原理之前,这里只是一个关于形状识别过程的简短介绍。
- 训练(使用输入作为识别的参考)。
- 识别(基于一些标准)。
- 输出(检测到的信息)。
培训
形状识别的逻辑源自“知识数据库”。 要训练形状识别功能,您只需要准备包含您希望该功能学习的形状的示例图像,并将它们传递到程序中。 项目压缩文件中包含几个示例图像文件,以演示对随机定向形状的识别。 关于制作您自己的训练图像的额外说明 - 图像的大小必须是形状的边界矩形的大小,即确保您的形状完全适合您的图像边界内。 我还在 ImageProc
类中编写了一个名为 trimImage()
的方法,您可以使用它来创建一个用于制作此类图像的工具。
致谢
我们之前讨论了训练形状识别功能,但没有指定识别标准。 常见的属性是颜色、大小(比例)和形状。 关于颜色和形状识别,确实有很多要研究。 我放弃了从照片图像中进行颜色分割的细节。 还有使用线壳、色调不变式等的形状识别。 我围绕简单的输入条件构建了形状/斑点识别功能——颜色已经分割,并且在边缘具有明确的颜色分离。 如果您的情况更棘手,例如阴影、输入阶段的渐变边缘等,您可以自由地改进它。 源代码中提供了更多详细信息,说明了我如何进行形状、大小和颜色识别。 感谢 Eran Yariv 的代码,我用它来旋转图像,以及 Vidcapture 项目 来处理 PPM 图像。
输出
我的代码转储了信息,例如斑点的质心(位置),以及形状是否存在于给定的工作位图中。 您可以根据您的应用程序需求轻松转储其他信息,例如像素数、边界框和颜色等。
使用代码
我更喜欢用 C++ 编码,因为我可以控制。 一旦您了解了形状识别类的工作原理,就可以轻松地将其移植到 VB 或任何其他基于 UI 的软件框架。 请参阅 Main.cpp 了解代码的运行方式。 实际上,让它运行并没有什么复杂之处。
#include "ImageProc.h" int main( void ) { ImageProc* ipObj = new ImageProc(); // Training ipObj->loadTrainingImage( "training.ppm" ); ipObj->loadWorkingImage( "working.ppm" ); // Recognition Color key( 0, 0, 255 ); // set the color of the blob you want to capture ipObj->catchBlobs( key ); ipObj->detectShape(); Output ipObj->markBlobCentroid(); // output map for verification // Cleanup and exit delete ipObj; return 0; }
关注点
我发现真正的挑战在于对您想要使用的真实图像的后期处理。 如果您不在非常严格的光照条件下捕获图像以确保颜色均匀性(同时消除阴影),并且使用高分辨率设备并进一步进行图像“清理”处理,那么您甚至不可能接近某种合理的形状识别阶段。 简单来说,如果您的图像不够“干净”,形状识别就会崩溃。
历史
- 2005 年 5 月:首次发布!