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使用正则表达式分析网页中的图片并进行替换的方法
Mar 26 Python
python中split方法用法分析
Apr 17 Python
Python合并多个装饰器小技巧
Apr 28 Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
Aug 18 Python
对python append 与浅拷贝的实例讲解
May 04 Python
pandas 空的dataframe 插入列名的示例
Oct 30 Python
对Python信号处理模块signal详解
Jan 09 Python
python-django中的APPEND_SLASH实现方法
Jun 21 Python
初学者学习Python好还是Java好
May 26 Python
Python基础详解之邮件处理
Apr 28 Python
如何解决.cuda()加载用时很长的问题
May 24 Python
python数据可视化使用pyfinance分析证券收益示例详解
Nov 20 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
关于Intype一些小问题的解决办法
2008/03/28 PHP
php 接口类与抽象类的实际作用
2009/11/26 PHP
PHP 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
2016/04/07 PHP
php格式文件打开的四种方法
2018/02/24 PHP
关于恒等于(===)和非恒等于(!==)
2007/08/20 Javascript
JavaScript 替换Html标签实现代码
2009/10/14 Javascript
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
Js实现双击鼠标自动滚动屏幕的示例代码
2013/12/14 Javascript
JS倒计时代码汇总
2014/11/25 Javascript
js实现卡片式项目管理界面UI设计效果
2015/12/08 Javascript
全面了解javascript三元运算符
2016/06/27 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
JS 组件系列之BootstrapTable的treegrid功能
2017/06/16 Javascript
BackBone及其实例探究_动力节点Java学院整理
2017/07/14 Javascript
Vue.js2.0中的变化小结
2017/10/24 Javascript
Webpack 之 babel-loader文件预处理器详解
2018/03/23 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
JS封装的模仿qq右下角消息弹窗功能示例
2018/08/22 Javascript
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
python判断字符串是否纯数字的方法
2014/11/19 Python
Python获取当前页面内所有链接的四种方法对比分析
2017/08/19 Python
python机器学习库常用汇总
2017/11/15 Python
python实现闹钟定时播放音乐功能
2018/01/25 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
2019/11/07 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
2020/04/08 Python
CSS3实现头像旋转效果
2017/03/13 HTML / CSS
Book Depository欧盟:一家领先的国际图书零售商
2019/05/21 全球购物
亚洲领先的旅游体验市场:Voyagin
2019/11/23 全球购物
民主评议党员总结
2014/10/20 职场文书
违反学校规则制度检讨书
2015/01/01 职场文书
2015年社区统计工作总结
2015/04/21 职场文书
公司费用报销管理制度
2015/08/04 职场文书
创业计划书之健康营养产业
2019/10/15 职场文书
祝福语集锦:送给毕业同学祝福语
2019/11/21 职场文书