Для небольшого проекта мне нужно сравнить одно изображение с другим - определить, являются ли изображения примерно одинаковыми или нет. Изображения малы, варьируются от 25 до 100 пикселей. Изображения предназначены для одинаковых данных изображения, но являются сублимированными, поэтому простая проверка равенства пикселей не будет работать. Рассмотрим эти два возможных сценария:
- Камера наблюдения (CCTV) в музее, смотрящая на выставку: мы хотим быстро увидеть, показывают ли две разные видеорамки одну и ту же сцену, но небольшие различия в освещении и фокусировке камеры означают, что они не будут идентичными.
- Изображение векторного графического интерфейса компьютера, отображаемого на 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 не является.
Когда я сделал беглый поиск алгоритмов разности гистограмм (по крайней мере, я понял), я нашел популярный подход, чтобы просто суммировать различия между каждым бином, однако этот подход часто терпит неудачу, потому что он взвешивает все различия в бинах то же самое.
Чтобы продемонстрировать проблему с этим подходом, в коде С#, например:
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
Это неверно.
Есть ли способ определить разницу между двумя гистограммами, которая учитывает форму распределения?