OpenCv RGB直方图反投影无法正常工作

时间:2016-12-26 16:12:28

标签: python opencv image-processing histogram back-projection

我使用反投影来定位图像中知道人的直方图的人。问题是它不适用于皮肤或透明衣服。 这是我得到的:Back-projection result

这是我用来计算感兴趣区域的BGR直方图的代码:

channels=[0,1,2]
histSize = [8,8,8]
ranges=[0,256, 0,256, 0,256]

#image is in BGR color
bgr_split = cv2.split(roi_img)

#Compute image bgr histogram
hist = cv2.calcHist(bgr_split, channels, mask, histSize, ranges)
cv2.normalize(hist, hist, 0, 255, cv2.NORM_MINMAX)

我得到的直方图与人物的颜色一致,但是当我在包含人物的图像上应用反投影时,只有人物的暗区域变为非零值,如Back-projection result所示

我在一个像素上测试了直方图的反投影,但我并不了解结果。我明白了:

>> hist[2,2,1]
83.539368
>> pix_img = np.uint8(np.array([[[66,66,34]]]))
>> cv2.calcBackProject([pix_img],channels,hist,ranges,1)
array([[0]], dtype=uint8)

像素(b = 66,g = 66,r = 34)应该对应于直方图bin [2,2,1],因为histSize = [8,8,8],但是反投影返回0而不是141

对我做错了什么的想法?

1 个答案:

答案 0 :(得分:0)

经过一些测试,看起来应用在像素[b,v,r]上的反投影函数给出了像素[b,v,0]的反投影,忽略了第三个通道的值。我想这是opencv的一个错误,我将报告它。

我通过不使用此功能并将其替换为:

来绕过此问题
b,g,r=cv2.split(img/(256/ql))
B = np.uint8(hist[b.ravel(),g.ravel(), r.ravel()])
B = B.reshape(img.shape[:2])
ret, B = cv2.threshold(B,10,255,cv2.THRESH_BINARY)