前言

显著性检测,就是使用图像处理技术和计算机视觉算法来定位图片中最“显著”的区域。显著区域就是指图片中引人注目的区域或比较重要的区域,例如人眼在观看一幅图片时会首先关注的区域。例如下图,我们人眼一眼看过去首先注意到的不是草坪,而是躺在草坪上的内马尔,内马尔所在的区域就是显著性区域。这种自动定位图像或场景重要区域的过程称为显着性检测。显著性检测在目标检测、机器人领域有很多应用。

三种显著性检测算法

在OpenCV的saliency模块中有三种显著性检测算法:Static saliency:此类显着性检测算法依赖于图像特征和统计信息来定位图像中显著性区域。

Motion saliency:此类显着性检测算法输入为视频或一系列连续帧。运动显着性算法处理这些连续的帧,并跟踪帧中“移动”的对象。这些移动的对象被认为是显着性区域。

Objectness:这类显著性检测算法计算出一个个的建议区域(proposals),这些建议区域被认为是目标可能存在的区域。

需要注意的是显著性检测不是目标检测,显著性检测算法并不能判断图片中是否有“目标”,它只能检测出图片中它“认为”有目标的区域,这些区域可能真的包含目标,也可能不包含目标。通常显著性检测算法是许多计算机视觉任务的第一步,检测出显著性区域后再对这些显著性区域进一步判断和预测。

显着性检测器通常是非常快速的算法,能够实时运行。显着性检测器的结果随后被传递到计算量更大的算法中。这样后续计算量大的算法不必在图像的每个区域运行,而只需在显著性区域上运行。

OpenCV中的显著性检测算法

OpenCV的显著性检测算法在contrib包中,所以要使用显著性检测算法需要安装OpenCV_contrib包。OpenCV中显著性检测模块Saliency的类关系如下:

OpenCV提供类4种显著性检测算法的实现:cv2.saliency.ObjectnessBING_create()

cv2.saliency.StaticSaliencySpectralResidual_create()

cv2.saliency.StaticSaliencyFineGrained_create()

cv2.saliency.MotionSaliencyBinWangApr2014_create()

下面我将使用这四种显著性检测算法来检测图片中的显著性区域。

代码结构

├── images

│ ├── barcelona.jpg

│ ├── boat.jpg

│ ├── neymar.jpg

│ └── players.jpg

├── objectness_trained_model [9 entries]

│ ├── ObjNessB2W8HSV.idx.yml.gz

│ ├── ...

├── static_saliency.py

├── objectness_saliency.py

└── motion_saliency.py

images文件夹中是测试图片。

objectness_trained_model是Objectness Saliency算法需要的模型文件。

Static saliency

static_saliency.py使用两种Static saliency算法:cv2.saliency.StaticSaliencySpectralResidual_create()和cv2.saliency.StaticSaliencyFineGrained_create()。使用computeSaliency()计算图片的显著性区域,返回结果是和输入图片一样大小的矩阵,每个像素位置的取值[0,1],值越大表示该像素位置越显著。最后我将返回显著性矩阵可视化出来。

这两种算法的论文:

代码如下:

# USAGE

# python static_saliency.py --image images/neymar.jpg

# import the necessary packages

import argparse

import cv2

# construct the argument parser and parse the arguments

ap = argparse.ArgumentParser()

ap.add_argument("-i", "--image", required=True,

help="path to input image")

args = vars(ap.parse_args())

# args={"image":"images/boat.jpg"}

# load the input image

image = cv2.imread(args["image"])

# initialize OpenCV's static saliency spectral residual detector and

# compute the saliency map

saliency = cv2.saliency.StaticSaliencySpectralResidual_create()

(success, saliencyMap) = saliency.computeSaliency(image)

saliencyMap = (saliencyMap * 255).astype("uint8")

cv2.imshow("Image", image)

cv2.imshow("Output", saliencyMap)

cv2.waitKey(0)

# initialize OpenCV's static fine grained saliency detector and

# compute the saliency map

saliency = cv2.saliency.StaticSaliencyFineGrained_create()

(success, saliencyMap) = saliency.computeSaliency(image)

saliencyMap = (saliencyMap * 255).astype("uint8")

# if we would like a *binary* map that we could process for contours,

# compute convex hull's, extract bounding boxes, etc., we can

