【发布时间】:2020-11-22 19:38:18
【问题描述】:
我是这个平台的新手,也是计算机视觉世界的新手。我正在做一个项目,我使用直方图 BackProjection 来检测有色物体。有两种方法可以实现此方法,使用 numpy 或内置函数形式的 opencv (cv2.calcBackProject)。但是,我真的很想使用 numpy 版本,因为它可以更好地理解发生了什么。 numpy的实现代码如下:
1 import cv2
2 import numpy as np
3 import matplotlib.pyplot as plt
4 #roi is the object or region of object we need to find
5 roi = cv2.imread('D:/downloads/messi_ground.jpg')
6 hsv = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)
7 #target is the image we search in
8 target = cv2.imread('D:/downloads/messi.jpg')
9 hsvt = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)
10 # Find the histograms using calcHist.
11 M = cv2.calcHist([hsv],[0, 1], None, [180, 256], [0, 180, 0, 256] )
12 I = cv2.calcHist([hsvt],[0, 1], None, [180, 256], [0, 180, 0, 256] )
13 R = M/I
14 h,s,v = cv2.split(hsvt)
15 B = R[h.ravel(),s.ravel()
16 B = np.minimum(B,1)
17 B = B.reshape(hsvt.shape[:2])
该算法在目标图像中找到与模型直方图中相似的像素(在我的例子中是 roi 的直方图,M)
所以我的问题是:
- 当一个直方图除以另一个(第 13 行)时会发生什么?
- 如何使用 h,s 通道反投影生成的直方图(在本例中为第 13 行的 R) 目标图像?换句话说,第 15 行如何反向投影 Resulted R 直方图?
- 第 16 行假设在 0 和 1 之间输入数字,以便将像素值视为属于模型直方图的概率。但是,我跳过了它并得到了相同的结果,那么算法为什么要使用它呢?
不幸的是,解释这种方法的论文非常抽象,并没有明确算法的功能(论文:通过颜色直方图进行索引) 我知道这个网站可以帮助解决直接的编程问题。不过我觉得应该也有助于理解一些编程相关的操作。
【问题讨论】:
-
@rayryeng 如果您能提供帮助将不胜感激:)
标签: python numpy opencv image-processing numpy-ndarray