[python opencv 计算机视觉零基础到实战] 十五 直方图反向投影

一、学习目标

  1. 了解了直方图反向投影的一般流程
  2. 了解2D直方图的使用

如有错误欢迎指出~

二、了解直方图反向投影

2.1 了解2D直方图

需要对直方图进行反向投影,需要使用2D直方图。2D直方图需要使用calcHist方法。calcHist方法在前两节中已经有了解,现在再来复习一下。首先我们查看calcHist方法的原型。

calcHist(images; channels; mask; histSize; ranges[; hist[; accumulate]])

calcHist方法中images参数为所需要传入的图像,接受类型为uint8以及float32,参入参数时可以使用[]对参数进行标记;
channels为传入的通道数;
mask为一个遮罩,如果为None则表示对全图进行操作,若选择其中一个部分就需要制作一个遮罩对局部进行操作;
histSize为一个范围,或者说是BIN的数目;
ranges表示像素值范围。

我们要绘制一个颜色直方图的话,需要对BGR色彩空间进行转换,转换为HSV:

import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

随后我们使用calcHist方法传入数值,这个时候channels应该为[0,1],mask我们依旧为None,因为我们需要处理全图;而histSize则表示了两个通道,H以及S,所以应该写成[180,256],即H通道为180,S通道为256,最后一个range则为[0,180,0,256],表示H取值范围在和S的取值范围。那么整体的代码如下:

import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)hist = cv2.calcHist([hsv], [0,1], None, [180,256], [0,180,0,256])plt.imshow(hist, interpolation='nearest')
plt.show()

结果如下:

2.2 了解直方图反向投影

直方图反向投影可以在图像中找到我们感应区的部分,直方图反向投影将会输出模板图像中类似的部分,越亮的的部分则表示得越白。我们需要完成这个操作首先得有一张需要查找的对象,随后需要一张图为查找区域。我们可以先对需要查找目标的图像创建一个直方图,随后进行归一化处理。归一化处理使用normalize方法。
首先我们进行读取图片与转换HSV色彩空间图,也顺带一起读取目标扫描的图片,原图和目标图、代码如下:
原图:

目标图:

roi = cv2.imread(r'C:\Users\mx\Desktop\gz\roi.png')
hsv_roi = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)
target = cv2.imread(r'C:\Users\mx\Desktop\gz\4.png')
hsv_target = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)

随后对hsv_roi 感兴趣的部分进行2D直方图处理:

roihist = cv2.calcHist([hsv_roi],[0, 1], None, [180, 256], [0, 180, 0, 256] )

接下来使用normalize方法进行归一化;归一化是将数据达到一种可进行对比的标准,但是保持了原有数据间的关系。代码为:

cv2.normalize(roihist,roihist,0,255,cv2.NORM_MINMAX)

其中roihist为输入数据,roihist为与src大小相同的输出数据,0为一个范围低边界,255为范围的上限,cv2.NORM_MINMAX是一个归一化的方法,表示对数组的所有值进行转化,使值的映射在最小值和最大值之间。这样归一化后他们的值就在0到255之间了。接着我们使用calcBackProject方法,calcBackProject方法与calcHist的参数类似。 cvCalcBackProject 用于计算直方图的反向投影,得到的结果是数组在某个分布下的概率。

dst = cv2.calcBackProject([hsv_target],[0,1],roihist,[0,180,0,256],1) 

随后使用getStructuringElement方法进行卷积,把分散点连接:

gSEE = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
dst=cv2.filter2D(dst,-1,gSEE)

接着使用阀值方法:

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

最后进行合并:

trh = cv2.merge((trh,trh,trh))

完整代码如下:

import cv2
import numpy as np
from matplotlib import pyplot as pltroi = cv2.imread(r'C:\Users\mx\Desktop\gz\roi.png')
hsv_roi = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)
target = cv2.imread(r'C:\Users\mx\Desktop\gz\4.png')
hsv_target = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)roihist = cv2.calcHist([hsv_roi],[0, 1], None, [180, 256], [0, 180, 0, 256] )
cv2.normalize(roihist,roihist,0,255,cv2.NORM_MINMAX)
dst = cv2.calcBackProject([hsv_target],[0,1],roihist,[0,180,0,256],1)
gSEE = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
dst=cv2.filter2D(dst,-1,gSEE)
ret,trh = cv2.threshold(dst,50,255,0)
trh = cv2.merge((trh,trh,trh))
cv2.imshow('trh',trh)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如下:

