[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算法相似: 首先找到加权支持度不小于用户指定的最小加权支持度的所有频繁项集加权关联规则,然后使用频繁项集生成所有满足最…

多种语言《九九乘法表》荟萃: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…

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

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

外部中断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 /*************…

[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(附源程序)

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

Android Studio之查找当前类的位置图标没了

1 问题 我们知道在Android studio里面如果想快速看到该文件所在的目录位置&#xff0c;点击这个图标 现在这个图标没了&#xff0c;找不到了 2 解决办法 把下面的Autoscroll from Source的勾去掉就行。

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

一、学习目标 了解如何在图片中加入文字了解如何使用鼠标进行图像绘制 二、了解如何通过鼠标进行图像绘制 2.1 了解putText方法的使用 putText方法接收图像&#xff0c;文字内容&#xff0c; 坐标 &#xff0c;字体&#xff0c;大小&#xff0c;颜色&#xff0c;字体厚度这…

【测绘程序设计】坐标正算神器V1.0(附C/C#/VB源程序)

坐标正算,就是根据直线的边长、坐标方位角和一个端点的坐标,计算直线另一个端点的坐标的工作。本文用C#语言和VB语言实现坐标正算,编写坐标正算神器。 计算实例: 实例1,设直线AB的边长DAB和一个端点A的坐标XA、YA为已知,则直线另一个端点B的坐标为: XB=XA+ΔXAB YB=YA+…

Blazor University (22)路由 —— 定义路由

原文链接&#xff1a;https://blazor-university.com/routing/路由与标准 ASP.NET MVC 一样&#xff0c;Blazor 路由是一种用于检查浏览器 URL 并将其匹配到要呈现的页面的技术。路由比简单地将 URL 匹配到页面更灵活。它允许我们根据文本模式进行匹配&#xff0c;例如&#xf…

Linux文件I/O编程(二)lseek函数

文件I/O编程处理open、read、write、close&#xff0c;等必要函数对文件进行读写操作外&#xff0c;lseek、fcntl也是I/O编程很重要的函数。lseek函数lseek函数主要用来移动当前读写位置&#xff0c;第一个参数是文件描述符fd&#xff0c;第二个参数是偏移距离&#xff0c;第三…

[python opencv 计算机视觉零基础到实战] 十九、简易绘画板制作

一、学习目标 了解事件编写一个简易绘画板 二、了解如何制作简易绘画板 2.1 了解鼠标多种事件 上一节我们简单的使用opencv的图形绘制方法&#xff0c;用鼠标绘制了一些内容。上一节所响应的是简单的双击事件EVENT_LBUTTONDBLCLK&#xff0c;在OpenCV的鼠标事件中还有很多。…

Web App 和 Native App,哪个是趋势?

2019独角兽企业重金招聘Python工程师标准>>> Web App 和 Native App&#xff0c;哪个是趋势&#xff1f; https://www.zhihu.com/question/19558750 WebAPP与原生APP的交互设计区别 http://www.woshipm.com/ucd/132869.html Web App 开发使用哪种框架比较好&#xf…

基于天地图的应用服务系统设计开发—以甘肃高校招生服务为例

“天地图”是国家测绘地理信息局建设的地理信息综合服务网站。它是“数字中国”的重要组成部分,是国家地理信息公共服务平台的公众版。“天地图”的目的在于促进地理信息资源共享和高效利用,提高测绘地理信息公共服务能力和水平,改进测绘地理信息成果的服务方式,更好地满足…

查缺补漏系统学习 EF Core 6 - 修改实体数据

推荐关注「码侠江湖」加星标&#xff0c;时刻不忘江湖事这是 EF Core 系列的第六篇文章&#xff0c;上一篇文章讲述了 EF Core 中的原始 SQL 语句查询。这篇文章讲一讲 EF Core 如何修改实体数据。点击上方或后方蓝字&#xff0c;阅读 EF Core 系列合集。实体状态在开始学习 EF…

情人节,我表白了CSDN小姐姐后,竟然...【为表白写了一个绘图工具,让我不再手残】

情人节&#xff0c;我表白了CSDN小姐姐后&#xff0c;竟然…竟然有人看了这篇文。 以下图片素材由一个还没写完的工具绘制&#xff0c;稍后会放在CSDN的代码仓库&#xff08;现在能用了&#xff0c;还没时间改&#xff0c;颜色填充算法还没写&#xff0c;有能力的朋友可以修改一…

【小程序】刘一哥课堂随机点名提问神器V1.0(附源程序)

为了能让我们的孩子们尽量来教室上课,增强课堂的参与度,激发课堂激情,提高学习效率,一哥也是煞费苦心,于是开发出了这么一款课堂点名提问神器,跟大家分享一下。 打开神器,看到的界面是这样子的,我很感激有勇气按时起床并能到教室的每一位有志之士。 点击【开始】按钮,…

Git客户端TortoiseGit(Windows系统)的使用方法

本文环境&#xff1a; 操作系统&#xff1a;Windows XP SP3 Git客户端&#xff1a;TortoiseGit-1.8.8.0-32bit 一、安装Git客户端 全部安装均采用默认&#xff01; 1. 安装支撑软件 msysgit: https://code.google.com/p/msysgit/downloads/list?qfullinstallerofficialgit 当前…

.Net 在容器中操作宿主机

1方案描述 在 docker 容器中想操作宿主机&#xff0c;一般会使用 ssh 的方式&#xff0c;然后 .Net 通过执行远程 ssh 指令来操作宿主机。本文将使用 交互式 .Net 容器版 中提供的镜像演示 .Net 在容器中如何操作宿主机。2前期准备 1. 宿主机上生成 ssh key生成 ss…