OpenCV-Python(22):直方图反向投影

引言

        直方图反向投影是一种基于图像颜色分布的图像处理技术,它通过计算图像中不同区域的颜色直方图,并将其与目标区域的直方图进行比较,从而实现目标的识别和分割。本文将介绍直方图反向投影的原理和应用,并探讨其在计算机视觉任务中的重要性。

原理

        直方图反向投影的原理是基于颜色分布的统计学特征。首先,选择感兴趣的目标区域,计算该区域的颜色直方图,得到不同颜色的像素数量。然后,对整个图像计算颜色直方图。接下来,归一化目标区域的直方图和整个图像的直方图,使它们具有相同的尺度。最后,对于每个像素,计算它在归一化目标区域直方图中的概率,并将其映射到图像中,形成反向投影图像。

步骤及应用

直方图反向投影是一种图像处理技术,用于根据图像的颜色分布来识别感兴趣的目标区域。它基于图像的直方图和目标区域的直方图之间的相似性来进行识别。

具体步骤如下:
1.创建目标区域的直方图:首先选择感兴趣的目标区域,然后计算该区域的颜色直方图。颜色直方图是对图像中每个像素的颜色进行统计,得到不同颜色的像素数量。

2.计算整个图像的直方图:对整个图像计算颜色直方图。

3.归一化直方图:将目标区域的直方图和整个图像的直方图进行归一化,使它们具有相同的尺度。

4.计算反向投影图像:对于每个像素,计算它在归一化目标区域直方图中的概率。这可以通过将像素的颜色值映射到直方图的bin来实现。

5.根据反向投影图像进行目标识别:根据反向投影图像的结果,可以使用阈值或其他分割算法来分割出目标区域。

        直方图反向投影在计算机视觉任务中具有广泛的应用。它可以用于图像分割,通过识别目标区域的颜色分布,将目标从背景中分割出来。此外,直方图反向投影还可以用于目标检测和跟踪。通过比较图像中不同区域的颜色分布,可以实现目标的快速检测和准确跟踪。

优势

与传统的基于边缘或纹理的图像处理技术相比,直方图反向投影具有以下优势:

  • 不受光照变化的影响:由于直方图反向投影是基于颜色分布的统计特征,因此它相对于光照变化具有较强的鲁棒性。
  • 简单而高效:直方图反向投影的实现相对简单,计算速度较快,适用于实时应用。
  • 适用性广泛:直方图反向投影可以应用于不同类型的图像,包括自然图像、医学图像和遥感图像等。

Numpy算法实现

        首先,我们需要先创建两幅颜色直方图,待搜索目标图像的直方图'M',输入图像的直方图'I'。

import cv2
import numpy as np
from matplotlib import pyplot as plt
#roi is the object or region of object we need to find
roi = cv2.imread('rose_red.png')
hsv = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)
#target is the image we search in
target = cv2.imread('rose.png')
hsvt = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)
# Find the histograms using calcHist. Can be done with np.histogram2d also
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] )

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))
B=cv2.filter2D(B,-1,disc)
B = np.uint8(B)
cv2.normalize(B,B,0,255,cv2.NORM_MINMAX)

 现在找出图像中灰度值最大的地方就是我们要查找的目标的位置了。如果我们要找的是一个区域,我们就可以使用一个阈值对图像进行二值化,这样就可以得到一个很好的结果了。

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

OpenCV算法实现 

        OpenCV中使用cv2.calcBackProject()函数用于直方图反向投影实现。它的语法如下:

backProj = cv2.calcBackProject(images, channels, hist, ranges, scale)

参数说明:

  • images:输入图像,可以是单张图像或图像列表。
  • channels:指定用于计算直方图的通道列表。通道的索引从0开始。
  • hist:目标区域的归一化直方图。
  • ranges:每个通道的取值范围。
  • scale:反向投影结果的缩放因子。

返回值:

  • backProj:直方图反向投影结果。

cv2.calcBackProject()函数的原理是通过计算输入图像中每个像素点在归一化直方图中的概率,并将其映射到反向投影图像中。这样,反向投影图像中的每个像素点表示该像素点属于目标区域的概率。使用cv2.calcBackProject()函数时,通常需要先计算目标区域直方图,可以使用cv2.calcHist()函数来计算直方图。然后,通过对输入图像应用cv2.calcBackProject()函数,可以得到反向投影图像。反向投影图像可以用于目标检测、图像分割和跟踪等应用。

需要注意的是,cv2.calcBackProject()函数的输入图像和目标区域的直方图应该具有相同的色彩空间和维度。此外,通常还需要对反向投影图像进行阈值化或二值化处理,以便更好地分割目标区域。

        下面是我使用的一幅图像进行的示例展示。我使用图中蓝色矩形中的区域作为取样对象,再根据这个样本搜索图中所有的类似区域(草地)。

