目标

在本章中,我们将学习直方图反投影。

理论

这是由Michael J. SwainDana H. Ballard在他们的论文《通过颜色直方图索引》中提出的。

用简单的话说是什么意思?它用于图像分割或在图像中查找感兴趣的对象。简而言之,它创建的图像大小与输入图像相同(但只有一个通道),其中每个像素对应于该像素属于我们物体的概率。用更简单的话来说,与其余部分相比,输出图像将在可能有对象的区域具有更多的白色值。好吧,这是一个直观的解释。(我无法使其更简单)。直方图反投影与camshift算法等配合使用。

我们该怎么做呢?我们创建一个图像的直方图,其中包含我们感兴趣的对象(在我们的示例中是背景,离开播放器等)。对象应尽可能填充图像以获得更好的效果。而且颜色直方图比灰度直方图更可取,因为对象的颜色对比灰度强度是定义对象的好方法。然后,我们将该直方图“反投影”到需要找到对象的测试图像上,换句话说,我们计算出属于背景的每个像素的概率并将其显示出来。在适当的阈值下产生的输出使我们仅获得背景。

Numpy中的算法

1.首先,我们需要计算我们要查找的对象(使其为“ M”)和要搜索的图像(使其为“ I”)的颜色直方图。

import numpy as np
import cv2 as cvfrom matplotlib import pyplot as plt
#roi是我们需要找到的对象或对象区域
roi = cv.imread('rose_red.png')
hsv = cv.cvtColor(roi,cv.COLOR_BGR2HSV)
#目标是我们搜索的图像
target = cv.imread('rose.png')
hsvt = cv.cvtColor(target,cv.COLOR_BGR2HSV)
# 使用calcHist查找直方图。也可以使用np.histogram2d完成
M = cv.calcHist([hsv],[0, 1], None, [180, 256], [0, 180, 0, 256] )
I = cv.calcHist([hsvt],[0, 1], None, [180, 256], [0, 180, 0, 256] )

2求出比值。然后反向投影R,即使用R作为调色板,并以每个像素作为其对应的目标概率创建一个新图像。即B(x,y) = R[h(x,y),s(x,y)] 其中h是色调,s是像素在(x,y)的饱和度。之后,应用条件B(x,y) = min[B(x,y), 1]。

h,s,v = cv.split(hsvt)
B = R[h.ravel(),s.ravel()]
B = np.minimum(B,1)
B = B.reshape(hsvt.shape[:2])

3.现在对圆盘应用卷积,B=D∗B,其中D是圆盘内核。

disc = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
cv.filter2D(B,-1,disc,B)
B = np.uint8(B)
cv.normalize(B,B,0,255,cv.NORM_MINMAX)

4.现在最大强度的位置给了我们物体的位置。如果我们期望图像中有一个区域,则对合适的值进行阈值处理将获得不错的结果。

ret,thresh = cv.threshold(B,50,255,0) 

就是这样!!

OpenCV的反投影

OpenCV提供了一个内建的函数cv.calcBackProject()。它的参数几乎与cv.calchist()函数相同。它的一个参数是直方图,也就是物体的直方图,我们必须找到它。另外,在传递给backproject函数之前,应该对对象直方图进行归一化。它返回概率图像。然后我们用圆盘内核对图像进行卷积并应用阈值。下面是我的代码和结果:

import numpy as np
import cv2 as cv
roi = cv.imread('rose_red.png')
hsv = cv.cvtColor(roi,cv.COLOR_BGR2HSV)
target = cv.imread('rose.png')
hsvt = cv.cvtColor(target,cv.COLOR_BGR2HSV)
# 计算对象的直方图
roihist = cv.calcHist([hsv],[0, 1], None, [180, 256], [0, 180, 0, 256] )
# 直方图归一化并利用反传算法
cv.normalize(roihist,roihist,0,255,cv.NORM_MINMAX)
dst = cv.calcBackProject([hsvt],[0,1],roihist,[0,180,0,256],1)
# 用圆盘进行卷积
disc = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
cv.filter2D(dst,-1,disc,dst)
# 应用阈值作与操作
ret,thresh = cv.threshold(dst,50,255,0)
thresh = cv.merge((thresh,thresh,thresh))
res = cv.bitwise_and(target,thresh)
res = np.vstack((target,thresh,res))
cv.imwrite('res.jpg',res)

以下是我处理过的一个示例。我将蓝色矩形内的区域用作示例对象,我想提取整个地面。

附加资源

1."Indexing via color histograms", Swain, Michael J. , Third international conference on computer vision,1990.

☆☆☆为方便大家查阅,小编已将OpenCV-Python专栏文章统一整理到公众号底部菜单栏,同步更新中,关注公众号,点击左下方“文章”,如图:

或点击下方“阅读原文”,进入OpenCV-Python专栏,即可查看系列文章。

不断更新资源

获取更多精彩

长按二维码扫码关注

OpenCV系列之直方图4:直方图反投影 | 二十九相关推荐

  1. pythonhistogram教程_OpenCV-Python 直方图-4:直方图反投影 | 二十九

    目标 在本章中,我们将学习直方图反投影. 理论 这是由Michael J. Swain和Dana H. Ballard在他们的论文<通过颜色直方图索引>中提出的. 用简单的话说是什么意思? ...

  2. OpenCV系列之轮廓:更多属性 | 二十四

    目标 在本章中,我们将学习 凸性缺陷以及如何找到它们 查找点到多边形的最短距离 匹配不同的形状 理论和代码 1. 凸性缺陷 我们看到了关于轮廓的第二章的凸包.从这个凸包上的任何偏差都可以被认为是凸性缺 ...

  3. OpenCV C++案例实战二十九《遥感图像分割》

    OpenCV C++案例实战二十九<遥感图像分割> 前言 一.准备数据 二.K-Means分类 三.效果显示 四.源码 总结 前言 本案例基于k-means机器学习算法进行遥感图像分割.主 ...

  4. Debezium报错处理系列之二十九:Make sure that an instance of SQL Server is running on the host and accepting TCP

    Debezium报错处理系列之二十九:Make sure that an instance of SQL Server is running on the host and accepting TCP ...

  5. 2021年大数据Hadoop(二十九):​​​​​​​关于YARN常用参数设置

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 关于yarn常用参数设置 设置container分配最小内 ...

  6. SAP UI5 应用开发教程之二十九 - SAP UI5 的路由和导航功能介绍试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  7. FreeSql (二十九)Lambda 表达式

    FreeSql 支持功能丰富的表达式函数解析,方便程序员在不了解数据库函数的情况下编写代码.这是 FreeSql 非常特色的功能之一,深入细化函数解析尽量做到满意,所支持的类型基本都可以使用对应的表达 ...

  8. CSDN 编程竞赛二十九期题解

    竞赛总览 CSDN 编程竞赛二十九期:比赛详情 (csdn.net) 竞赛题解 题目1.订班服 小A班级订班服了!可是小A是个小糊涂鬼,整错了好多人的衣服的大小.小A只能自己掏钱包来补钱了.小A想知道 ...

  9. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十九:LCD模块

    实验二十九:LCD模块 据说Alinx 301支持 7"TFT,好奇的朋友一定疑惑道,它们3.2"TFT以及7"TFT等两者之间究竟有何区别呢?答案很简单,前者自带控制器 ...

最新文章

  1. inux 下查看服务器负载均衡
  2. java b2b2c开源商城系统源码
  3. 第4章 DHCP服务
  4. Google Chrome Source Code 源码下载
  5. mysql搜索_mysql 几种搜索引擎的比较
  6. SparkStreaming
  7. IDEA svn 菜单不见了,解决方法
  8. linux 中常用安装配置
  9. S3C2440上LCD驱动(FrameBuffer)实例开发讲解
  10. 什么相片可以两张弄成一张_怎么将两张图片合成一张?
  11. 计算机专业大二还学微积分吗,大学最容易挂科的专业,计算机专业绝对排得上前三,其他专业呢?...
  12. 七夕怕被偷窥?摄像头探测器来帮您!
  13. 举个栗子!Tableau技巧(96):离线激活和停用 Linux 版 Tableau Server
  14. RK987蓝牙键盘使用说明书分享
  15. 排列(Permutation) 组合(Combination)
  16. android硬解码
  17. 1064:奥运奖牌计数(C C++)
  18. 字符串哈希--聪聪的加法等式
  19. SpringMVC重定向与请求转发
  20. Flask-2进阶,结合前端篇

热门文章

  1. 千万级分拣平台API安全治理实战
  2. 修改CentOS7系统时间EDT为CST【一篇就够】
  3. 微信小程序学习记录(一)
  4. tcp option
  5. 首个国产脑外科手术机器人获批准产,王田苗教授指导打造
  6. KingbaseES V8R3(人大金仓)基于Windows的安装文档
  7. 滴滴谋变:国内“关停并转”非主业,国外加码外卖等业务
  8. PICE(1):Programming In Clustered Environment - 集群环境内编程模式
  9. 镭热激光教你怎样区分光纤激光打标机
  10. 俄语视频教程-很多学科