сравнивая его с другими методами, показывая более быстрое время вычислений. Единственный недостаток в том, что он в 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
Это неверно
Есть ли способ определить разницу между двумя гистограммами, которая учитывает форму распределения?