Почему дескриптор HOG возвращает вектор float
и не int
? Предположим, чтобы вернуть гистограмму ..
Я считаю, что @Micka прав: гистограммы, вероятно, нормализованы (возможно, не до 1). На Страница Википедии на HOG Descriptors, написано что:
Для повышения точности локальные гистограммы можно нормализовать по контрасту, рассчитав меру интенсивности в большей области изображения, называемой блоком, и затем используя это значение для нормализации всех ячеек в блоке. Эта нормализация приводит к лучшей инвариантности к изменениям освещения и затенения.
Отсюда необходимость vector<float>
вместо vector<int>
,
Чтобы дополнить предыдущие ответы, которые являются правильными на мой взгляд, в соответствии с этим HoG note Я нашел яснее, чем первоначальный Dalal & Триггс бумажный, Есть два этапа нормализации:
Сгруппируйте ячейки в перекрывающиеся блоки по 2 х 2 ячейки каждый, чтобы
каждый блок имеет размер 2C x 2C пикселей. Два горизонтально или вертикально
последовательные блоки перекрываются двумя ячейками, то есть шаг блока
С пикселей. Как следствие, каждая внутренняя ячейка покрыта четырьмя
блоки. Объединить четыре гистограммы ячеек в каждом блоке в
единичный блочный элемент b и нормализовать блочный элемент его
Евклидова норма.
Окончательная нормализация делает функцию HOG независимой от общего
контраст изображения
Также должно быть билинейное интерполяционное голосование между двумя последовательными бинами, чтобы предотвратить артефакты квантования.
Кроме того, это не может быть int, поскольку вы не только подсчитываете количество векторов градиента, попадающих в корзину, но также добавляете и величину градиента.