Алгоритмы сравнения изображений - PullRequest
0 голосов
/ 25 февраля 2020

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 25 февраля 2020

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

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

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

Конечно, у каждого пикселя есть свойства для красного, зеленого и синего, но есть также свойства для Total, BlueGreen, BlueRed и GreenRed, представляющий собой сумму Blue + Green, Blue + Red и т. Д. c.

. Затем можно выполнить запросы 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

Возможно, это даст вам некоторые идеи.

...