直方图的反向投影的原理详解及OpenCV下的示例源码

读懂本篇博文的预备知识:
对OpenCV的图像直方图计算函数calcHist()进行透彻解析
详解什么叫二维直方图,并利用OpenCV的函数calcHist()绘制图像的H-S二维直方图

直方图的反向投影就是首先计算图像中某一个特征的直方图,然后将这个特征的直方图反向投影到原图像,进而可以判断图像中是否存在该特征,从而实现目标识别等操作。

简单点讲,所谓直方图反向投影就是首先计算某一特征的直方图,然后使用该直方图去寻找图像中是否存在该特征的方法。

直方图的反向投影常用于对目标的跟踪的定位。

OpenCV提供了函数calcBackProject()用于对图像进行直方图的反向投影运算。

函数calcBackProject()的C++原型如下:

void cv::calcBackProject(const Mat * images,
                         int nimages,
                         const int * channels,
                         InputArray hist,
                         OutputArray backProject,
                         const float ** ranges,
                         double scale = 1,
                         bool uniform = true )

Python原型如下:

dst=cv.calcBackProject(images, channels, hist, ranges, scale[, dst])

原型中各参数的意义如下:

images---需要做直方图反向投影的图像,可以是多幅图像,但是所有的图像应具有相同的尺寸和数据类型,在OpenCV3中,数据类型只能是CV_8U或CV_32F,但是不同图像的通道数可以不同。

nimages---输入图像数量。

channels---输入图像需要参与做直方图反向投影的通道列表。这里需要注意的是,输入直方图hist是几维的就需要有输入图像的几个通道参与。

hist---输入直方图。

backProject---输入图像的直方图反投影图像,与输入图像具有相同尺寸和数据类型的单通道图像。

ranges---输入直方图每个维度的取值范围。

scale---进行直方图反向投影时的比例因子。这个参数的意义不容易想到,具体的意义请大家参考本博文的原文,本博文的原文链接 https://www.hhai.cc/thread-220-1-1.html 。

uniform----输入直方图是否均匀的标志。

在使用函数calcBackProject()进行直方图反向投影计算前,我们首先需要知道OpenCV的这个函数是怎么计算图像的反向投影的。

在本博文的原文中,
我通过一个简单的例子来详细说明了函数calcBackProject()是怎样计算图像的直方图的反向投影的。
如需了解“函数calcBackProject()是怎样计算图像的直方图的反向投影的”,
请访问本博文原文查看,
本博文原文链接如下:

https://www.hhai.cc/thread-220-1-1.html

从"函数calcBackProject()是怎样计算图像的直方图的反向投影"的详细过程中我们看出,整个过程实际上是把特征A的直方图作为概率模板,按这个模板把矩阵B(图像B)的像素值进行重映射。这样,符合特征A的直方图的部分就会被显现出来,从而实现对特征A的查找,进而实现目标的区配、定位、跟踪。

接下来我们来看一个实例。

下面这幅图是某歌手在唱歌时的截图:

我们希望借助上面这幅图中歌手的面部直方图特征,查找出另一幅图中此歌手的面部大概位置。

另一幅图(lml-02.jpg)如下:

 我们可以像下面这样操作完成这个任务。

 首先我们从这幅图中截取歌手的面部(lml-template.jpg),如下:

用这个截取的面部作为特征,计算待查找图像的直方图反向投影。

代码如下:

# -*- coding: utf-8 -*-
# 出处:昊虹AI笔记网(hhai.cc)
# 用心记录计算机视觉和AI技术
 
 
# OpenCV的版本为4.4.0
  
import numpy as np
import cv2 as cv
import sys
  
if __name__ == '__main__':
    # 读取图像并判断是否读取成功
    lml_02_image = cv.imread('F:/material/images/histogram_back_projection/lml-02.jpg')
    template_image = cv.imread('F:/material/images/histogram_back_projection/lml-template.jpg')
  
    if lml_02_image is None or template_image is None:
        print('Failed to read calcBackProject.jpg or calcBackProject_template.jpg.')
        sys.exit()
    # 分别将其颜色空间从BGR转换到HSV
    origin_hsv = cv.cvtColor(lml_02_image, cv.COLOR_BGR2HSV)
    template_hsv = cv.cvtColor(template_image, cv.COLOR_BGR2HSV)
  
    # 计算模板图像的直方图
    template_hist = cv.calcHist([template_hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
  
    # 对模板图像的直方图进行偏移归一化处理
    cv.normalize(template_hist, template_hist, 0, 255, cv.NORM_MINMAX)
    # 计算直方图的反向投影
    result = cv.calcBackProject([origin_hsv], [0, 1], template_hist, [0, 180, 0, 256], 1)
  
    # 显示图像
    cv.imshow('lml-02', lml_02_image)
    cv.imshow('Template Image', template_image)
    cv.imshow('calcBackProject_result', result)
    cv.waitKey(0)
    cv.destroyAllWindows()

运行结果如下图所示:

 从运行结果可以看出,根据歌手的面部直方图特征,我们从其演唱时的另一幅截图中找到了它的头部位置。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值