当前位置:首页 > 资讯 > 正文

如何检测图像中的圣诞树,用 Python 来帮你来实现

本文数据代码获取方式,公众号:程序员大飞,后台回复关键字:圣诞树

大家好,我是 zeroing,昨天是圣诞节,不知道大家过开心不,反正我是挺开心的,晚上室友都出去了自己一个人在宿舍,为所欲为~ 真的是爽歪歪~

本篇文章将用 Python 来实现图片中的圣诞树的识别、标记,可理解为计算机视觉中的物体检测,先声明一下哈这里没有用到神经网络,都是传统方法

先看一下效果,以下是原图

如何检测图像中的圣诞树,用 Python 来帮你来实现

下面是最终检测出来的效果图:

如何检测图像中的圣诞树,用 Python 来帮你来实现

图中的圣诞树的外轮廓都用红线给标记出来了,效果看起来还不错吧~,下面是算法实现的整体思路,分为三个部分

1,提取图片特征点(根据图像明亮度,色调,饱和度)

上面展示的6张图像中,因为彩灯原因,圣诞树在整个图片中呈现出偏亮、色调偏暖,与背景偏冷、偏青色形成对比;

如何检测图像中的圣诞树,用 Python 来帮你来实现

根据上面提到的思路先对圣诞树上特征点进行提取,这里对图像分别以亮度、色调、饱和度三个角度对图像做了条件筛选,筛选出图像中目标特征点集,筛选标准如下

  • 1,做亮度筛选时,先将RGB 转化为灰度图,提取灰度值大于220的区域(原图标准 0-255)
  • 2,把图像将RGB(0-255) 转化为 HSV(0-1)颜色空间,提取 HSV 中 hue (色调通道)值小于 0.2 或大于 0.95 的区域,小于 0.2 是为了提取图片中偏黄色,红色的特征点,大于 0.95 对应圣诞树边缘的紫红域
  • 3,图像 HSV 颜色空间中,提取 saturation(饱和度) 和 value(值) 大于 0.7 的部分

这里简单介绍一下 HSV ,HSV 为图片的一种颜色空间,与 RGB 三通道相似,RGB 分别表示红、绿、蓝三种通道;而 HSV 则代表 hue(色调),saturation(饱和度), value (亮度);

  • 色调H:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;(本文将0-300度转化为 0-1.0 范围数值)
  • 饱和度S:取值范围为0.0~1.0;
  • 亮度V:取值范围为0.0(黑色)~1.0(白色)。

根据上面三个筛选条件,对图像进行处理,最终得到一个黑白相间的二值化图像,这里用 numpy 中的 和 方法来聚合上面的三种条件;

如何检测图像中的圣诞树,用 Python 来帮你来实现

从上图可以看到,图片中的黑点即提取到的特征点(圣诞树),基本大致轮廓已经出来了,但会有少许噪点,见图二、图四,建筑中的灯光、地平线特征也被提取出来了,但这些不是我们所需要的,所以需要下面的一个步骤:聚类,来剔除这些噪点

2,用 DBSCAN 算法对特征点进行聚类

上一步得到特征点之后,下面就对特征点集进行聚类,关于点集聚类,这里用基于空间密度的 DNSCAN 算法,这个算法已经被封装到 scikit-learn包中,使用时直接调用即可,但因为涉及一些参数设置问题,使用时需要注意两个参数:

  • ,算法中的一个参数,表示类与类样本间的最大距离,对于不同数据集和距离函数这个参数需要设置不同的值;这里设置的是 图片对角线长度的0.04倍,这样的话既能适应大分辨率图片,也能适用于小分辨率的图片
  • ,假设以某一点为中心,周围的样本数量(包括样本本身) ; 值太小时,最终类别会太多,值太大时,最终类别太少;本文设置为 10 ;

特征点分类后,最终将圣诞树特征点部分全部标为红色,效果如下:

如何检测图像中的圣诞树,用 Python 来帮你来实现描边扩张后效果:

如何检测图像中的圣诞树,用 Python 来帮你来实现

可以看到图 2,3,4 中的特征点分别分为两类,用不同的颜色进行标记;后面再做一次条件筛选:只取图片中特征点数量最多的类(圣诞树),就可以把图像中的噪点去除

3,对目标特征点集计算凸包,在原图上绘制

最后这一步就简单多了,有了特征点集,利用 包 中的 ConvexHull 方法计算 凸包 ,之后再利用 将凸包在原图上进行绘制

如何检测图像中的圣诞树,用 Python 来帮你来实现

小结

文章中的一些技术点是值得借鉴,例如前面提到的用色调、饱和度作为阈值条件来筛选特征点,及后面的 DBSCAN 聚类算法的使用;这些 Idea 不仅局限在圣诞树上,也可以用于检测其它的一些物体上面来,但需要多思考,多实践

最后在这里提一下为什么聚类算法这里用 DBSCAN,而不是经典的 KMeans;因为 KMeans 分类时需要设置类别数量(类别数量是我们提前没有办法确定的),并且在分类时仅以欧式距离作为参考,最终分类结果并不理想,参照下图

KMeans 算法

如何检测图像中的圣诞树,用 Python 来帮你来实现

DBSCAN 算法

如何检测图像中的圣诞树,用 Python 来帮你来实现

文章中用到核心代码

 

启动脚本

 

好了,以上就是本篇文章的全部内容,如果觉得内容不错,求赞、求分享、求留言;最后感谢大家的阅读!

最新文章