【OpenCV 例程200篇】51. 直方图处理之直方图反向追踪(cv2.calcBackProject)

『youcans 的 OpenCV 例程300篇 - 总目录』


【OpenCV 例程200篇】51. 直方图处理之直方图反向追踪(cv2.calcBackProject)

图像直方图是反映图像像素分布的统计表。 灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数。

直方图反向投影(反向追踪)是一种在输入图像中查找与特定模板图像匹配最佳的点或区域的方法,可以对特定颜色物体、特定灰度物体进行查找、跟踪,常用于图像查找、图像分割。

直方图反向投影处理的原理,是计算某一特征的直方图模型,再使用该模型去寻找图像中存在的特征。

直方图反向投影处理的过程,首先建立模板区域的直方图,再将直方图投影到输入图像,计算输入图像中每个像素点的像素值与直方图匹配概率,得到概率图像并以一定阈值进行二值化处理。

直方图的反向投影利用直方图模型计算给定图像像素点的特征。反向投影在某一位置的值是源图像在对应位置的像素值的累计。反向投影操作可实现检测输入源图像给定图像的最匹配区域,可用于目标检测。

OpenCV 提供的函数 cv2.calcBackProject() 可以用来做直方图反向投影。

函数说明:

cv2.calcBackProject(images, channels, hist, ranges, scale[, dst]) → dst

参数说明:

  • images:颜色对比度的阈值,可选项,默认值 8

  • channels: 计算反向投影的图像通道

  • hist: 查找模板区域的直方图

  • ranges:每个维度中直方图单元边界的数组

  • scale:反向投影输出的缩放比例

  • 返回值 dst:返回反向投影的输出图像


基本例程:1.64 直方图反向投影追踪

    # 1.64 直方图反向投影
    roi = cv2.imread("../images/BallFrag.png", flags=1)  # 查找的图像区域
    target = cv2.imread("../images/imgBall.png", flags=1)  # 被查找的目标图像

    hsvRoi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
    hsvTar = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)

    histRoi = cv2.calcHist([hsvRoi], [0, 1], None, [180, 256], [0, 180, 0, 256])  # 计算目标直方图
    cv2.normalize(histRoi, histRoi, 0, 255, cv2.NORM_MINMAX)  # 归一化 ->[0,255]

    dst = cv2.calcBackProject([hsvTar], [0, 1], histRoi, [0, 180, 0, 256], 1)  # 反向投影
    disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))  # 定义椭圆结构形状
    imgConv = cv2.filter2D(dst, -1, disc)  # 图像卷积

    ret, thresh = cv2.threshold(imgConv, 100, 255, 0)  # 图像二值化处理,得到掩模模板
    imgTrack = cv2.bitwise_and(target, target, mask=thresh)  # 以 thresh 为掩模按位与,显示查找区域

    plt.figure(figsize=(10,6))
    plt.subplot(131), plt.imshow(cv2.cvtColor(target, cv2.COLOR_BGR2RGB)), plt.title("target image"), plt.axis('off')
    plt.subplot(132), plt.imshow(thresh, 'gray'), plt.title("tracking mask"), plt.axis('off')
    plt.subplot(133), plt.imshow(cv2.cvtColor(imgTrack, cv2.COLOR_BGR2RGB)), plt.title("tracking result"), plt.axis('off')
    plt.show()

在这里插入图片描述

补充知识:

直方图的反向投影到底是指什么?

反向投影矩阵中某点的值就是它对应的原图像中的点所在区间的灰度直方图值。一个区间点越多,在反向投影矩阵中就越亮。

怎么理解反向投影矩阵中的 “反向”?
先求出原图像的直方图,再由直方图得到反向投影矩阵,由直方图到反向投影矩阵实际上就是一个反向的过程。

通过图像的反向投影矩阵,实际上把原图像简化了,简化过程就是提取图像特征的过程。通过特征来对比两幅图,如果两幅图的反向投影矩阵相同或高度相似,就可以判定这两幅图这个特征相同。



(本节完)

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125112487)
Copyright 2022 youcans, XUPT
Crated:2021-11-18

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

youcans_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值