餐碗识别

问题分析

1.1 目的

Demo需要实现的初步效果:从样本图片中识别出特定的两种碗,如黄色和红色的餐碗。

1.2 样本图片的分析

图片整体以白色为背景对象为规则的圆形和颜色丰富的内容物。餐碗的颜色多为彩色,颜色鲜艳,内容物边缘信息丰富,轮廓清晰;

1.3 可实现的方法设想

使用HOG算子得到灰度梯度强度信息,对应图中边缘信息丰富的区域,二值化之后白色部分对应餐碗等边缘信息丰富的部分。

由于餐碗所在的区域聚集程度高形态学运算后将这些区域连成一片聚集程度最大的区域对应餐碗的中心。在黑白图中做距离变换,得到白色点到周围最近点的距离,得到统计数值。由统计数值可以知道最高点对应着白色区域的局部中心,数值意味着白色区域的局部最大内接圆的半径,也就是碗的最外层边缘。

得到碗的区域后做形态学操作得到最外围的环状区域统计颜色值判断碗的类型

算法实现步骤

2.1 软件环境

使用MATLAB2016a验证算法 

2.2 算法实施过程

2.2.1 提取黑白图

使用hog算子计算灰度梯度,归一化之后得到灰度图像如下其中灰度值越大表示边缘越明显

 

 

将上述灰度图二值化得到黑白图如下:

 

 

将二值图进行形态学操作去除白色区域的空洞

 

 

2.2.2 获取餐碗的真实区域 

在上面得到的黑白图中,以一个半径为150的圆形算子进行腐蚀,相当于一个半径为150的圆盘在白色区域内滚动,凡是可以到达的地方就将该处的圆心置为白色。这样可以将盘子分离出来。得到盘子的中心区域,如下:

 

对上面每一个区域再以相同半径的圆形算子膨胀,得到每一个碗的具体区域。由此可以近似地将每一个碗单独的分出来。

 

2.2.3 餐碗半径的估计

以盘子为例使用形态学中的距离变换(详见MATLAB bwdist函数),得到的结果如图:

 

 

图中最高点的数值对应着白色区域的最大内接圆,用最大内接圆近似表示碗的位置和半径。结果如下:

 

2.2.4 餐碗的颜色判断

识别圆周附近圆环(圆环通过形态学操作得到)处的颜色种类 (统计圆环内对应的碗的颜色的像素,到达一定的数量或者比例即可认定为该类型的碗),如图,统计该环形区域的黄色碗像素。当黄色像素的个数超过一定比例即认为该碗的颜色为黄色。

 

 

2.2.5 结果分析

见文件夹【识别黄色碗结果】

可以看出,分割出来的碗的区域大致准确,但是轮廓边缘不准确;

当富含纹理的部分区域(含有菜的区域)太小时就只是得到了这一区域缺失了碗的轮廓

当菜的颜色太纯的时候比方说全是黑色的时候得到的边缘信息近乎没有无法完成分割和检测

2.3 存在的问题和改进

黑色物体可能边缘特征不明显,但是颜色信息明显可以通过颜色的显著性判断是餐碗部分;

存在干扰:人手桌上物品桌子边缘可以认为设定一个范围去除范围之外的干扰

 光照不同阴影等会误识别为边缘总的来说影响较小;

由于上述算法只是使用了边缘强度信息得到的结果比较片面可以考虑使用颜色信息

基于颜色分割识别的思路

颜色的分割可以使用合适的颜色空间进行分割,例如MATLAB自带的工具分割的效果就较好,结果类似下面。

 

不同的颜色空间对应的分量图片

 

 

分割出来的黄色餐碗部分

颜色的划分:在整张图中,彩色的前景与背景存在较大的差别。如图,颜色越鲜艳的区域越亮,灰色、白色区域较暗:

 

 

 

使用边缘信息也可以做分割边缘图(这里只是使用了边缘算子检测得到的结果,也可以计算梯度强度然后阈值化得到二值图)

线段检测能够得到部分直线边缘

 

 

黑白图做投影统计可以看出餐碗存在的区域的大致范围log算子得到的灰度图做投影统计结果如下可以大致判断x坐标点范围。

 

 

对二值图可以尝试提取图中的长直线边缘例如下图中比较光滑的白色区域

 

原文地址:https://www.cnblogs.com/tangyuanjie/p/12924221.html