今天的博客文章是我几年前做的一个关于寻找图像中最亮点的教程的后续。
我之前的教程假设在图像中只有一个亮点你想要检测...
但如果有多个亮点呢?
如果您想在图像中检测多个亮点,代码会稍微复杂一点,但不会太复杂。不过不用担心:我将详细解释每一个步骤。
看看下面的图片:
在这幅图中,我们有五个灯泡。
我们的目标是检测图像中的这五个灯泡,并对它们进行唯一的标记。
首先,打开一个新文件并将其命名为detect_bright_spot .py。然后,插入以下代码:
# import the necessary packagesfrom imutils import contoursfrom skimage import measureimport numpy as npimport argparseimport imutilsimport cv2# construct the argument parse and parse the argumentsap = argparse.argumentparser()ap.add_argument(-i, --image, required=true, help=path to the image file)args = vars(ap.parse_args()) 导入一些必要的包和命令行参数。
要开始检测图像中最亮的区域,我们首先需要从磁盘加载我们的图像,然后将其转换为灰度图并进行平滑滤波,以减少高频噪声:
# load the image, convert it to grayscale, and blur itimage = cv2.imread(args[image])gray = cv2.cvtcolor(image, cv2.color_bgr2gray)blurred = cv2.gaussianblur(gray, (11, 11), 0) 这些操作的输出如下:
为了显示模糊图像中最亮的区域,我们需要应用阈值化:
# threshold the image to reveal light regions in the# blurred imagethresh = cv2.threshold(blurred, 200, 255, cv2.thresh_binary)[1] 操作取任意像素值p >= 200,并将其设置为255(白色)。像素值 300: mask = cv2.add(mask, labelmask) 第4行使用scikit-image库执行实际的连接组件分析。measure.lable返回的label和我们的阈值图像有相同的大小,唯一的区别就是label存储的为阈值图像每一斑点对应的正整数。
然后我们在第5行初始化一个掩膜来存储大的斑点。
第7行我们开始循环遍历每个label中的正整数标签,如果标签为零,则表示我们正在检测背景并可以安全的忽略它(9,10行)。
否则,我们为当前区域构建一个掩码。
下面我提供了一个gif动画,它可视化地构建了每个标签的labelmask。使用这个动画来帮助你了解如何访问和显示每个单独的组件:
然后第15行对labelmask中的非零像素进行计数。如果numpixels超过了一个预先定义的阈值(在本例中,总数为300像素),那么我们认为这个斑点“足够大”,并将其添加到掩膜中。
输出掩模如下图:
注意,所有小的斑点都被过滤掉了,只有大的斑点被保留了下来。
最后一步是在我们的图像上绘制标记的斑点:
# find the contours in the mask, then sort them from left to# rightcnts = 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 contoursfor (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 imagecv2.imshow(image, image)cv2.waitkey(0) 首先,我们需要检测掩模图像中的轮廓,然后按从左到右排序(3-7行)。
一旦我们的轮廓已经排序,我们可以对它们进行单独的循环处理(第8行)。
对于这些轮廓线,我们将计算出代表明亮区域的最小包围圆(第12行)。
然后,我们唯一地标记该区域并在图像上绘制它(第12-15行)。
最后,第17行和第18行显示了输出结果。
运行程序,你应该会看到以下输出图像:
请注意,每个灯泡都被独特地标上了圆圈,圆圈围绕着每个单独的明亮区域。
AI电话机器人的技术原理
中国电信以“Hello 5G 赋能未来”为主题,在广东深圳市隆重举办了“中国电信5G创新合作大会”
无线AP与无线路由器的区别是什么
多措并举,广租优服打造品牌形象新高度
Linux基础的用户权限
OpenCV图像中的多个亮点的检测方案
FSV3/FSU3/FSP3频谱分析仪
华为将携手产业伙伴全力支持中国运营商引领全球5G
从手机到PC,都不应该少了华为
远程状态监测已改变数据搜集方式
PLC控制系统抗干扰分析
雅特力在车用电子领域再度突破,AT32 MCU大量应用于ADAS环视系统
联想扬天S550笔记本首售,全金属机身设计支持双风扇散热
Altivar38变频器在水处理系统中的应用
基于VC的多线程异步串行通信动态链接库设计
泛华恒兴可移植性编程高性能GPIB通信卡
LED发光字制作流程
太阳能技术制造商SolarEdge裁员900人以降低运营成本
直流电动机和直流发电机的工作原理详解
如何利用StarRocks特性开启数据湖的极速分析体验