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批量重命名同一文件夹下文件的方法
May 25 Python
python使用pycharm环境调用opencv库
Feb 11 Python
对dataframe进行列相加,行相加的实例
Jun 08 Python
Python get获取页面cookie代码实例
Sep 12 Python
python斐波那契数列的计算方法
Sep 27 Python
Python实现带下标索引的遍历操作示例
May 30 Python
解决Python3 控制台输出InsecureRequestWarning问题
Jul 15 Python
python模拟预测一下新型冠状病毒肺炎的数据
Feb 01 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
Mar 02 Python
python 6行代码制作月历生成器
Sep 18 Python
使用python将微信image下.dat文件解密为.png的方法
Nov 30 Python
Python的三个重要函数详解
Jan 18 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+MYSQL会员系统的登陆即权限判断实现代码
2011/09/23 PHP
php微信公众号开发(3)php实现简单微信文本通讯
2016/12/15 PHP
简单JS代码压缩器
2006/10/12 Javascript
从Ajax到JQuery Ajax学习
2007/02/14 Javascript
由Javascript实现的页面日历
2011/11/04 Javascript
JS增加行复制行删除行的实现代码
2013/11/09 Javascript
NodeJS Express框架中处理404页面一个方式
2014/05/28 NodeJs
多个jQuery版本共存的处理方案
2015/03/17 Javascript
jQuery实现简单二级下拉菜单
2015/04/12 Javascript
Windows系统下使用Sublime搭建nodejs环境
2015/04/13 NodeJs
常用的JQuery函数及功能小结
2016/03/24 Javascript
浅析JavaScript中var that=this
2017/02/17 Javascript
canvas 绘制圆形时钟
2017/02/22 Javascript
js实现PC端根据IP定位当前城市地理位置
2017/02/22 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
jquery写出PC端轮播图实例
2018/01/26 jQuery
使用pkg打包Node.js应用的方法步骤
2018/10/19 Javascript
JS使用canvas中的measureText方法测量字体宽度示例
2019/02/02 Javascript
Vue中的验证登录状态的实现方法
2019/03/09 Javascript
使用python Django做网页
2013/11/04 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
2017/04/24 Python
Python语言描述KNN算法与Kd树
2017/12/13 Python
亚马逊印度站:Amazon.in
2017/10/15 全球购物
美国和加拿大房车出售在线分类广告:RVT.com
2018/04/23 全球购物
西班牙多品牌鞋店连锁店:Krack
2018/11/30 全球购物
Simons官方网站:加拿大时尚零售商
2020/02/20 全球购物
servlet面试题
2012/08/20 面试题
求职自荐信怎么写
2014/03/06 职场文书
鉴定评语大全
2014/05/05 职场文书
党员学习群众路线教育实践活动对照检查材料
2014/09/23 职场文书
四风问题党员个人整改措施
2014/10/27 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
经典法律座右铭(50句)
2019/08/15 职场文书
使用Python开发冰球小游戏
2022/04/30 Python
Java Spring Lifecycle的使用
2022/05/06 Java/Android
php解析非标准json、非规范json的方式实例
2022/05/10 PHP