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)

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

第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]

效果如下所示:

第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)

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

第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。使用这个动画来帮助你了解如何访问和显示每个单独的组件:

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

第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)

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容