从上述例子中可以看到 投影图像中的像素灰度值与待分割图像对应像素灰度值在模板直方图中对应窗口值相关 即与模板图像中出现概率相关。当投影图像中灰度值更大时 代表待分割图像中对应像素的灰度值在模板图像的直方图数值更大 则大概率出现在模板图像中时 即是我们认为的分割目标。因此我们可以将其视为一种“无参”阈值分割或直方图“匹配” 阈值通过模板图像直方图自动生成。
OpenCV文档中总结的更为形象 直接搬运如下
“Back Projection is a way of recording how well the pixels of a given image fit the distribution of pixels in a histogram model”.“To make it simpler: For Back Projection, you calculate the histogram model of a feature and then use it to find this feature in an image”. 注意事项在使用中有以下注意
在模板图像中尽可能地只包含要提取的目标 或者使用在计算直方图时使用掩膜 以减少干扰像素的影响 选择恰当的histSize至关重要 由于该方法使用直方图 像素值 进行分割 不同于灰度图 针对彩色图像使用HSV空间的H、S通道生成的2d直方图的分割效果更佳。 代码示例# 读取模板图像 roi cv2.imread( tmplcoin.png ) hsv cv2.cvtColor(roi, cv2.COLOR_BGR2HSV) # 读取待分割图像 target cv2.imread( coins.jpg ) hsvt cv2.cvtColor(target, cv2.COLOR_BGR2HSV) # 计算模板图像h-s通道的2d直方图 roihist cv2.calcHist([hsv], [0, 1], None, [20, 35], [0, 180, 0, 256]) # 将直方图归一化至255 cv2.normalize(roihist, roihist, 0, 255, cv2.NORM_MINMAX) # 计算反向投影 dst cv2.calcBackProject([hsvt], [0, 1], roihist, [0, 180, 0, 256], 1) # 对投影图像进行阈值分割 _, thresh cv2.threshold(dst, 50, 255, 0)
分割结果见下图所示
可以看到实际上该方法的分割结果较为一般 该方法的主要是在视频跟踪领域的MeanShift算法中使用。



