引言
一年前我还在上海从事过机器视觉软件的开发,时光荏苒。这是在公司期间做了一个有趣的项目,现讲一下其主要思想及如何实现。
先来看一下效果图,Look
嗯,看的出来,虽然背景光线不均匀,虽然骰子挨的那么近,还是很好的识别出来,程序的健壮性很强嘛。PS.为避免不必要的麻烦,我将自己的姓名和联系方式马赛克掉,嘿嘿。
这里程序的主要功能是识别出场景中存在多少粒骰子,以及每个骰子的位置,点子数,还有一些其他统计信息。当然,这只是一个机器视觉里的一个小Demo,可以继续完善。
思路
这是怎么做到的呢?这属于模式识别问题了。思路如下:
- 首先需要将目标(这里是整个骰子区域)从背景中正确分离出来;
- 将目标正确分离开来,即骰子之间要分离正确;
- 对单个骰子进行阈值分割,统计其中心坐标。
问题的关键点在于,第一步中如何正确将目标从背景中分离以及第二步沾黏的物体如何分离开来。
方法
顶帽变换
非均匀光照的最终结果导致了区域的分割错误(一些区域错误地分类了),且骰子的某些部分没有提取出来。顶帽变换的一个重要用途就是校正不均匀光照的影响。
顶帽(Top-hat)变换
:
原图像与开运算结果图之差。
dst=tophat(src,element)=src−open(src,element)
与顶帽变换相反的是
底帽(bottom-hat)变换
:
闭运算结果图与原图像之差。
dst=blackhat(src,ele