сравнивая его с другими методами, показывая более быстрое время вычислений. Единственный недостаток в том, что он в R, который не быстр, если не запрограммирован в C ++ под капотом.

ебольшого проекта мне нужно сравнить одно изображение с другим - чтобы определить, являются ли изображения примерно одинаковыми или нет. Изображения небольшие, от 25 до 100 пикселей в поперечнике. Изображения должны иметь одни и те же данные изображения, но они отличаются друг от друга, поэтому простая проверка на равенство пикселей не сработает. Рассмотрим эти два возможных сценария:

Камера видеонаблюдения в музее, которая осматривает экспонат: мы хотим быстро увидеть, показывают ли две разные видеокадры одну и ту же сцену, но небольшие различия в освещении и фокусировке камеры означают, что они не будут идентичны.Изображение значка графического интерфейса векторного компьютера, отображаемого с разрешением 64x64, по сравнению с тем же значком, отображаемым с разрешением 48x48 (но оба изображения будут уменьшены до 32x32, поэтому гистограммы имеют одинаковое общее количество пикселей).

Я решил представить каждое изображение с помощью гистограмм, используя три одномерные гистограммы: по одной для каждого канала RGB - для меня безопасно просто использовать цвет и игнорировать текстурные и краевые гистограммы (альтернативный подход использует одну трехмерную гистограмму для каждого изображения, но я избегаю этого, поскольку это добавляет дополнительную сложность). Поэтому мне нужно будет сравнить гистограммы, чтобы увидеть, насколько они похожи, и если мера сходства переходит некоторое пороговое значение, то я могу с уверенностью сказать, что соответствующие изображения визуально одинаковы - я бы сравнил гистограммы соответствующих каналов каждого изображения (например, изображение Красная гистограмма 1 с красной гистограммой изображения 2, затем синяя гистограмма изображения 1 с синей гистограммой изображения 2, затем зеленые гистограммы - так что я не сравниваю красную гистограмму изображения 1 с синей гистограммой изображения 2, которая была бы просто глупой).

Допустим, у меня есть эти три гистограммы, которые представляют сводку красного канала RGB для трех изображений (для простоты используется 5 бинов для 7-пиксельных изображений):

H1            H2            H3 

  X           X                     X
  X   X       X       X             X
X X   X X     X X   X X     X X X X X
0 1 2 3 4     0 1 2 3 4     0 1 2 3 4

H1 = [ 1, 3, 0, 2, 1 ]
H2 = [ 3, 1, 0, 1, 2 ]
H3 = [ 1, 1, 1, 1, 3 ] 

Изображение 1 (H1) мое контрольное изображение, и я хочу увидеть, если изображение 2 (H2) и / или изображение 3 (H3) аналогичен изображению 1. Обратите внимание, что в этом примере изображение 2 аналогично изображению 1, но изображение 3 - нет.

Когда я сделал беглый поиск алгоритмов «разности гистограмм» (по крайней мере, тех, которые я мог понять), я обнаружил, что популярным подходом было просто суммировать различия между каждым бином, однако этот подход часто терпит неудачу, потому что он взвешивает все различия бинов одинаково.

Чтобы продемонстрировать проблему с этим подходом, в коде C #, вот так:

Int32[] image1RedHistogram = new Int32[] { 1, 3, 0, 2, 1 };
Int32[] image2RedHistogram = new Int32[] { 3, 2, 0, 1, 2 };
Int32[] image3RedHistogram = new Int32[] { 1, 1, 1, 1, 3 };

Int32 GetDifference(Int32[] x, Int32[] y) {
    Int32 sumOfDifference = 0;
    for( int i = 0; i < x.Length; i++ ) {
        sumOfDifference += Math.Abs( x[i] - y[i] );
    }
    return sumOfDifferences;
}

Выход которого:

GetDifference( image1RedHistogram, image2RedHistogram ) == 6
GetDifference( image1RedHistogram, image3RedHistogram ) == 6

Это неверно

Есть ли способ определить разницу между двумя гистограммами, которая учитывает форму распределения?

Ответы на вопрос(8)

Ваш ответ на вопрос