• 必做:对于图1,找出船所在区域,并定量描述
  • 选做:对于图2,综合运用边缘和区域特征实现对松鼠的检测

图1

图2

找船所在区域

船的特征

  • 宽大于高
  • 下面为水面,底部直线为平行线
  • 横向投影底部大于顶部
  • 纵向投影中间高两边低

二值化

原图直方图为
灰度直方图

注意到原图黑色背景部分很大,所以可以直接取全局阈值为65得到如下二值化图像
全局阈值
基本上符合要求。

使用Otsu阈值判别法(graythresh函数)获得的阈值是75,效果与全局阈值65差不多。
Otsu方法

分割

对上面获得的图像进行分割,首先判断船底是水,必然是一大片的背景区域,因此通过横向投影删除底部的石头背景,再把上面横向投影超过\(\frac12\)的白点去掉。得到下图
区域分割

通过Matlab的regionprops函数获取连通区域的面积,取最大面积的连通区域。得到
连通区域

最后通过imclose去除噪点,得到最终分割结果。
分割结果

优化

注意到原图中的船后面部分是有一段船体的,和背景重合比较大,因此上面的方法并没有获得这部分船体。可以采用区域生长的算法获得这部分船体。

取结果的所有点作种子进行区域生长。得到的结果为
最终结果

在生长结束之后对结果做了一次闭运算。

检测松鼠

先验知识

观察图片我们能得到几条先验知识:

  • 松鼠在镜头内部
  • 松鼠的宽度是其高度的,并且不是很宽
  • 背景很模糊,前景比较清晰

处理

背景非常模糊并且比较一致的,我们可以使用区域生长算法获取背景,剩下的自然就是前景。同时因为松鼠整体是在照片内部的,所以区域生长的种子可以取图片的四个边界,最终区域生长得到的结果(灰度)为:
检测松鼠——区域生长

然后的处理方法就和检测船的方法差不多,把宽度过大的部分删去,然后取最大连通分量。

去除宽度过大部分后的mask:
去除宽度过大部分后的mask

最终结果:
松鼠检测最终结果

优化

后续优化还可以利用边缘提取去除松鼠身体与尾巴之间夹住的部分,以及再次选择区域种子进行生长。最终结果边缘是不够的。

代码

如果看不到代码请刷新~