例子源于OpenCV官网–直方图反向投射
(https://docs.opencv.org/4.x/da/d7f/tutorial_back_projection.html)
使用OpenCV函数cv::calcBackProject计算反向投影
使用OpenCV函数cv::mixChannels混合图像的不同通道
下述代码的功能:
1.加载一个图像
2.将原始文件转换为HSV格式,并只分离用于直方图的Hue通道(使用OpenCV函数cv::mixChannels)
3.让用户输入要在直方图计算中使用的bin数量。
4.计算同一图像的直方图(如果bin变化则更新它)和反向投影。
5.在窗口中显示反向投影和直方图。
代码:
#直方图反向投射(Back Projection)
from __future__ import print_function
from __future__ import division
import cv2 as cv
import numpy as np
import argparse
def Hist_and_Backproj(val):
#初始化cv::calcHist所需的参数。bin的数量来自Trackbar:
bins = val
histSize = max(bins, 2)
ranges = [0, 180] # hue_range
#计算直方图,并将其归一化到范围[0,255]
hist = cv.calcHist([hue], [0], None, [histSize], ranges, accumulate=False)
cv.normalize(hist, hist, alpha=0, beta=255, norm_type=cv.NORM_MINMAX)#归一化
#计算反向投影图像-calcBackProject,即通过调用函数cv::calcBackProject获得相同图像的反向投影
backproj = cv.calcBackProject([hue], [0], hist, ranges, scale=1)
"""
所有参数都是已知的(与计算直方图相同),
只有我们添加了backproj矩阵,它将存储源图像的反投影(&色相)
显示backproj:
"""
cv.imshow('BackProj', backproj)
#绘制图像的1-D Hue直方图:
w = 400
h = 400
bin_w = int(round(w / histSize))
histImg = np.zeros((h, w, 3), dtype=np.uint8)
for i in range(bins):
cv.rectangle(histImg, (i*bin_w, h), ( (i+1)*bin_w, h - int(np.round( hist[i]*h/255.0 )) ), (0, 0, 255), cv.FILLED)
cv.imshow('Histogram', histImg)
#读取输入图像:
parser = argparse.ArgumentParser(description='Code for Back Projection tutorial.')
parser.add_argument('--input', help='Path to input image.', default='Base_0.png')
args = parser.parse_args()
src = cv.imread(cv.samples.findFile(args.input))
if src is None:
print('Could not open or find the image:', args.input)
exit(0)
#将图像从RGB色彩空间转换到HSV色彩空间cvtColor:
hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)
#分割出hue通道mixChannels
ch = (0, 0)
hue = np.empty(hsv.shape, hsv.dtype)
cv.mixChannels([hsv], [hue], ch)
"""
使用cv::mixChannels函数从hsv图像中只获取通道0 (Hue)。它获得以下参数:
&hsv:将从其中复制通道的源数组
1:源阵列个数
&hue:复制通道的目标数组
1:目标阵列个数
ch[] ={0,0}:指示如何复制通道的索引对数组。在本例中,将&hsv的Hue(0)通道复制到&hue的0通道(1通道)
1:索引对数
"""
#为用户创建一个Trackbar来输入bin值。Trackbar上的任何更改都意味着调用Hist_and_Backproj回调函数。
window_image = 'Source image'
cv.namedWindow(window_image)
bins = 25
cv.createTrackbar('* Hue bins: ', window_image, bins, 180, Hist_and_Backproj )
Hist_and_Backproj(bins)
#显示图像并等待用户退出程序:
cv.imshow(window_image, src)
cv.waitKey()
运行结果:
原图:
直方图反向投射:
直方图: