Как работает обратная проекция гистограммы в numpy? - PullRequest
1 голос
/ 02 августа 2020

Я новичок в этой платформе, а также в мире компьютерного зрения. Я работаю над проектом, в котором я использую гистограмму BackProjection для обнаружения цветного объекта. Есть два способа реализовать этот метод: либо с использованием numpy, либо с помощью встроенной функции opencv (cv2.calcBackProject). Однако я действительно хочу использовать версию numpy, поскольку она позволяет лучше понять, что происходит. Код для реализации numpy показан ниже:

1 import cv2
2 import numpy as np
3 import matplotlib.pyplot as plt
4 #roi is the object or region of object we need to find
5 roi = cv2.imread('D:/downloads/messi_ground.jpg')
6 hsv = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)
7 #target is the image we search in
8 target = cv2.imread('D:/downloads/messi.jpg')
9 hsvt = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)
10 # Find the histograms using calcHist.
11 M = cv2.calcHist([hsv],[0, 1], None, [180, 256], [0, 180, 0, 256] )
12 I = cv2.calcHist([hsvt],[0, 1], None, [180, 256], [0, 180, 0, 256] )

13 R = M/I
14 h,s,v = cv2.split(hsvt)

15 B = R[h.ravel(),s.ravel()
16 B = np.minimum(B,1)
17 B = B.reshape(hsvt.shape[:2])

Этот алгоритм находит пиксели в целевом изображении, которые похожи на пиксели в гистограмме модели (в моем случае гистограмма рентабельности инвестиций, M)

Итак, мои вопросы:

  • что буквально происходит, когда одна гистограмма делится на другую (строка 13)?
  • как в результате гистограмма (в данном случае R в строке 13) проецируется обратно с использованием канала h, s целевого изображения? Другими словами, как строка 15 поддерживает полученную R-гистограмму?
  • Строка 16 предполагает создание чисел от 0 до 1 для просмотра значений пикселей как вероятности, принадлежащих модели гистограмма. Однако я пропустил его и получил те же результаты, поэтому почему алгоритмы его используют?

К сожалению, статья, объясняющая этот метод, очень абстрактна и не раскрывает функциональность алгоритма ( Бумага: Индексирование с помощью цветовой гистограммы) Я знаю, что этот веб-сайт призван помочь с проблемами прямого программирования. Однако я думаю, что это также должно помочь понять некоторые операции, связанные с программированием.

1 Ответ

0 голосов
/ 07 августа 2020

В статье - Индексирование с помощью цветовых гистограмм авторы Майкл Дж. Суэйн и Дана Х. Баллард акцентируют внимание на - Что и где цвета на изображении целевого объекта?

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

Строки 11-12 вычисляют 2-мерные гистограммы, которые отличаются от обычных. Двухмерная гистограмма подсчитывает появление комбинаций интенсивностей.

Мы хотим найти сходство в I и M. В строке 13, когда мы делим M на I, результирующая матрица (изображение) R элементов (пикселей) будет отличным от нуля, только если оба элемента (пиксели) M и I не равны нулю. В противном случае они будут равны нулю или нан. Эта область ненулевых пикселей может иметь наш целевой объект. Теперь мы находим пиксели в целевом изображении, соответствующие этим ненулевым пикселям, используя значения оттенка (H) и насыщенности (S) пикселей целевого изображения (извлеченные в строке 14)

Строка 15 отфильтровывает эти ненулевые значения с использованием h & s. Значения Nan просто отклоняются, а нулевые значения все равно остаются черными. Это просто операция фильтрации, похожая на пороговую, поэтому используется сглаженный массив с помощью ravel.

Пропуск строки 16 мог бы сработать в вашем случае, возможно, потому что ваш roi будет содержать один из цветов R / G / B, значение которого близко к верхнему пределу шкалы, т.е. около 1 по шкале 0-1 и около 255 по шкале 0-255. Таким образом, деление меньшего числа на это большое число дает уже <1 </p>

...