# additionally threshold the saliency map

threshMap = cv2.threshold(saliencyMap, 0, 255,

cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

# show the images

cv2.imshow("Image", image)

cv2.imshow("Output", saliencyMap)

cv2.imshow("Thresh", threshMap)

cv2.waitKey(0)

命令行运行:

python static_saliency.py --image images/neymar.jpg

cv2.saliency.StaticSaliencySpectralResidual_create()结果如下:

cv2.saliency.StaticSaliencyFineGrained_create()结果如下:

Objectness

OpenCV使用的算法是:

objectness_saliency.py代码如下:

# USAGE

# python objectness_saliency.py --model objectness_trained_model --image images/barcelona.jpg

# import the necessary packages

import numpy as np

import argparse

import cv2

# construct the argument parser and parse the arguments

ap = argparse.ArgumentParser()

ap.add_argument("-m", "--model", required=True,

help="path to BING objectness saliency model")

ap.add_argument("-i", "--image", required=True,

help="path to input image")

ap.add_argument("-n", "--max-detections", type=int, default=10,

help="maximum # of detections to examine")

args = vars(ap.parse_args())

# load the input image

image = cv2.imread(args["image"])

# initialize OpenCV's objectness saliency detector and set the path

# to the input model files

saliency = cv2.saliency.ObjectnessBING_create()

saliency.setTrainingPath(args["model"])

# compute the bounding box predictions used to indicate saliency

(success, saliencyMap) = saliency.computeSaliency(image)

numDetections = saliencyMap.shape[0]

# loop over the detections

for i in range(0, min(numDetections, args["max_detections"])):

# extract the bounding box coordinates

(startX, startY, endX, endY) = saliencyMap[i].flatten()

# randomly generate a color for the object and draw it on the image

output = image.copy()

color = np.random.randint(0, 255, size=(3,))

color = [int(c) for c in color]

cv2.rectangle(output, (startX, startY), (endX, endY), color, 2)

# show the output image

cv2.imshow("Image", output)

cv2.waitKey(0)

命令行运行:

python objectness_saliency.py --model objectness_trained_model --image images/boat.jpg

结果如下:

Motion saliency

OpenCV使用的算法是:

motion_saliency.py代码如下:

# USAGE

# python motion_saliency.py

# import the necessary packages

from imutils.video import VideoStream

import imutils

import time

import cv2

# initialize the motion saliency object and start the video stream

saliency = None

vs = VideoStream(src=0).start()

time.sleep(2.0)

# loop over frames from the video file stream

while True:

# grab the frame from the threaded video stream and resize it

# to 500px (to speedup processing)

frame = vs.read()

frame = imutils.resize(frame, width=500)

# if our saliency object is None, we need to instantiate it

if saliency is None:

saliency = cv2.saliency.MotionSaliencyBinWangApr2014_create()

saliency.setImagesize(frame.shape[1], frame.shape[0])

saliency.init()

# convert the input frame to grayscale and compute the saliency

# map based on the motion model

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

(success, saliencyMap) = saliency.computeSaliency(gray)

saliencyMap = (saliencyMap * 255).astype("uint8")

# display the image to our screen

cv2.imshow("Frame", frame)

cv2.imshow("Map", saliencyMap)

key = cv2.waitKey(1) & 0xFF

# if the `q` key was pressed, break from the loop

if key == ord("q"):

break

# do a bit of cleanup

cv2.destroyAllWindows()

vs.stop()

命令行运行:

python motion_saliency.py

结果如下:视频显著性检测https://www.zhihu.com/video/1224748542654451712

视觉显著性python_OpenCV中的显著性检测(Saliency Detection)相关推荐

  1. 视觉显著性python_OpenCV—python 图像显著性检测算法—HC/RC/LC/FT

    文章目录 一.显著性检测研究现状 二.基于谱残差法的显著性检测 三.基于全局对比度图像显著性检测(LC) 2.1 基于直方图对比度的显著性检测(HC) 2.2 基于区域的对比度方法(region-ba ...

  2. python视觉识别_视觉显著性python_OpenCV—python 图像显著性检测算法—HC/RC/LC/FT

    文章目录 一.显著性检测研究现状 二.基于谱残差法的显著性检测 三.基于全局对比度图像显著性检测(LC) 2.1 基于直方图对比度的显著性检测(HC) 2.2 基于区域的对比度方法(region-ba ...

  3. 图像显著性论文(四)—Context-Aware Saliency Detection

    一直想默默的学习,不去理会太多东西,但是外界的影响还是蛮大的,各种找工作,实习,自己还待在实验室研究自己喜欢的东西,心情有点浮躁,又想赶快学好后可以亮一下剑,又感觉理论的东西不能太多急躁,要学扎实,还 ...

  4. 显著性检测(saliency detection)评价指标之KL散度距离Matlab代码实现

    步骤1:先定义KLdiv函数: function score = KLdiv(saliencyMap, fixationMap) % saliencyMap is the saliency map % ...

  5. colab中的变量怎么读取_Fizyr Retinanet在Colab中进行目标检测

    colab中的变量怎么读取 by RomRoc 由RomRoc 带有Fizyr Retinanet的Google Colab中的对象检测 (Object Detection in Google Col ...

  6. 视觉显著性 matlab,转载图像/视觉显著性检测技术发展情况梳理(Saliency Detection、Visual Attention)...

    图像/视觉显著性检测技术发展情况梳理(Saliency Detection.Visual Attention) Sason@CSDN 转载:http://blog.csdn.net/anshan198 ...

  7. CVPR2019文章解读 Pyramid Feature Attention Network for Saliency detection 用于显著性检测的金字塔特征注意网络

    Pyramid Feature Attention Network for Saliency detection 摘要 显著性检测是计算机视觉领域的基本挑战之一,怎么有效去提取特征非常关键,目前的一些 ...

  8. 【待更新】感知视频编码中的感知检测技术(显著性物体检测向)

    之前对ROI编码感兴趣,做了显著性检测方面的文献综述.截至到2019年1月13号有13400字. 现在搬上来,一来交流,二来重温 感知视频编码PVC HVS 针对HVS所构建的数学模型分类 基于HVS ...

  9. 显著性检测论文解析2——Visual Saliency Detection Based on Bayesian Model, Yulin Xie, ICIP2011

    最近感觉玩的差不多了,现在准备好好学习了,所以就又开始随便写点,就当是自己学习的笔记.这次要说的的是卢湖川的Visual Saliency Detection Based on Bayesian Mo ...

最新文章

  1. 来了!8月10日19:00商汤全球校招空宣!现场发放专属内推码
  2. SQL Server 2008 R2 中不能删除复制(replication) 的解决方法
  3. C++---汉明距离
  4. Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析
  5. linux halcon 加密狗,不安装HALCON下安装运行版U盘加密狗驱动
  6. java如何使用live2d_小白教程之给网页添加Live2D
  7. 深入理解kafka 电子版
  8. 统计网站页面的访问量
  9. 帝都地铁隧道里的动态广告是什么原理?
  10. 操作符适用的类型整理归纳(Java)
  11. android代码控制组件的移动,Android自定义控件实现随手指移动的小球
  12. 数字图像处理(1)-采样,量化,空间分辨率,灰度级分辨率
  13. 针对AttributeError: ‘tensorflow.python.framework.ops.EagerTensor‘ ....no attribute ‘reshape‘问题的解决办法。
  14. [C++][图]列出连通集
  15. ICCV2021|你以为这是一个填色模型?其实我是检索模型!
  16. Objective-c中的占位符,打印BOOL类型数据
  17. CoppeliaSim添加ROS自定义消息类型
  18. 前端JS如何获取主域名(根域名)
  19. U盘防毒最强方案(创建删不掉的autorun.inf文件夹)
  20. mamp mysql启动失败_MAMP PRO mysql无法启动

热门文章

  1. 一对一直播怎么开发?一对一直播app开发关键点
  2. 每日MySQL之024:FLUSH TABLES
  3. 谷歌广告投放,谷歌广告怎么投放?
  4. 华为路由器联动_华为a1路由器怎么联动Yeelight智能设备
  5. rt3290+linux驱动下载,Ralink雷凌RT3290蓝牙驱动
  6. 逻辑电路 - 或门Or Gate
  7. 如果令 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 分别等于
  8. TiDB 实战优化之 SQL 常见问题与优化案例
  9. 分享一下杭州医院的看病流程(我去的杭州市第三人民医院)
  10. Python3学习(33)--序列和反序列化(二)