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)