Сравнение двух гистограмм

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

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

Я решил представить каждое изображение с помощью гистограмм, используя три гистограммы 1D: по одной для каждого канала 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

Это неверно.

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

49
задан Dai 21 February 2017 в 10:51
поделиться