- 必做:对于图1,找出船所在区域,并定量描述
- 选做:对于图2,综合运用边缘和区域特征实现对松鼠的检测
找船所在区域
船的特征
- 宽大于高
- 下面为水面,底部直线为平行线
- 横向投影底部大于顶部
- 纵向投影中间高两边低
二值化
原图直方图为
注意到原图黑色背景部分很大,所以可以直接取全局阈值为65得到如下二值化图像
基本上符合要求。
使用Otsu阈值判别法(graythresh
函数)获得的阈值是75,效果与全局阈值65差不多。
分割
对上面获得的图像进行分割,首先判断船底是水,必然是一大片的背景区域,因此通过横向投影删除底部的石头背景,再把上面横向投影超过\(\frac12\)的白点去掉。得到下图
通过Matlab的regionprops
函数获取连通区域的面积,取最大面积的连通区域。得到
最后通过imclose
去除噪点,得到最终分割结果。
优化
注意到原图中的船后面部分是有一段船体的,和背景重合比较大,因此上面的方法并没有获得这部分船体。可以采用区域生长的算法获得这部分船体。
取结果的所有点作种子进行区域生长。得到的结果为
在生长结束之后对结果做了一次闭运算。
检测松鼠
先验知识
观察图片我们能得到几条先验知识:
- 松鼠在镜头内部
- 松鼠的宽度是其高度的,并且不是很宽
- 背景很模糊,前景比较清晰
处理
背景非常模糊并且比较一致的,我们可以使用区域生长算法获取背景,剩下的自然就是前景。同时因为松鼠整体是在照片内部的,所以区域生长的种子可以取图片的四个边界,最终区域生长得到的结果(灰度)为:
然后的处理方法就和检测船的方法差不多,把宽度过大的部分删去,然后取最大连通分量。
去除宽度过大部分后的mask:
最终结果:
优化
后续优化还可以利用边缘提取去除松鼠身体与尾巴之间夹住的部分,以及再次选择区域种子进行生长。最终结果边缘是不够的。
代码
如果看不到代码请刷新~