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