OpenCv RGB直方图反投影无法按预期工作

2024-06-16 14:37:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用反投影来定位图像中的一个人,知道这个人的直方图。问题是它不适用于皮肤或干净的衣服。 我得到的是: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所示。在

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

^{pr2}$

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

你知道我做错了什么吗?在


Tags: 图像image区域backresult直方图cv2hist
1条回答
网友
1楼 · 发布于 2024-06-16 14:37:15

经过一些测试,似乎对像素[b,v,r]应用的反投影函数给出了对像素[b,v,0]的反投影,第三个通道的值被忽略。我想这是opencv的一个bug,我要报告它。在

我绕过了这个问题,没有使用这个函数,而是替换为:

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)

相关问题 更多 >