OpenCV中的直方图反向映射
代码实现:
#直方图反向映射(在hsv色彩空间进行)
#1.创建二维直方图
def createhist2d(img):
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
hist = cv2.calcHist([img],[0,1],None,[100,256],[0,180,0,256])
#cv2的粗暴显示 cv2.imshow('hist2d',hist)
#cv2.waitKey()
#用plt的更好
plt.imshow(hist,interpolation='nearest')
plt.title('hist2d')
plt.show()
#2.直方图反向影射
sample = cv2.imread('sample.png')
target = cv2.imread('cat.jpg')
roi_hsv = cv2.cvtColor(sample,cv2.COLOR_BGR2HSV)
target_hsv = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)
roihist = cv2.calcHist([target_hsv],[0,1],None,[32,32],[0,180,0,256])
# 归一化nomralize:原始图像,结果图像,映射到结果图像中的最小值,最大值,归一化类型
# cv.NORM_MINMAX对数组的所有值进行转化,使它们线性映射到最小值和最大值之间
# 归一化后的图像便于显示,归一化后到0,255之间了
cv2.normalize(roihist, roihist, 0, 255, cv2.NORM_MINMAX)
dst = cv2.calcBackProject([target_hsv], [0, 1], roihist, [0, 180, 0, 256], 1)
'''
2.参数解释
images:输入图像,图像深度必须位CV_8U, CV_16U或CV_32F中的一种,尺寸相同,每一幅图像都可以有任意的通道数
channels : 用于计算反向投影的通道列表,通道数必须与直方图维度相匹配,第一个数组的通道是从0到image[0].channels() - 1, 第二个数组通道从图像image[0].channels()到image[0].channels() + image[1].channels() - 1计数
hist : 输入的直方图,直方图的bin可以是密集(dense)或稀疏(sparse)
ranges** : 直方图中每个维度bin的取值范围
scale = 1 : 可选输出反向投影的比例因子
'''
cv2.imshow('cat',target)
cv2.imshow('sample',sample)
cv2.imshow('dst',dst)
cv2.waitKey()
运行结果: