Алгоритмы сравнения изображений

Итак, я смотрю на изображение и пытаюсь выбрать одно из множества других изображений, которое наиболее похоже (наименее отличается).

В настоящее время я просто смотрю на среднюю разницу между частями RGB каждого пикселя, но это имеет тенденцию выбирать серые цвета. Если половина изображения белая, а другая черная, будет выбран какой-то серый оттенок, даже если на изображении нет серого.

Я предполагаю, что есть лучшие алгоритмы для сравнения изображений или попыток достичь того, что я пытаюсь сделать.

Обратите внимание, что фактическое содержание изображения не так интересно, просто цвета «выглядят» похожими.

Для протокола, что я пытаюсь сделать, это сопоставить чью-то одежду с файлом текстуры, если это имеет значение.

Будем очень признательны за любые предложения или указания по использованию некоторых ресурсов.

РЕДАКТИРОВАТЬ: Мое решение заключалось в том, чтобы удалить серые цвета из набора, который я выбирал, и он работал очень хорошо, если у кого-то еще есть лучшие решения, не стесняйтесь публиковать.


person taracus    schedule 25.02.2020    source источник
comment
stackoverflow.com/questions/23931/   -  person Emanuele    schedule 25.02.2020
comment
comment
Примечание. Я знаю, что изображения не идентичны, потому что одно передается через прямую трансляцию с камеры, а другое - файл текстуры на диске. Мне нужно посчитать, насколько они разные и насколько они похожи визуально.   -  person taracus    schedule 25.02.2020
comment
Также у меня нет никаких тестовых данных или правильных данных для обучения AI-модели, поэтому это нужно делать с помощью пиксельных данных без каких-либо NN / ML / AI.   -  person taracus    schedule 25.02.2020


Ответы (1)


Я только что разместил это вчера, я не хочу дублировать пост, но он очень похож.

Создание растровых изображений меньшего размера из объекта Bitmap

Мой проект с открытым исходным кодом Transparency Maker создает базу данных пикселей, которая на самом деле представляет собой список объектов PixelInformation.

Конечно, у каждого пикселя есть свойства для красного, зеленого, синего, но есть также свойства для общего, синего зеленого, синего красного и зеленого красного, которые представляют собой просто сумму синего + зеленого, синего + красного и т. Д.

Затем вы можете выполнять запросы Linq или для каждого цикла и сравнивать общую сумму для двух пикселей (класс информации о пикселях), а затем вы можете сравнивать разные вещи, например:

Сравнить итоги очень просто:

int difference = pixel1.Total - pixel2.Total;

Это то же самое, что вводить все это, если вы используете стандартный BitMap:

int redDiff = Pixel1.Red - Pixel2.Red;
int green = Pixel1.Green - Pixel2.Green;
int blueDiff = Pixel1.Blue - Pixel2.Blue;
int diff = redDiff + greenDiff + blue;

В качестве мысли вы можете уточнить свой алгоритм, чтобы каждое различие было более взвешенным, поэтому для приведенного выше последняя строка может быть:

int difference = (redDiff * 17) + (greenDiff * 17) + (blueDifference * 17);

Я просто составил 17 в качестве примера, какое значение веса вы используете, зависит от вас.

Теоретически, приведенное выше даст вам более близкое число для более близких изображений.

Вот ссылка на мой проект с открытым исходным кодом, если вам нужен полный код: https://github.com/DataJuggler/TransparencyMaker

Может быть, это даст вам некоторые идеи.

person Community    schedule 25.02.2020
comment
Я имею в виду, что это алгоритм, который я использую прямо сейчас (не с вашей библиотекой), но я надеялся, что есть лучший способ, как я сказал в своем вопросе, этот алгоритм имеет тенденцию выбирать некоторые оттенки серого, когда части изображений яркие а другие нет - person taracus; 25.02.2020
comment
Я думал об этом больше, когда только что пробегал 7 миль. Насколько продвинутым вы хотите стать? Вы можете сравнить количество красного в верхней левой части и дать ему оценку, сделав то же самое для стольких атрибутов, о которых вы можете подумать. Среднее - не очень хорошее сравнение, поэтому вы седеете. Возьмите разницу в красном и временах отдельно x количество раз, проделайте то же самое для красного, зеленого и альфа, и вы, вероятно, сможете уйти довольно далеко. ML.Net предлагает несколько сравнений изображений для этого материала, которые, скорее всего, лучше, чем вы или я. - person ; 25.02.2020