当然我们也可以进行位运算,这样我们就可以取出颜色部分了,所有完整代码如下:

import cv2
import numpy as np
from matplotlib import pyplot as pltroi = cv2.imread(r'C:\Users\mx\Desktop\gz\roi.png')
hsv_roi = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)
target = cv2.imread(r'C:\Users\mx\Desktop\gz\4.png')
hsv_target = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)roihist = cv2.calcHist([hsv_roi],[0, 1], None, [180, 256], [0, 180, 0, 256] )
cv2.normalize(roihist,roihist,0,255,cv2.NORM_MINMAX)
dst = cv2.calcBackProject([hsv_target],[0,1],roihist,[0,180,0,256],1)
gSEE = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
dst=cv2.filter2D(dst,-1,gSEE)ret,trh = cv2.threshold(dst,50,255,0)
trh = cv2.merge((trh,trh,trh))
cv2.imshow('trh',trh)
res = cv2.bitwise_and(target,trh)
cv2.imwrite('res.jpg',res)
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如下:

我们也可以换一下图:
roi:

目标:

结果:

该系列首发于ebaina

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关联规则java代码_重量挖掘关联规则挖掘方法,哪个大神可以将以下伪代码转换为Java代码?...

重量挖掘关联规则挖掘方法,哪个大神可以将以下伪代码转换为Java代码? 10改进的加权关联规则算法的基本步骤与Apriori算法相似: 首先找到加权支持度不小于用户指定的最小加权支持度的所有频繁项集加权关联规则,然后使用频繁项集生成所有满足最…

Boostrap ZURB Foundation —— Web开发前端框架

webflow:Webflow 允许设计师通过自由的拖拉拽与 CSS 类互动,而定义它们的过程无需写任何一行代码。用户在完成从设计到 CSS 构架之后,甚至可以在线直接将建好的网页发布,而不需要导出代码到其他发布工具上。类似的这些 B2D 市场&a…

Git之HEAD和origin

1 问题 我们经常看见git相关操作里面看到HEAD和origin这些专业名称,它娘的到底什么意思。 2 解释 1)HEAD git 中的分支,本质上仅仅是个指向 commit 对象的可变指针, HEAD 是一个特别指针,它是一个指向你正在工作中的…

如何离线安装chrome插件

如何离线安装chrome插件 本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/p/6838852.html,如需转载请自行联系原作者

多种语言《九九乘法表》荟萃:C、C++、C#、JavaScript、SQL、VB、VBA、Python

九九乘法表对于我们学习循环结构,尤其是双重循环特别有帮助,本文演示用C、C++、C#、HTML、SQL、VB、VBA、Python等多种语九九乘法表。 一、C语言 #include<stdio.h> main() {int i,j;for(i=1;i<=9;i++){for(j=1;j<=i;j++){printf("%d*%d=%d\t",j,i,i*j…

Git之删除远程分支

1 问题 在工作区间删除远程分支 2 删除命令 git push origin --delete name

iptables (2) 基本配置

iptables 基本命令使用举例 一、链的基本操作 1、清除所有的规则。1&#xff09;清除预设表filter中所有规则链中的规则。# iptables -F -F, --flush [chain]Flush the selected chain (all the chains in the table if none is given). This is equivalent to deleting all …

[python opencv 计算机视觉零基础到实战] 十六、用opencv画画

一、学习目标 了解如何使用line方法了解如何使用rectangle方法了解如何使用ellipse方法 如有错误欢迎指出~ 二、了解OpenCV的绘图方法 2.1 了解直线绘图方法 我们在前两节中有了解使用OpenCV中的矩形绘制&#xff0c;接下来我们了解一下更多的图形绘制方法。我们在OpenCV中…

基于.NetCore开发博客项目 StarBlog - (5) 开始搭建Web项目

系列文章基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客&#xff1f;基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目基于.NetCore开发博客项目 StarBlog - (3) 模型设计基于.NetCore开发博客项目 StarBlog - (4) markdown博客批量导入基于.N…

