餐碗识别
1 问题分析
1.1 目的
Demo需要实现的初步效果:从样本图片中识别出特定的两种碗,如黄色和红色的餐碗。
1.2 样本图片的分析
图片整体以白色为背景,对象为规则的圆形和颜色丰富的内容物。餐碗的颜色多为彩色,颜色鲜艳,内容物边缘信息丰富,轮廓清晰;
1.3 可实现的方法设想
使用HOG算子得到灰度梯度强度信息,对应图中边缘信息丰富的区域,二值化之后白色部分对应餐碗等边缘信息丰富的部分。
由于餐碗所在的区域聚集程度高,形态学运算后将这些区域连成一片,聚集程度最大的区域对应餐碗的中心。在黑白图中做距离变换,得到白色点到周围最近点的距离,得到统计数值。由统计数值可以知道最高点对应着白色区域的局部中心,数值意味着白色区域的局部最大内接圆的半径,也就是碗的最外层边缘。
得到碗的区域后做形态学操作得到最外围的环状区域,统计颜色值判断碗的类型。
2 算法实现步骤
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坐标点范围。
对二值图,可以尝试提取图中的长直线边缘,例如下图中比较光滑的白色区域: