Python+OpenCV 检测灯光亮点
本篇博文分享一篇寻找图像中灯光亮点(图像中最亮点)的教程,例如,检测图像中五个灯光的亮点并标记,项目效果如下所示:
第 1 步:导入并打开原图像,实现代码如下所示:
第 2 步:开始检测图像中最亮的区域,首先需要从磁盘加载图像,然后将其转换为灰度图并进行平滑滤波,以减少高频噪声,实现代码如下所示:
导入亮灯图像,过滤后效果如下所示:
第 3 步:阈值化处理,为了显示模糊图像中最亮的区域,将像素值 p >= 200,设置为 255(白色),像素值< 200,设置为 0(黑色),实现代码如下所示:
效果如下所示:
第 4 步:此时可看到图像中存在噪声(小斑点),所以需要通过腐蚀和膨胀操作来清除,实现代码如下所示:
此时“干净”的图像如下所示:
第 5 步:本项目的关键步骤是对上图中的每个区域进行标记,即使在应用了腐蚀和膨胀后,仍然想要过滤掉剩余的小块儿区域。一个很好的方法是执行连接组件分析,实现代码如下所示:
上述代码中,第 4 行使用 scikit-image 库执行实际的连接组件分析。measure.lable 返回的 label 和阈值图像有相同的大小,唯一的区别就是 label 存储的为阈值图像每一斑点对应的正整数。
然后在第 5 行初始化一个掩膜来存储大的斑点。
第 7 行开始循环遍历每个 label 中的正整数标签,如果标签为零,则表示正在检测背景并可以安全的忽略它(9,10 行)。否则,为当前区域构建一个掩码。
下面提供了一个 GIF 动画,它可视化地构建了每个标签的 labelMask。使用这个动画来帮助你了解如何访问和显示每个单独的组件:
第 15 行对 labelMask 中的非零像素进行计数。如果 numPixels 超过了一个预先定义的阈值(在本例中,总数为 300 像素),那么认为这个斑点“足够大”,并将其添加到掩膜中。输出掩模如下图所示:
第 6 步:此时图像中所有小的斑点都被过滤掉了,只有大的斑点被保留了下来。最后一步是在的图像上绘制标记的斑点,实现代码如下所示:
最后运行程序,可实现灯光亮点的检测和标记,每个灯泡都被独特地标上了圆圈,圆圈围绕着每个单独的明亮区域,效果如下所示:
本文来源于:Detecting multiple bright spots in an image with Python and OpenCV
版权声明: 本文为 InfoQ 作者【不脱发的程序猿】的原创文章。
原文链接:【http://xie.infoq.cn/article/a5a61bc91420c993f9e0b04ef】。文章转载请联系作者。
评论