从头学习opencv(11)--直方图反向投影

代替直方图

#建立代替直方图
def hist2d_demo(image):
    hsv=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    hist=cv.calcHist(image,[0,1],None,[32,32],[0,180,0,256])
    #cv.imshow("hist2d",hist)
    plt.imshow(hist,interpolation='nearest')
    plt.title("2D Histogram")
    plt.show()

直方图反向投影

直方图反向投影技术,通过二维直方图反映,必须先把原图像转换为hsv。

#计算H-S直方图
def back_projection_demo():
    sample=cv.imread("D:/OpenCV/opencv/sources/samples/data/sample.png")
    target=cv.imread("D:/OpenCV/opencv/sources/samples/data/target.png")
    roi_hsv=cv.cvtColor(sample,cv.COLOR_BGR2HSV)
    target_hsv=cv.cvtColor(target,cv.COLOR_BGR2HSV)

    #show image
    cv.imshow("sample",sample)
    cv.imshow("target",target)
    
    #计算直方图,范围越小,效果越好
    roiHist=cv.calcHist([roi_hsv],[0,1],None,[32,32],[0,180,0,256])
    cv.normalize(roiHist,0,255,cv.NORM_MINMAX)
    dst=cv.calcBackProject([target_hsv],[0,1],roiHist,[0,180,0,256],1)
    cv.imshow("backProjectionDemo",dst)

完整代码

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

#计算H-S直方图
def back_projection_demo():
    sample=cv.imread("D:/OpenCV/opencv/sources/samples/data/sample.png")
    target=cv.imread("D:/OpenCV/opencv/sources/samples/data/target.png")
    roi_hsv=cv.cvtColor(sample,cv.COLOR_BGR2HSV)
    target_hsv=cv.cvtColor(target,cv.COLOR_BGR2HSV)

    #show image
    cv.imshow("sample",sample)
    cv.imshow("target",target)

    roiHist=cv.calcHist([roi_hsv],[0,1],None,[32,32],[0,180,0,256])
    cv.normalize(roiHist,0,255,cv.NORM_MINMAX)
    dst=cv.calcBackProject([target_hsv],[0,1],roiHist,[0,180,0,256],1)
    cv.imshow("backProjectionDemo",dst)

#建立代替直方图
def hist2d_demo(image):
    hsv=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    hist=cv.calcHist(image,[0,1],None,[32,32],[0,180,0,256])
    #cv.imshow("hist2d",hist)
    plt.imshow(hist,interpolation='nearest')
    plt.title("2D Histogram")
    plt.show()


src = cv.imread("D:/OpenCV/opencv/sources/samples/data/demo.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
hist2d_demo(src)
back_projection_demo()
cv.waitKey(0)
cv.destroyAllWindows()
print("Hi,python!")

运行结果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

函数补充说明

引自https://www.cnblogs.com/FHC1994/p/9118351.html

注意:

  1. 归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。

归一化函数cv2.normalize原型:normalize(src, dst[, alpha[, beta[, norm_type[, dtype[, mask]]]]]) -> dst

src参数表示输入数组。

dst参数表示输出与src相同大小的数组,支持原地运算。

alpha参数表示range normalization模式的最小值。

beta参数表示range normalization模式的最大值,不用于norm normalization(范数归一化)模式。

norm_type参数表示归一化的类型。

norm_type参数可以有以下的取值:

NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。

NORM_INF:归一化数组的C-范数(绝对值的最大值)。

NORM_L1 :归一化数组的L1-范数(绝对值的和)。

NORM_L2 :归一化数组的(欧几里德)L2-范数。

参考博客:https://blog.csdn.net/solomon1558/article/details/44689611

2.反向投影用于在输入图像(通常较大)中查找特定图像(通常较小或者仅1个像素,以下将其称为模板图像)最匹配的点或者区域,也就是定位模板图像出现在输入图像的位置。

函数cv2.calcBackProject用来计算直方图反向投影。

函数原型:calcBackProject(images, channels, hist, ranges, scale[, dst]) -> dst

images参数表示输入图像(是HSV图像)。传入时应该用中括号[ ]括起来。

channels参数表示用于计算反向投影的通道列表,通道数必须与直方图维度相匹配。

hist参数表示输入的模板图像直方图。

ranges参数表示直方图中每个维度bin的取值范围 (即每个维度有多少个bin)。

scale参数表示可选输出反向投影的比例因子,一般取1。

参考博客:https://blog.csdn.net/keith_bb/article/details/70154219

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值