20 图像直方图反向投影
代码
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
def back_projection_demo():
sample = cv.imread("../images/sample.png")
# hist2d_demo(sample)
target = cv.imread("../images/target.png")
hist2d_demo(target)
roi_hsv = cv.cvtColor(sample, cv.COLOR_BGR2HSV)
target_hsv = cv.cvtColor(target, cv.COLOR_BGR2HSV)
# show images
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, 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_BGR2HSV)
hist = cv.calcHist([hsv], [0, 1], None, [32, 32], [0, 180, 0, 256])
dst = cv.resize(hist, (400, 400))
cv.imshow("image", image)
cv.imshow("hist", dst)
plt.imshow(hist, interpolation='nearest')
plt.title("2D Histogram")
plt.show()
back_projection_demo()
cv.waitKey(0)
cv.destroyAllWindows()
实验结果
解释
重点:RGB色彩空间对一些纯色的区分度不够,HSV, YCaCb这些色彩空间对它们的区分度会比较好!
图像直方图反向投影是通过构建指定模板图像的二维直方图空间与目标的二维直方图空间,进行直方图数据归一化之后, 进行比率操作,对所有得到非零数值,生成查找表对原图像进行像素映射之后,再进行图像模糊输出的结果。
直方图反向投影流程:
- 计算直方图
- 计算比率R
- LUT查找表
- 卷积模糊
- 归一化输出
相关API
- calcBackProject
所有内容均来源于贾志刚老师的知识星球——OpenCV研习社,本文为个人整理学习,已获得贾老师授权,有兴趣、有能力的可以加入贾老师的知识星球进行深入学习。