2013-07-09 5 views
2

Я пытаюсь найти хороший метод для сравнения двух изображений с точки зрения их цвета. Одна из моих идей заключалась в том, чтобы взять средний цвет обоих изображений и вычесть эту сумму, чтобы получить «цветное расстояние». Какое бы два изображения имели наименьшее расстояние цвета, было бы совпадением. Это похоже на жизнеспособный вариант для идентификации изображения из базы данных изображений?Сравнение изображений с использованием цветовой разности

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

Например, если бы я сканировал реальную версию this card на свой компьютер, я хотел бы иметь возможность сравнить это со всеми изображениями в моей базе данных, чтобы найти ближайший.

Обновление: Я забыл упомянуть о проблемах, связанных с моей конкретной проблемой.

  1. Отсканированное изображение карты и исходное изображение карты, скорее всего, будут разных размеров (с точки зрения ширины и высоты).
  2. Мне нужно сделать это максимально эффективным. Я планирую использовать это для сканирования/идентификации сотен карт одновременно. Я полагал, что поиск (и сохранение) одного среднего значения цвета для каждого изображения будет гораздо более эффективным, чем сравнение отдельных пикселей каждого изображения в базе данных (база данных имеет более 10 000 изображений) для каждой отсканированной карты, которая должна быть идентифицирована , Причина, по которой я спрашивал об этом, заключалась в том, чтобы увидеть, пытался ли кто-нибудь сравнить средние значения цвета раньше как средство распознавания изображений. У меня такое чувство, что это может не сработать, как я себе представляю из-за проблем с точностью и точностью цвета.

Update 2: Вот пример того, что я предполагая.

изображение, чтобы быть идентифицированы = A

Изображения в базе данных = {D , D }

средний цвет изображения А = ср (А) = # 8ba489

средний цвет изображений в базе данных = {# 58727a, # 8ba489}

D совпадения с изображением A потому что # 8ba489 - # 8ba4 89 меньше, чем # 8ba489 - # 58727a.

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

+0

Принимала вы посмотрите на [это] (http://stackoverflow.com/questions/8567905/how-to-compare-images-for-similarity-using -java? rq = 1) вопрос? –

ответ

2

Поиск изображений на основе контента (CBIR) может сделать трюк для вас. Для этого есть LIRE, java-библиотека. Вы можете сначала попробовать несколько подходов, используя различные функции изображения на основе цвета с помощью демонстрации. См. https://code.google.com/p/lire/ для скачивания & источник. Существует также «Простое приложение», которое позволяет вам быстро начать индексирование и поиск.

Основываясь на моем опыте, я бы рекомендовал использовать либо функцию ColorLayout (если изображения не вращаются), OpponentHistogram, либо AutoColorCorrelogram. Функция CEDD также может дать хорошие результаты, и она является самой маленькой с ~ 60 байтами данных на изображение.

+0

Прохладный, я обязательно проверю это. Благодаря! – Jason

0

Я думаю, что ваша идея недостаточно хороша для выполнения этой задачи. Ваш метод скажет, что все изображения ниже одинаковые (средний цвет всех изображений - 128).

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

+0

Я рассмотрел эту проблему, но я не уверен, что это будет проблемой. Если каждая карта в базе данных будет отчетливо отличаться, все они будут иметь хотя бы незначительную разницу в среднем цвете. Видя, как игральные карты я имею в виду, это Magic: The Gathering cards, каждый со своими уникальными произведениями искусства, я бы ожидал, что разница между средним значением цвета каждого изображения в базе данных будет достаточно значительным или, по крайней мере, значительным достаточно, чтобы отличить эту карту от других. – Jason

0

Ваш метод усреднения по цвету, скорее всего, потерпит неудачу, поскольку @Heejin уже объяснил.

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

Другой вариант заключается в использовании какого умнее алгоритм:

http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html

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

2

Если вы хотите, чтобы проверить разницу в цвета, как это:

http://en.wikipedia.org/wiki/Color_difference

Вы можете использовать Каталано Framework,

http://code.google.com/p/catalano-framework/

Он работает в Java и Android.

Пример использования Color Difference:

float[] lab = ColorConverter.RGBtoLAB(100, 120, 150, ColorConverter.CIE2_D65); 
float[] lab2 = ColorConverter.RGBtoLAB(50, 80, 140, ColorConverter.CIE2_D65); 

double diff = ColorDifference.DeltaC(lab, lab2); 
+0

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

+1

Вы можете нормализовать использование SND в Data PreProcessing, проверить Catalano.Statistics.DataPreprocessing –

Смежные вопросы