python - OpenCv RGB 直方图反投影未按预期工作

标签 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 .

知道我做错了什么吗?

最佳答案

经过一些测试,似乎应用在像素 [b,v,r] 上的反投影函数给出了像素 [b,v,0] 上的反投影,第三个 channel 的值被忽略了。我猜这是 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)

关于python - OpenCv RGB 直方图反投影未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41333688/

相关文章:

python - 七个小节数字识别-计算机视觉

image - 自动查找二值图像中物体的长度(MATLAB)

python - 使用 exec 时,Reposurgeon 给我一个语法错误,为什么?

python - 如何在 Python 中使用 Google api 检索 picasa 照片

python - Flask 应用程序中更智能的 sqlalchemy wtf 动态过滤器

python - 如何限制在 scrapy 中每个域抓取的项目数量?

python - 从直方图的密度自动找到最佳图像阈值

matlab - 计算对应像素

python - Python 中的 imgradient matlab 等价物

Java opencv robinson mask,图像全黑