美文网首页图像目标识别程序员
一个极其简单的图像识别小程序

一个极其简单的图像识别小程序

作者: 夏元 | 来源:发表于2016-03-31 16:17 被阅读4214次

前段时间写了个简单的图像识别程序,主要实现了对螺丝、螺母、硬币和小扳手的识别。现在来简单地做一个总结。
该程序的主要思路如下:

  1. 将采集到的RGB图像转化为灰度图像
  2. 应用OSTU算法对图像进行阈值分割并二值化
  3. 使用区域生长算法将各个待检测目标提取出来
  4. 根据目标的形状特征对目标进行分类

接下来对各个步骤做一些分析。

图像预处理

图像预处理是本实验的第一步。其目的是将目标物体的图像从背景中分割出来,这样我们才方便做后续的识别。
首先将RGB图像转换为灰度图像,是为了去除冗余的色彩信息,同时也简化了计算。
在灰度图像的基础上在进行图像分割。我们这里采取比较简单又较为常用的阈值分割法来进行图像分割。这里使用的OSTU算法是一种具有一定自适应性的阈值分割法,网络上有许多对这个算法的详细说明,我们这里不加赘述。

区域生长

虽然通过阈值分割我们已经得到了所有目标物体的像素分布,但是仅凭这个我们无法对每个物体的特征进行分析。因为我们并不知道单独的每个目标的像素分布。所以我们要寻找一种方法,将每个物体的像素信息分布保存起来。这种方法就是区域生长算法。区域生长的核心思想就是从种子点开始向相邻的点逐点搜索,从而将整个连通区域提取出来。
以下是该部分的源代码:

//返回生长区域点的个数
int CMainFrame::RegionGrow(Point init, vector<Point> &result, int **mark)
{
    stack<Point> seedStack;
    Point seed(0,0);
    int n = 0;  //区域内点的数量

    mark[init.y][init.x] = 1;
    seedStack.push(init);
    Point tmp(seed.x,seed.y);
    while (1)
    {
        seed = seedStack.top();
        seedStack.pop();
        if(seed.x < m_pBmpInfo->bmiHeader.biWidth-1)
        {
            tmp.x = seed.x + 1;
            tmp.y = seed.y;
            if(!mark[tmp.y][tmp.x] && gImageBuffer[tmp.y*m_pBmpInfo->bmiHeader.biWidth+tmp.x] == 0)
            {
                seedStack.push(tmp);
                result.push_back(tmp);
                mark[tmp.y][tmp.x] = 1;    //将已被生长的点标记为1
                n++;    //区域点的数量加一
            }
        }
        if(seed.y < m_pBmpInfo->bmiHeader.biHeight-1)
        {
            tmp.x = seed.x;
            tmp.y = seed.y + 1;
            if(!mark[tmp.y][tmp.x] && gImageBuffer[tmp.y*m_pBmpInfo->bmiHeader.biWidth+tmp.x] == 0)
            {
                seedStack.push(tmp);
                result.push_back(tmp);
                mark[tmp.y][tmp.x] = 1; 
                n++;
            }
        }
        if(seed.x > 0)
        {
            tmp.x = seed.x - 1;
            tmp.y = seed.y;
            if(!mark[tmp.y][tmp.x] && gImageBuffer[tmp.y*m_pBmpInfo->bmiHeader.biWidth+tmp.x] == 0)
            {
                seedStack.push(tmp);
                result.push_back(tmp);
                mark[tmp.y][tmp.x] = 1; 
                n++;
            }
        }
        if(seed.y > 0)
        {
            tmp.x = seed.x;
            tmp.y = seed.y - 1;
            if(!mark[tmp.y][tmp.x] && gImageBuffer[tmp.y*m_pBmpInfo->bmiHeader.biWidth+tmp.x] == 0)
            {
                seedStack.push(tmp);
                result.push_back(tmp);
                mark[tmp.y][tmp.x] = 1;  
                n++;
            }
        }

        if(seedStack.empty())
            break;
    }
    return n;
}

目标识别

在得到了各个目标的像素信息后,如何对目标进行分类呢?由于我们要识别的物体仅限于螺丝、螺母、硬币这样形状简单的物体,我们只需通过一些简单的特征就能将他们区分开来。

  • 螺母的中心为空,而螺丝、小扳手均为实心
  • 小扳手为L形的细杆,其长轴和短轴之比远大于螺丝
  • 硬币为圆形

凭借以上三条规则,就足以将螺丝、螺母、硬币和扳手区分开来了。

小结

本文主要是整理思路,细节的地方并未涉及,希望能对读者有一些帮助~
P.S. 此文在我新搭建的独立博客亦有发表:
http://cyanair.me/2016/03/31/a-simple-objection-recognition-program/

相关文章

  • 一个极其简单的图像识别小程序

    前段时间写了个简单的图像识别程序,主要实现了对螺丝、螺母、硬币和小扳手的识别。现在来简单地做一个总结。该程序的主要...

  • 图像识别的小程序

    图像识别的小程序。它能做的是将写在纸上的文字,精准地识别出来。如下图。 代码如下: import requests...

  • 极其简单

    一直以来我真的很崇尚一种极简的生活方式,可是自己还真的是控制不住自己要各种买买买,生气生气,有的时候你都不知道因为...

  • 垃圾分类小程序

    一、项目简介: 作为一个后端程序猿,这是自己开发的第一款小程序,没有使用云开发,接入了图像识别,之后有时间会接...

  • 实战 | 一行命令训练你的图像分类模型

    1.项目介绍 这次给大家介绍一个很方便的训练自己图像识别模型的一个程序。可以通过一行命令实现训练自己的图像识别模型...

  • go 基于select生成随机数

    一个很简单小程序:

  • Clip++使用说明

    Clip++主要是iOS的剪贴板监控及记录的小扩展程序. Clip++功能极其简单. 无其他操作. 只要您在iPh...

  • 微信出了个史上最简单粗暴的小程序,你还不知道?

    ​这个小程序名叫“门店小程序” 门店小程序? 也许是史上最简单粗暴的小程序,可以理解为一个名片型小程序,是微信公众...

  • 为什么只要1000元的小程序,却不是骗局!

    前段时间,小柠曝光的一些拿着极其简单的模板甚至是免费的门店小程序,夸大、欺骗商家的无良开发商。稍微懂行的人,都能看...

  • 小程序介绍

    我对小程序的理解 小程序基本语法介绍 实现一个简单的小程序 1.我对小程序的理解 小程序是有别于传统web、h5、...

网友评论

  • 老吴洞察:微信发现小程序搜索“识图者”:不仅可以进行传图识字,还可以进行动物识别和植物识别。 ​​​
    小吴同学Spark:识图者蛮好用的,还可以动物识别和植物识别。 ​​​
  • jie4038:厉害,我之前也写了一个图像识别的小程序,不过算法不是自己的,借用了百度识别,
    识别率还不错。
    苏南走了:对js网页之类没有基础,想把自己写的模型以api的方式放到小程序里做展示。不知您的代码是否开源的,可否借鉴一下?
    jie4038:对了,我取名“拍照识图”,现在应该还能搜到。
  • a639bda3122e:你好,学习了一波。不过提供的链接无法访问,不知是否还有别的有效链接或者github地址,非常感谢!

本文标题:一个极其简单的图像识别小程序

本文链接:https://www.haomeiwen.com/subject/txbelttx.html