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