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中marshal对象序列化的相关知识
Jul 01 Python
Python环境下搭建属于自己的pip源的教程
May 05 Python
tensorflow建立一个简单的神经网络的方法
Feb 10 Python
python获取文件路径、文件名、后缀名的实例
Apr 23 Python
python实现机器学习之元线性回归
Sep 06 Python
python引入不同文件夹下的自定义模块方法
Oct 27 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
Jan 13 Python
关于初始种子自动选取的区域生长实例(python+opencv)
Jan 16 Python
Python如何将模块打包并发布
Aug 30 Python
python判断all函数输出结果是否为true的方法
Dec 03 Python
python3实现无权最短路径的方法
May 12 Python
安装pytorch时报sslerror错误的解决方案
May 17 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页面跳转代码 输入网址跳转到你定义的页面
2013/03/28 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
详解Laravel设置多态关系模型别名的方式
2019/10/17 PHP
JQuery select标签操作代码段
2010/05/16 Javascript
javascript 3d 逐侦产品展示(核心精简)
2014/03/26 Javascript
完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
2014/12/17 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
简介AngularJS的HTML DOM支持情况
2015/06/17 Javascript
JavaScript判断表单中多选框checkbox选中个数的方法
2015/08/17 Javascript
JS实现仿FLASH效果的竖排导航代码
2015/09/15 Javascript
JS功能代码集锦
2016/05/04 Javascript
js创建数组的简单方法
2016/07/27 Javascript
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
2018/08/09 Javascript
Nodejs中的JWT和Session的使用
2018/08/21 NodeJs
Vue点击切换颜色的方法
2018/09/13 Javascript
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
在Python中操作字符串之startswith()方法的使用
2015/05/20 Python
Python3.x对JSON的一些操作示例
2017/09/01 Python
如何以Winsows Service方式运行JupyterLab
2020/08/30 Python
详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
2021/01/24 Python
使用phonegap查找联系人的实现方法
2017/03/31 HTML / CSS
公积金单位接收函
2014/01/11 职场文书
户外拓展活动方案
2014/02/11 职场文书
小学安全汇报材料
2014/08/14 职场文书
我们的节日国庆活动方案
2014/08/19 职场文书
中队活动总结
2014/08/27 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
出纳年终工作总结2014
2014/12/05 职场文书
基层党支部承诺书
2015/04/30 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
检讨书怎么写?
2019/06/21 职场文书
申论不会写怎么办?教您掌握这6点思维和原则
2019/07/17 职场文书
Java服务调用RestTemplate与HttpClient的使用详解
2022/06/21 Java/Android