Python+OpenCV检测灯光亮点的实现方法


Posted in Python onNovember 02, 2020

本篇博文分享一篇寻找图像中灯光亮点(图像中最亮点)的教程,例如,检测图像中五个灯光的亮点并标记,项目效果如下所示:

Python+OpenCV检测灯光亮点的实现方法

Python+OpenCV检测灯光亮点的实现方法

第1步:导入并打开原图像,实现代码如下所示:

# import the necessary packages
from imutils import contours
from skimage import measure
import numpy as np
import argparse
import imutils
import cv2
# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
 help="path to the image file")
args = vars(ap.parse_args())

第2步:开始检测图像中最亮的区域,首先需要从磁盘加载图像,然后将其转换为灰度图并进行平滑滤波,以减少高频噪声,实现代码如下所示:

#load the image, convert it to grayscale, and blur it
image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (11, 11), 0)

导入亮灯图像,过滤后效果如下所示:

Python+OpenCV检测灯光亮点的实现方法

第3步:阈值化处理,为了显示模糊图像中最亮的区域,将像素值p >= 200,设置为255(白色),像素值< 200,设置为0(黑色),实现代码如下所示:

# threshold the image to reveal light regions in the
# blurred image
thresh = cv2.threshold(blurred, 200, 255, cv2.THRESH_BINARY)[1]

效果如下所示:

Python+OpenCV检测灯光亮点的实现方法

 第4步:此时可看到图像中存在噪声(小斑点),所以需要通过腐蚀和膨胀操作来清除,实现代码如下所示:

# perform a series of erosions and dilations to remove
# any small blobs of noise from the thresholded image
thresh = cv2.erode(thresh, None, iterations=2)
thresh = cv2.dilate(thresh, None, iterations=4)

此时“干净”的图像如下所示:

Python+OpenCV检测灯光亮点的实现方法

第5步:本项目的关键步骤是对上图中的每个区域进行标记,即使在应用了腐蚀和膨胀后,仍然想要过滤掉剩余的小块儿区域。一个很好的方法是执行连接组件分析,实现代码如下所示:

# perform a connected component analysis on the thresholded
# image, then initialize a mask to store only the "large"
# components
labels = measure.label(thresh, neighbors=8, background=0)
mask = np.zeros(thresh.shape, dtype="uint8")
# loop over the unique components
for label in np.unique(labels):
 # if this is the background label, ignore it
 if label == 0:
  continue
 # otherwise, construct the label mask and count the
 # number of pixels 
 labelMask = np.zeros(thresh.shape, dtype="uint8")
 labelMask[labels == label] = 255
 numPixels = cv2.countNonZero(labelMask)
 # if the number of pixels in the component is sufficiently
 # large, then add it to our mask of "large blobs"
 if numPixels > 300:
  mask = cv2.add(mask, labelMask)

上述代码中,第4行使用scikit-image库执行实际的连接组件分析。measure.lable返回的label和阈值图像有相同的大小,唯一的区别就是label存储的为阈值图像每一斑点对应的正整数。

然后在第5行初始化一个掩膜来存储大的斑点。

第7行开始循环遍历每个label中的正整数标签,如果标签为零,则表示正在检测背景并可以安全的忽略它(9,10行)。否则,为当前区域构建一个掩码。

下面提供了一个GIF动画,它可视化地构建了每个标签的labelMask。使用这个动画来帮助你了解如何访问和显示每个单独的组件:

Python+OpenCV检测灯光亮点的实现方法

第15行对labelMask中的非零像素进行计数。如果numPixels超过了一个预先定义的阈值(在本例中,总数为300像素),那么认为这个斑点“足够大”,并将其添加到掩膜中。输出掩模如下图所示:

Python+OpenCV检测灯光亮点的实现方法

第6步:此时图像中所有小的斑点都被过滤掉了,只有大的斑点被保留了下来。最后一步是在的图像上绘制标记的斑点,实现代码如下所示:

# find the contours in the mask, then sort them from left to
# right
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
 cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
