『youcans 的 OpenCV 例程300篇 - 总目录』
【OpenCV 例程200篇】51. 直方图处理之直方图反向追踪(cv2.calcBackProject)
图像直方图是反映图像像素分布的统计表。 灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数。
直方图反向投影(反向追踪)是一种在输入图像中查找与特定模板图像匹配最佳的点或区域的方法,可以对特定颜色物体、特定灰度物体进行查找、跟踪,常用于图像查找、图像分割。
直方图反向投影处理的原理,是计算某一特征的直方图模型,再使用该模型去寻找图像中存在的特征。
直方图反向投影处理的过程,首先建立模板区域的直方图,再将直方图投影到输入图像,计算输入图像中每个像素点的像素值与直方图匹配概率,得到概率图像并以一定阈值进行二值化处理。
直方图的反向投影利用直方图模型计算给定图像像素点的特征。反向投影在某一位置的值是源图像在对应位置的像素值的累计。反向投影操作可实现检测输入源图像给定图像的最匹配区域,可用于目标检测。
OpenCV 提供的函数 cv2.calcBackProject() 可以用来做直方图反向投影。
函数说明:
cv2.calcBackProject(images, channels, hist, ranges, scale[, dst]) → dst
参数说明:
-
images:颜色对比度的阈值,可选项,默认值 8
-
channels: 计算反向投影的图像通道
-
hist: 查找模板区域的直方图
-
ranges:每个维度中直方图单元边界的数组
-
scale:反向投影输出的缩放比例
-
返回值 dst:返回反向投影的输出图像
基本例程:1.64 直方图反向投影追踪
# 1.64 直方图反向投影
roi = cv2.imread("../images/BallFrag.png", flags=1) # 查找的图像区域
target = cv2.imread("../images/imgBall.png", flags=1) # 被查找的目标图像
hsvRoi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
hsvTar = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)
histRoi = cv2.calcHist([hsvRoi], [0, 1], None, [180, 256], [0, 180, 0, 256]) # 计算目标直方图
cv2.normalize(histRoi, histRoi, 0, 255, cv2.NORM_MINMAX) # 归一化 ->[0,255]
dst = cv2.calcBackProject([hsvTar], [0, 1], histRoi, [0, 180, 0, 256], 1) # 反向投影
disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) # 定义椭圆结构形状
imgConv = cv2.filter2D(dst, -1, disc) # 图像卷积
ret, thresh = cv2.threshold(imgConv, 100, 255, 0) # 图像二值化处理,得到掩模模板
imgTrack = cv2.bitwise_and(target, target, mask=thresh) # 以 thresh 为掩模按位与,显示查找区域
plt.figure(figsize=(10,6))
plt.subplot(131), plt.imshow(cv2.cvtColor(target, cv2.COLOR_BGR2RGB)), plt.title("target image"), plt.axis('off')
plt.subplot(132), plt.imshow(thresh, 'gray'), plt.title("tracking mask"), plt.axis('off')
plt.subplot(133), plt.imshow(cv2.cvtColor(imgTrack, cv2.COLOR_BGR2RGB)), plt.title("tracking result"), plt.axis('off')
plt.show()
补充知识:
直方图的反向投影到底是指什么?
反向投影矩阵中某点的值就是它对应的原图像中的点所在区间的灰度直方图值。一个区间点越多,在反向投影矩阵中就越亮。
怎么理解反向投影矩阵中的 “反向”?
先求出原图像的直方图,再由直方图得到反向投影矩阵,由直方图到反向投影矩阵实际上就是一个反向的过程。
通过图像的反向投影矩阵,实际上把原图像简化了,简化过程就是提取图像特征的过程。通过特征来对比两幅图,如果两幅图的反向投影矩阵相同或高度相似,就可以判定这两幅图这个特征相同。
(本节完)
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125112487)
Copyright 2022 youcans, XUPT
Crated:2021-11-18