java计算每个元素出现的百分比_Java程序计算百分比

百分数表示百分数(百)&#xff0c;即百分数与100之比。百分数的符号为&#xff05;。我们通常会计算获得的商标&#xff0c;投资回报率等百分比。该百分比也可以超过100&#xff05;。例如&#xff0c;假设我们有总数和一部分。所以我们说那一部分占总数的百分之几&#xff0c;…

ECShop 前台用户中心调整左侧栏目及中心部分呈现页面

1、首先调整用户中心左侧栏目&#xff0c;在 .dwt 里面我修改了半天&#xff0c;页面没改动。。后来某大神说这个是在另一个文件里&#xff1a;/themes/你用的模板目录/library/user_menu.lbi 文件改一个试试吧~ 不出意外的成功了吧2、中心部分呈现内容的调整。&#xff08;今天…

【测绘程序设计】高斯克吕格投影:带号及中央经度计算神器V1.0(附源程序)

【问题描述】:很多情况下,我们知道某一地点的坐标(经纬度),需要计算其在高斯克吕格投影中的带号及中央经度。关于该问题,有具体的公式可言,只是计算过程稍微繁琐一些,当然啦,我们可以写程序来解决,谁叫我们是名副其实的GISer呢?另外,这些复杂的计算过程还是交给计算…

外部中断0(含知识点)

1 #include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h>2 #include "stm32f10x_gpio.h"3 #include "stm32f10x_exti.h"4 #include "misc.h"5 6 /*外部中断配置*/7 8 9 int main(void)10 {11 /*************…

Git之tag

1 tag相关命令 1) 打上tag git tag v1.0.0 git tag -a v1.0.0 -m info 2) 查看tag git tag 3) 切换tag git checkout tagname 4) 删除tag git tag -d v1.0.0 5) 推送远程 推送单个tag git push origin v1.0.0 推送所有tag git push origin --tags

[python opencv 计算机视觉零基础到实战] 十七、用鼠标画画

一、学习目标 了解长轴和短轴参数了解旋转角度参数了解起始角度参数了解终止角度参数 二、深入了解OpenCV的ellipse方法 2.1 纵横 椭圆的绘制方法在上一节中我们已经知道了是使用ellipse&#xff0c;ellipse的函数原型如下&#xff0c;为了清晰认识ellipse方法&#xff0c;…

Microsoft Build 2022 到来,开发者们做好准备了吗?

Microsoft Build 2022 将会在5月24日 - 5月26日正式举行&#xff0c;作为开发者的你是否和我一样期待本次的 Build&#xff0c;它会带来什么的技术革新以及黑科技呢&#xff1f;下面我就针对今年 Build 的几个主题结合相关技术来谈谈我对 Build 的期待。开发技术和相关工具今年…

【测绘程序设计】视距测量神器V1.0(附源程序)

神器预览: 一、视距测量概念 视距测量是利用水准仪的望远镜内十字丝分划板上的视距丝在视距尺(水准尺)上读数,根据光学和几何学原理,同时测定仪器到地面点的水平距离和高差的一种方法。 视距测量具有操作简便、速度快、不受地面起伏变化的影响的优点,被广泛应用于碎部测…

补作业:随机生成二元四则运算

四则运算代码如下&#xff0c;基础不好&#xff0c;刚完成作业&#xff0c;希望老师多给点平时成绩&#xff0c;谢谢老师&#xff01;#include<stdio.h>#include<stdlib.h>#include<time.h>int right0,wrong0;int a,b,c,d;/*加法运算*/void add(){int i,j;fo…

java 从数据库取值_java 连接数据库取值问题

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletException{//TODOAuto-generatedmethodstubXzdatasqlToolnewXzdata();//初始化并...public void doGet(HttpServletRequest request,HttpServletResponse response) throws I…

条件表达式

1.python中&#xff1a; a 1b 2 if a>1 else 3 2.C语言中&#xff1a;max (a>b)?a:b; 说明&#xff1a;条件运算符优先于赋值运算符 也可以这样写&#xff1a;a>b? a:c>d? c:d / a>b? (a100):(b100)转载于:https://www.cnblogs.com/yjw9520/p/4841301.ht