cnts = contours.sort_contours(cnts)[0]
# loop over the contours
for (i, c) in enumerate(cnts):
 # draw the bright spot on the image
 (x, y, w, h) = cv2.boundingRect(c)
 ((cX, cY), radius) = cv2.minEnclosingCircle(c)
 cv2.circle(image, (int(cX), int(cY)), int(radius),
  (0, 0, 255), 3)
 cv2.putText(image, "#{}".format(i + 1), (x, y - 15),
  cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)
# show the output image
cv2.imshow("Image", image)
cv2.waitKey(0)

 最后运行程序,可实现灯光亮点的检测和标记,每个灯泡都被独特地标上了圆圈,圆圈围绕着每个单独的明亮区域,效果如下所示:

Python+OpenCV检测灯光亮点的实现方法

Python+OpenCV检测灯光亮点的实现方法

本文来源于:Detecting multiple bright spots in an image with Python and OpenCV

到此这篇关于Python+OpenCV检测灯光亮点的实现方法的文章就介绍到这了,更多相关OpenCV 检测灯光亮点内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中列表和元组的相关语句和方法讲解
Aug 20 Python
Python编程中的for循环语句学习教程
Oct 14 Python
详解Python的Lambda函数与排序
Oct 25 Python
Python之ReportLab绘制条形码和二维码的实例
Jan 15 Python
Python lambda函数基本用法实例分析
Mar 16 Python
Python/Django后端使用PIL Image生成头像缩略图
Apr 30 Python
python做反被爬保护的方法
Jul 01 Python
python os.fork() 循环输出方法
Aug 08 Python
Django ORM多对多查询方法(自定义第三张表&amp;ManyToManyField)
Aug 09 Python
Django stark组件使用及原理详解
Aug 22 Python
Python3实现飞机大战游戏
Apr 24 Python
一些让Python代码简洁的实用技巧总结
Aug 23 Python
python获取命令行参数实例方法讲解
Nov 02 #Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
Nov 01 #Python
详解tensorflow之过拟合问题实战
Nov 01 #Python
python cookie反爬处理的实现
Nov 01 #Python
10个python爬虫入门实例(小结)
Nov 01 #Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
Nov 01 #Python
Python经纬度坐标转换为距离及角度的实现
Nov 01 #Python
You might like
PHP实现MVC开发得最简单的方法――模型
2007/04/10 PHP
PHP syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
2013/05/10 PHP
PHP页面转UTF-8中文编码乱码的解决办法
2015/10/20 PHP
浅谈php和js中json的编码和解码
2016/10/24 PHP
基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
2013/05/07 Javascript
js获取UserControl内容为拼html时提供方便
2014/11/02 Javascript
浅析Jquery操作select
2016/12/13 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
2017/02/17 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
2017/05/05 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
2017/07/12 Javascript
Node.js 使用流实现读写同步边读边写功能
2017/09/11 Javascript
Vue中之nextTick函数源码分析详解
2017/10/17 Javascript
js删除数组中的元素delete和splice的区别详解
2018/02/03 Javascript
详解Vue.js项目API、Router配置拆分实践
2018/03/16 Javascript
vue计算属性及使用详解
2018/04/02 Javascript
Vue 中mixin 的用法详解
2018/04/23 Javascript
在vue中使用echarts图表实例代码详解
2018/10/22 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
如何解决vue在ios微信&quot;复制链接&quot;功能问题
2020/03/26 Javascript
JavaScript 实现继承的几种方式
2021/02/19 Javascript
[05:43]VG.R战队教练Mikasa专访:为目标从未停止战斗
2016/08/02 DOTA
Python类的基础入门知识
2008/11/24 Python
python paramiko模块学习分享
2017/08/23 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
python flask 如何修改默认端口号的方法步骤
2019/07/12 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
python-numpy-指数分布实例详解
2019/12/07 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
2020/02/18 Python
HomeAway的巴西品牌:Alugue Temporada
2018/04/10 全球购物
编写用C语言实现的求n阶阶乘问题的递归算法
2014/10/21 面试题
sort命令的作用和用法
2013/08/25 面试题
银行办公室岗位职责
2014/03/10 职场文书
社会调查研究计划书
2014/05/01 职场文书
鲲鹏 CentOS 7 安装Python3.7
2022/05/11 Servers