Python-OpenCV 图像处理(十一):直方图方向投影
import cv2
import numpy as np
from matplotlib import pyplot as plt
__author__ = "zxsuperstar"
__email__ = "zxsuperstar@163.com"
"""
直方图方向投影, HSV和RGB色彩空间
"""
def hist2d_demo(image):
hsv = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
hist = cv2.calcHist([image],[0,1],None,[180,256],[0,180,0,256])
cv2.imshow("hist2d",hist)
plt.imshow(hist,interpolation="nearest")
plt.title("2d histogram")
plt.show()
def back_projection_demo(): #直方图反向投影
sample = cv2.imread("t.jpg")
target = cv2.imread("t2.jpg")
roi_hsv = cv2.cvtColor(sample,cv2.COLOR_BGR2HSV)
target_hsv = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)
cv2.imshow("sample",sample)
cv2.imshow("target",target)
roihist = cv2.calcHist([roi_hsv],[0,1],None,[32,32],[0,180,0,256])
cv2.normalize(roihist,roihist,0,255,cv2.NORM_MINMAX) #归一化
dst = cv2.calcBackProject(target_hsv,[0,1],roihist,[0,180,0,256],1)
cv2.imshow("backproject",dst)
if __name__ == "__main__":
src = cv2.imread("t.jpg") #blue green red
# cv2.namedWindow("image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("image",src)
# hist2d_demo(src)
back_projection_demo()
cv2.waitKey(0)
cv2.destroyAllWindows()
说明:
标准化处理就是将待处理的数据(通过预设的算法流程)限定在一个预设的范围内。
OpenCV中的归一化函数cv2.normalize原型为normalize(src, dst,… )并返回结果为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-范数。
反向投影其主要作用是在输入图像(通常较大)中进行搜索以定位特定于该输入的最小尺寸目标(通常为单个像素或少数几个像素),这些目标被称为模板图。
函数cv2.calcBackProject用来计算直方图反向投影。
函数原型:calcBackProject(images, channels, hist, ranges, scale[, dst]) -> dst
images参数表示输入图像(是HSV图像)。传入时应该用中括号[ ]括起来。
channels变量表示用于计算反向投影的通道集合,并且其数量必须与直方图的空间维度一致。
hist参数表示输入的模板图像直方图。
ranges变量定义为直方图中每个维度分组的数量(即每个维度共有多少个分组)。
scale参数表示可选输出反向投影的比例因子,一般取1。
