python opencv 直方图反向投影的方法


Posted in Python onFebruary 24, 2018

本文介绍了python opencv 直方图反向投影的方法,分享给大家,具体如下:

目标:

直方图反向投影

原理:

反向投影可以用来做图像分割,寻找感兴趣区间。它会输出与输入图像大小相同的图像,每一个像素值代表了输入图像上对应点属于目标对象的概率,简言之,输出图像中像素值越高的点越可能代表想要查找的目标。直方图投影经常与camshift(追踪算法)算法一起使用。

算法实现的方法,首先要为包含我们感兴趣区域的图像建立直方图(样例要找一片草坪,其他的不要)。被查找的对象最好是占据整个图像(图像里全是草坪)。最好使用颜色直方图,物体的颜色信息比灰度图像更容易被分割和识别。再将颜色直方图投影到输入图像查找目标,也就是找到输入图像中每一个像素点的像素值在直方图中对应的概率,这样就得到一个概率图像,最后设置适当的阈值对概率图像进行二值化。

numpy算法:

建立两幅颜色直方图,目标图像直方图(M),输入图像直方图(I)

import cv2
import numpy as np
from matplotlib import pyplot as plt
#roi图片,就想要找的的图片
roi = cv2.imread('3.jpg')
hsv = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)
#目标搜索图片
target = cv2.imread('33.jpg')
hsvt = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)
#创建直方图
M = cv2.calcHist([hsv],[0,1],None,[180,256],[0,180,0,256])
I = cv2.calcHist([hsvt],[0,1],None,[180,256],[0,180,0,256])

计算比值:R=MI。反向投影R,根据R这个调色板创建新图像,每一个像素代表这个点事目标的概率。例如,B(x,y)=R[h(x,y),s(x,y),其中H为点(x,y)的色调(hue)值,s为点(x,y)的饱和度(saturation)。最后加入条件B(x,y)=min([B(x,y),1]

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

使用圆盘算子做卷积,B=D×B,其中D为卷积核

disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))#定义结构形状,5×5的椭圆
B=cv2.filter2D(B,-1,disc)#对图像进行卷积运算
B = np.uint8(B)
cv2.normalize(B,B,0,255,cv2.NORM_MINMAX)

其中函数cv2.getStructuringElement是定义结构元素,例如element = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5)) 定义了一个十字形,5×5的结构

python opencv 直方图反向投影的方法 

输出图像中灰度最大的地方就是目标位置。如果要找的是一个区域,可以使用一个阈值对图像二值化,这样能得到不错的结果。

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

opencv反向投影

函数 cv2.calcBackProject()直接实现反向投影,参数与cv2.calcHist基本一致。其中一个参数是要查找的目标的直方图。在使用目标直方图反向投赢钱应该进行归一化处理。返回结果是一个概率图像,然后进行圆盘形状卷积操作,再二值化。

roi区域图片

python opencv 直方图反向投影的方法 

待搜索图片

python opencv 直方图反向投影的方法 

结果

python opencv 直方图反向投影的方法

import cv2
import numpy as np
from matplotlib import pyplot as plt
#roi图片,就想要找的的图片
roi = cv2.imread('33.jpg')
hsv = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)

#目标搜索图片
target = cv2.imread('3.jpg')
hsvt = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)

#计算目标直方图
roihist = cv2.calcHist([hsv],[0,1],None,[180,256],[0,180,0,256])
#归一化,参数为原图像和输出图像,归一化后值全部在2到255范围
cv2.normalize(roihist,roihist,0,255,cv2.NORM_MINMAX)
dst = cv2.calcBackProject([hsvt],[0,1],roihist,[0,180,0,256],1)

#卷积连接分散的点
disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
dst = cv2.filter2D(dst,-1,disc)

ret,thresh = cv2.threshold(dst,50,255,0)
#使用merge变成通道图像
thresh = cv2.merge((thresh,thresh,thresh))

#蒙板
res = cv2.bitwise_and(target,thresh)
#矩阵按列合并,就是把target,thresh和res三个图片横着拼在一起
res = np.hstack((target,thresh,res))

cv2.imwrite('res.jpg',res)
#显示图像
cv2.imshow('1',res)
cv2.waitKey(0)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python通过wxPython打开一个音频文件并播放的方法
Mar 25 Python
几个提升Python运行效率的方法之间的对比
Apr 03 Python
python 编码规范整理
May 05 Python
详解python中Numpy的属性与创建矩阵
Sep 10 Python
python RabbitMQ 使用详细介绍(小结)
Nov 08 Python
如何通过Python实现标签云算法
Jul 02 Python
django template实现定义临时变量,自定义赋值、自增实例
Jul 12 Python
python与c语言的语法有哪些不一样的
Sep 13 Python
用python对excel进行操作(读,写,修改)
Dec 25 Python
Pytorch 中的optimizer使用说明
Mar 03 Python
在pycharm中无法import所安装的库解决方案
May 31 Python
Python序列化与反序列化相关知识总结
Jun 08 Python
python爬虫爬取淘宝商品信息
Feb 23 #Python
python爬取淘宝商品详情页数据
Feb 23 #Python
Python如何抓取天猫商品详细信息及交易记录
Feb 23 #Python
python列表生成式与列表生成器的使用
Feb 23 #Python
1分钟快速生成用于网页内容提取的xslt
Feb 23 #Python
python使用xslt提取网页数据的方法
Feb 23 #Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
Feb 23 #Python
You might like
《PHP编程最快明白》第五讲:php目录、文件操作
2010/11/01 PHP
php引用计数器进行垃圾收集机制介绍
2012/09/19 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
php查询mysql数据库并将结果保存到数组的方法
2015/03/18 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
2015/12/25 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
2016/07/18 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
laravel 出现command not found问题的解决方案
2019/10/23 PHP
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
js特殊字符转义介绍
2013/11/05 Javascript
jQuery Easyui实现左右布局
2016/01/26 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
JS、jQuery中select的用法详解
2016/04/21 Javascript
jQuery实现三级菜单的代码
2016/05/09 Javascript
深入探讨Vue.js组件和组件通信
2016/09/12 Javascript
Bootstrap CSS组件之大屏幕展播
2016/12/17 Javascript
bing Map 在vue项目中的使用详解
2018/04/09 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
Postman如何实现参数化执行及断言处理
2020/07/28 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
一文秒懂JavaScript构造函数、实例、原型对象以及原型链
2020/08/25 Javascript
[03:24]CDEC.Y赛前采访 努力备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
[01:02:18]VGJ.S vs infamous Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
跟老齐学Python之再深点,更懂list
2014/09/20 Python
python使用append合并两个数组的方法
2015/04/28 Python
python爬虫爬取微博评论案例详解
2019/03/27 Python
使用TensorBoard进行超参数优化的实现
2020/07/06 Python
python interpolate插值实例
2020/07/06 Python
Django项目创建及管理实现流程详解
2020/10/13 Python
python 实用工具状态机transitions
2020/11/21 Python
购买一个高级域名:BuyDomains
2018/03/11 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
保险公司反洗钱宣传活动总结
2015/05/08 职场文书
名人传读书笔记
2015/06/26 职场文书
MYSQL 无法识别中文的永久解决方法
2021/06/03 MySQL