import cv2
import numpy as np
roi = cv2.imread('tar.jpg')
hsv = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)
target = cv2.imread('roi.jpg')
hsvt = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)
# calculating object histogram
roihist = cv2.calcHist([hsv],[0, 1], None, [180, 256], [0, 180, 0, 256] )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)
# threshold and binary AND
ret,thresh = cv2.threshold(dst,50,255,0)thresh = cv2.merge((thresh,thresh,thresh))
# 按位操作
res = cv2.bitwise_and(target,thresh)
res = np.hstack((target,thresh,res))
cv2.imwrite('res.jpg',res)
# 显示图像
cv2.imshow('1',res)
cv2.waitKey(0)

结论

         直方图反向投影是一种基于颜色分布的图像处理技术,通过计算图像中不同区域的颜色直方图,并将其与目标区域的直方图进行比较,实现目标的识别和分割。它在图像分割、目标检测和跟踪等计算机视觉任务中具有广泛的应用。直方图反向投影相对于传统的图像处理技术具有许多优势,如不受光照变化的影响、简单高效以及适用性广泛。因此,直方图反向投影在计算机视觉领域具有重要的研究和应用价值。

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

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

相关文章

计算机毕业设计选题分享-Springboot在线问诊系统00211(赠送源码数据库)JAVA、PHP,node.js,C++、python,大屏数据可视化等

Springboot在线问诊系统 摘 要 针对医院门诊等问题,对在线问诊进行研究分析,然后开发设计出在线问诊系统以解决问题。在线问诊系统主要功能模块包括首页、轮播图管理、公告信息管理、资源管理、系统用户管理(管理员、患者用户、医生用户&…

新产品推广选品牌外包广州迅腾文化传播多渠道传播能力

在当今激烈的市场竞争中,新产品推广已成为企业发展的关键。选择具备多渠道传播能力的品牌外包服务提供商,有助于快速提升品牌知名度和市场占有率。作为行业领先者,迅腾文化凭借卓越的多渠道传播能力,成为企业新产品推广的理想合作…

2023年的收获与成长

时光荏苒,转眼间我们已告别2023年。 回首过去的一年,我经历了许多挑战和变化,不仅见证了我的店铺在经营上的成果,也在身体健康和自媒体方面迎来了新的突破。 通过一系列的努力和坚持,我在不同领域都有了令人满意的收获…

Docker 从入门到实践:Docker介绍

前言 在当今的软件开发和部署领域,Docker已经成为了一个不可或缺的工具。Docker以其轻量级、可移植性和标准化等特点,使得应用程序的部署和管理变得前所未有的简单。无论您是一名开发者、系统管理员,还是IT架构师,理解并掌握Dock…

仓储9代巷道灯接口文档-V2.0

标签注册 仓储9代巷道灯注册 磁体靠近条码所在区域附近,触发巷道灯注册到系统 注册成功:闪红灯变绿灯常亮,之后熄灭 查询巷道灯信息接口 接口地址:192.168.1.200/wms/associate/queryIndicates 请求类型:applicat…

GB28181简述

概述 GB/T28181《安全防范视图计算联网系统信息传输、交换、控制技术要求》是由公安部科技信息化局提出,由全国安全防范报警系统标准化技术委员会(SAC/TC100)归口,公安部一所等多家单位共同起草的一部国家标准。 该标准规定了城市…

LeetCode刷题--- 第 N 个泰波那契数

个人主页:元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言:这个专栏主要讲述动…

线性代数基础知识

计算机视觉一些算法中常会用到线性代数的一些知识,为了便于理解和快速回忆,博主这边对常用的一些知识点做下整理,主要来源于如下这本书籍。 1. 矩阵不仅仅是数字排列而已,不然也不会有那么大精力研究它。其可以表示一种映射 关于…

ROS TF坐标变换 - 动态坐标变换

目录 一、动态坐标变换(C实现)二、动态坐标变换(Python实现) 一、动态坐标变换(C实现) 所谓动态坐标变换,是指两个坐标系之间的相对位置是变化的。比如机械臂末端执行器与 base_link 之间&…

革新MIMO无线电测试,精准测量10 MHz-8 GHz复杂射频信号!

背景介绍 在当今发展的趋势下,无线通信协议变得越来越复杂。具有多个输入和输出(MIMO)、高达320 MHz的带宽以及高4096 QAM的调制方案。而EN 300 328和EN 301 893标准描述了无线电以及2.4 GHz和5 GHz宽带信号的频谱参数。 EN 300328是欧盟RE…

Java面试题大全

发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~博主已将这些面试题整理到一个网站上,每天更新 Java 面试题,目前有 1万多道 Java 高频面试题。 本套Java面试题大全&am…

SDG大数据平台简介

联合国可持续发展目标(Sustainable Development Goals)缩写SDGs,是联合国制定的17个全球发展目标,在2000-2015年千年发展目标(MDGs)到期之后继续指导2015-2030年的全球发展工作。(摘自百度&…