OpenCv RGB-гистограмма Обратная проекция не работает должным образом

Я использую обратную проекцию, чтобы найти человека на изображении, зная его гистограмму. Проблема в том, что он не работает на коже или на чистой одежде. Вот что я получаю: Результат обратной проекции

Вот код, который я использую для вычисления гистограммы 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)

Полученная гистограмма соответствует цветам человека, но когда я применяю обратную проекцию к изображению, содержащему человека, только темные области человека получают ненулевые значения, как показано в результате обратной проекции.

Я проверил обратную проекцию моей гистограммы на один пиксель, и я не понимаю получателя результата. Я получаю это:

>> 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) должен соответствовать корзине гистограммы [2,2,1], так как histSize = [8,8,8], но обратная проекция возвращает 0 вместо 141.

Есть идеи, что я делаю не так?

1 ответ

Решение

После некоторых тестов похоже, что функция обратной проекции, примененная к пикселю [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)
Другие вопросы по тегам