Доброго времени суток, не нашел четкого описания алгоритма HOG, во многих статьях даны лишь расплывчатые представления, в связи с этим что-то пришлось додумывает самому и я хочу поинтересоваться, правильно ли я делаю, или нет
Если конкретно, то я не уверен в вычислении гистограммы для ячейки 8 × 8
Предположим, у нас есть матрица 8 × 8:
У меня есть неуверенность в следующих моментах:
1. Рассчет направления по x и y для крайних пикселей
Так как направление по x и y для пикселей в центре, например для пикселя 2 столбца 3 ряда (100) будет следующая:
По x: |90-110| = 20
По y: |25-105| = 80
Но как посчитать направления, например, для пикселя 1-ого ряда 1-ого столбца (10)
Я думаю, что это должно считаться как полуразница с единственным соседним пиксели, то есть так:
По x: |(10-20)/2|=5
По y: |(10-15)/2|=2.5
И второй непонятный мне момент:
Когда мы посчитаем магнитуду и ориентацию для каждого пикселя через формулы:
Нам нужно будет заполнить саму гистограмму, представляющую вектор 9 × 1 с ячейками, соответствующим углам от 0 до 160 с шагом 20:
0 20 40 60 80 100 120 140 160
И я не уверен в следующих моментах:
1. Допустим в ходе расчетов мы узнаем, что у нас в ячейки 8 × 8 есть два угла, равные, например, 140:
Тогда мы значения, соответствующие magnitude пикселей, которым принадлежат значения orientation 140, а таких пикселей, как мы предположили, 2, мы, получается суммируем?
То есть если в гистограмме 8 × 8 у нас есть один пиксель с magnitude 48 и orientation 140 и второй пиксель с magnitude 142 и orientation тоже 140, то в поле 140 вектора 9 × 1 мы заносим сумму значений 48+142 = 190?
2. Если orientation пикселя находится ровно между двумя ячейками, например есть пиксель с magnitude 72 и orientation 50, то в ячейки, между которыми находится этот угол (то есть в ячейки, соответствующие углам 40 и 60) мы вносим ровно по половине значения magnitude этого пикселя 36?(72/2=36)
3. И обращаясь к пункту 2, получается, если значение orientation пикселя не очень удобное, например 135, то значения в ближайшие ячейки вектора 9 × 1 (120 и 140) вносятся пропорционально тому, к какой ячейки значение orientation ближе?
То есть допустим у нас есть пиксель с magnitude 20 и orientation 135, то пропорция распределения будет следующая:
1/4 в ячейку 120, то есть 20/4 = 5
3/4 в ячейку 140, то есть 20/4*3 = 15
И в ячейку 120 попадет значение 5, а в ячейку 140 значение 15
Гистограмма - по определению - это структура данных (объект), в которых каждая строчка соответствует некоторому интервалу возможных значений ваших входных данных, а значение в этой строке - количество элементов во входных данных, значение которое попадает в этот интервал.
Так что ваши рассуждения правильны.
При этом ни на какие части никакие "неудобные элементы" не делятся.
(На третьем ресурсе копировать свой ответ уже не буду).
Да, спасибо, ответ про крайние пиксели вспомнил
Но тут я не совсем согласен
Предположим, у нас есть строка из 3 элементов:
10 20 30
И мы хотим вычислить направление по оси x для первого элемента этого вектора, то есть десятки
Также предположим ситуацию, когда десятка является вторым элементом, а первым, например, 0:
0 10 20 30
Тогда направление по x в этом случае для десятки будет |0-20| = 20
Тогда по логике вещей, в случае, если десятка крайний элемент, нам нужно не делить результат на 2, а домножать, и получим как раз |(10-20)*2|=20
А что же происходит с неудобными элементами, в тех документах, которые я нашел, говорилось о пропорциональном разделении, например если число 165, то в ячейку 0 попадает 1/4, то есть 5, а в ячейку 160 попадает 3/4, то есть 15
Andrei1penguin1, Ниче не понял. А какое отношение число 165 имеет к числу 20? Которое вы почему-то там делите в какой-то там пропорции? И все это - к гистограмме?
Строка из трех элементов - это что?? До сих пор у вас была исходная матрица 8*8 |(первый объект) и вы хотели построить гистограмму, разбив значения на 9 интервалов (т.е. второй объект) А строка из трех элементов откуда взялась?
И эта загадочная фраза "И мы хотим вычислить направление по оси x для первого элемента этого вектора" Направление по оси Х и есть направление по ости Х. Причем тут к направлению какое-товычитание чего-бы то ни было? Вот что вы действительно можете вычислить "по направлению Х" - это изменение значения по этой координате, которая действительно выражается как |Хлевой_точки - Хправой_точки|. Однако если вас интересует скорость изменения характеристики - а именно она вам и важна при вычислении градиента, то эту разность надо делить на расстояние между точками. Можно считать, что в блоке 3*3 расстояние между левой и правой точкой равно 1. Но тогда, если вы работаете с крайней точкой, и у вас есть только центральная и правая точки, то для сохранения общности вам надо разность |Хцентральной_точки - Хправой_точки| поделить пополам. См. рисунок.