直方图反向投影用于图像分割或查找图像中感兴趣的对象,简单来说,它会创建一个与输入图像大小相同(单个通道)的图像,其中每个像素对应于属于我们对象该像素的概率.输出图像将使我们感兴趣的对象比其余部分更明显.
首先,我们创建一个包含我们感兴趣对象的图像的直方图,对象应尽可能填充图像以获得更好的结果,颜色直方图比灰度直方图更受青睐,因为对象的颜色比灰度强度更能定义对象,然后我们将这个直方图“反投影”到我们需要找到对象的测试图像上.
实现的效果和nRange()函数对颜色进行捕捉类似
#直方图的反向投影
#基于直方图比较 多数在HSV色彩空间
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
def back_projection_demo():
smaple = cv.imread("C:\\Users\\william\\Pictures\\4.png")
target = cv.imread("C:\\Users\\william\\Pictures\\3.png")
# roi是我们需要找到的对象或区域
roi_hsv =cv.cvtColor(smaple,cv.COLOR_BGR2HSV)
# target是我们搜索的图像
target_hsv =cv.cvtColor(target,cv.COLOR_BGR2HSV)
cv.imshow("smaple",smaple)
cv.imshow("target",target)
# 计算对象的直方图
roiHist = cv.calcHist([roi_hsv],[0,1],None,[36,36],[0,180,0,256])
# 标准化直方图,并应用投影
cv.normalize(roiHist,roiHist,0,256,cv.NORM_MINMAX)
dst = cv.calcBackProject([target_hsv],[0,1],roiHist,[0,180,0,256],1)
cv.imshow("backprojection_demo",dst)
归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。
归一化函数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-范数。
反向投影用于在输入图像(通常较大)中查找特定图像(通常较小或者仅1个像素,以下将其称为模板图像)最匹配的点或者区域,也就是定位模板图像出现在输入图像的位置。
函数cv2.calcBackProject用来计算直方图反向投影。
函数原型:calcBackProject(images, channels, hist, ranges, scale[, dst]) -> dst
images参数表示输入图像(是HSV图像)。传入时应该用中括号[ ]括起来。
channels参数表示用于计算反向投影的通道列表,通道数必须与直方图维度相匹配。
hist参数表示输入的模板图像直方图。
ranges参数表示直方图中每个维度bin的取值范围 (即每个维度有多少个bin)。
scale参数表示可选输出反向投影的比例因子,一般取1。
def hist2d_demo(image):
hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV)
hist = cv.calcHist([image],[0,1],None,[180,256],[0,180,0,256])
#cv.imshow("hist2d",hist)
plt.imshow(hist,interpolation='nearest')
plt.title("2D_Histogram")
plt.show()
src =cv.imread("C:\\Users\\william\\Pictures\\go.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
back_projection_demo()
cv.waitKey(0)
cv.destroyAllWindows()
cv2.calcHist()
原型为:calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) -> hist
images参数表示输入图像,传入时应该用中括号[ ]括起来
channels参数表示传入图像的通道,如果是灰度图像,那就不用说了,只有一个通道,值为0,如果是彩色图像(有3个通道),那么值为0,1,2,中选择一个,对应着BGR各个通道。这个值也得用[ ]传入。
mask参数表示掩膜图像。如果统计整幅图,那么为None。主要是如果要统计部分图的直方图,就得构造相应的掩膜来计算。
histSize参数表示灰度级的个数,需要中括号,比如[256]
ranges参数表示像素值的范围,通常[0,256]。此外,假如channels为[0,1],ranges为[0,256,0,180],则代表0通道范围是0-256,1通道范围0-180。