Как наиболее точно определить цвет объекта?

33

Я написал компьютерную программу, которая может обнаруживать монеты в статическом изображении (.jpeg, .png и т. Д.), Используя некоторые стандартные методы для компьютерного зрения (размытие по Гауссу, определение порога, преобразование Хафа и т. Д.). Используя соотношения монет, взятых из данного изображения, я могу с уверенностью установить, какие монеты какие. Тем не менее, я хочу добавить к своим уровням уверенности, а также определить, имеет ли монета, которую я выводил, типа A (из отношения радиусов), также правильное colo [u] r. Проблема в том, что для британских монет и соавт. (медь, серебро, золото), соответствующие цвета (особенно от меди до золота) очень похожи.

У меня есть подпрограмма, которая извлекает средний цвет данной монеты в терминах «цветового пространства» RedGreenBlue (RGB) и подпрограмм для преобразования этого цвета в «цветовое пространство» HueSaturationBrightness (HSB или HSV).

С RGB не очень приятно работать, пытаясь провести различие между тремя цветами монет (см. Пример на прикрепленном [базовом] изображении). У меня есть следующие диапазоны и типичные значения для цветов разных типов монет:

Примечание: типичное значение здесь выбирается с использованием среднего значения реального изображения по пикселям.

**Copper RGB/HSB:** typicalRGB = (153, 117, 89)/(26, 0.42, 0.60).

**Silver RGB/HSB:** typicalRGB = (174, 176, 180)/(220, 0.03, 0.71).

**Gold RGB/HSB:** typicalRGB = (220, 205, 160)/(45, 0.27, 0.86) 

Сначала я попытался использовать «евклидово расстояние» между заданным средним цветом монеты (используя RGB) и типичными значениями для каждого типа монет, приведенными выше, рассматривая значения RGB как вектор; для меди у нас будет:

Dcopper=((RtypeRcopper)2+(GtypeGcopper)2+(BtypeBcopper)2)

где наименьшее значение разности ( ) говорит нам, какой тип данной монеты, скорее всего, будет. Этот метод показал себя очень неточным.D

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

Вопрос: Каков наилучший метод определения типа монет по цвету (из статического изображения)?

Большое спасибо за ваше время.

Типичные цвета монет

Редактировать 1

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

Редактировать 2 (Итоги)

Спасибо за ответ. Дальнейшее мое собственное исследование (включая ваши ответы и комментарии) выявило, насколько сложна эта проблема в общем случае произвольного освещения, произвольной камеры (мобильного устройства), колебаний цвета монет (даже для одного вида / типа). и т. д. Я впервые посмотрел на распознавание цвета кожи (очень активная область исследований) в качестве отправной точки, и до сих пор существует множество проблем даже с распознаванием цвета кожи только для кавказцев (см. эту статью для обзора современных методов), и тот факт, что эта проблема содержит три различных цветовых объекта, каждый из которых может иметь непрерывную и изменяющуюся цветность, делает эту тему компьютерного зрения очень трудной для классификации и решения соответственно (на самом деле вы могли бы получить хорошую степень доктора философии по ней !).

Я посмотрел на метод ограничения гаммы из очень полезного поста DW ниже. На первый взгляд это было очень многообещающе в качестве этапа предварительной обработки для преобразования изображения и отдельных монетных объектов в цвета, независимые от условий освещения. Тем не менее, даже этот метод не работает идеально (и включает в себя библиотеку изображений / гистограмм для отображений - в которые я не хочу входить), а также не делает гораздо более сложные методологии архитектуры нейронной сети. На самом деле эта статья в абстрактном виде утверждает, что:

"current machine colour constancy algorithms are not good enough for colour-based 
 object recognition.".

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

Ответ на АВБ был также полезным , и я посмотрел в L B * кратко.

"The nonlinear relations for L*, a*, and b* are intended to mimic the nonlinear
response of the eye. Furthermore, uniform changes of components in the L*a*b* colour
space aim to correspond to uniform changes in perceived colour, so the relative 
perceptual differences between any two colours in L*a*b* can be approximated by 
treating each colour as a point in a three dimensional space."

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

Я не задерживаю дыхание, чтобы найти конкретное решение этой проблемы, и после попытки с L A B * я буду пренебрегать цветом монет и стараюсь проверить свои текущие алгоритмы геометрического обнаружения (точное эллиптическое преобразование Хафа и т. Д.).

Спасибо вам всем. И в завершение к этому вопросу, вот то же изображение с новым геометрическим алгоритмом обнаружения, который не имеет распознавания цвета:

введите описание изображения здесь

Moonknight
источник
1
Будут ли изображения всегда иметь один и тот же цвет фона? Или вы можете ввести в изображение какой-нибудь другой «стандарт цвета»? Если это так, у вас есть способ регулировки для различного освещения. Если нет, то может быть трудно ..
OneStop
2
Это не просто цветной свет. Я почти уверен, что солнечный свет, флуоресцентный свет и лампа накаливания имеют цвета, которые достаточно различаются, чтобы испортить соответствие цветов HSB, даже если наши глаза так или иначе приспосабливаются, чтобы мы не воспринимали вещи, меняющие цвет.
Питер Шор
2
(+1) Вопрос интересный и сложный. Я чувствую, что это требует некоторой доработки, чтобы иметь хороший шанс получить хороший ответ. Как в настоящее время заявлено, это граничит с неправильным положением. Для практического решения вам необходимо предоставить более подробную информацию о диапазоне сред, в которых вы хотите выполнить эту классификацию. Какие цветовые фоны возможны? Всегда одинаковое количество монет? У вас всегда будет цветное изображение? Хорошее окружающее освещение? Знание этих видов характеристик может служить руководством к решению.
кардинал
2
Я думаю, что проблема, с которой вы сталкиваетесь, заключается в "постоянстве цвета". Другими поисковыми терминами будут "дисконтирование источника света" или "дисконтирование фона". Это нерешенная проблема в науке о зрении.
Каракал
1
Жаль, что я мог бы +1 снова для хорошего продолжения! Очень интересные вещи.
Мэтт Паркер

Ответы:

6

Две вещи, для начала.

Во-первых, окончательно не работают в RGB. По умолчанию должно быть цветовое пространство Lab (он же CIE L * a * b *). Откажитесь L. По вашему изображению aкоордината дает вам больше информации, но вам, вероятно, следует выполнить анализ основных компонентов aи bпоработать с первым (наиболее важным) компонентом, просто чтобы все было просто. Если это не работает, вы можете попробовать перейти на 2D-модель.

Просто чтобы почувствовать это, aу трех желтоватых монет есть ЗППП ниже 6, а средства 137 («золото»), 154 и 162 - должны быть различимы.

Во-вторых, проблема освещения. Здесь вам придется тщательно определить вашу проблему. Если вы хотите различать близкие цвета при любом освещении и в любом контексте - вы не можете, не так, во всяком случае. Если вы беспокоитесь только о локальных изменениях яркости, Lab по большей части позаботится об этом. Если вы хотите работать как при дневном свете, так и при свете ламп накаливания, можете ли вы обеспечить равномерный белый фон, как на вашем примере изображения? Каковы ваши условия освещения?

Кроме того, ваше изображение было снято довольно дешевой камерой, судя по всему. Возможно, у него есть какая-то функция автоматического баланса белого, которая очень плохо портит цвета - выключите, если можете. Это также выглядит так, как будто изображение было закодировано в YCbCr в какой-то момент (это часто случается, если это видеокамера) или в аналогичном варианте JPG; информация о цвете сильно занижена. В вашем случае это может быть на самом деле хорошо - это означает, что камера сделала вам шум в цветовых каналах. С другой стороны, это, вероятно, означает, что в определенный момент информация о цвете также была квантована сильнее яркости - это не так хорошо. Главное здесь - камера имеет значение, и то, что вы делаете, должно зависеть от камеры, которую вы собираетесь использовать.

Если что-то здесь не имеет смысла - оставьте комментарий.

AVB
источник
Спасибо за Ваш ответ. Я не могу гарантировать что-либо из вышеперечисленного. Это для мобильного приложения, которое подсчитывает монеты (произвольное количество монет) одним нажатием кнопки (и очень быстро!). Таким образом, освещение может сильно отличаться, и нет никакого постоянного фона. Я считаю, что классифицировать типы монет по цвету таким образом (как вы указали) невозможно. Тем не менее, мне нравится, что вы используете L A B *, и я считаю, что это лучший ответ. В свете этого у вас есть ответ и щедрость. Еще раз спасибо.
MoonKnight
6

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

  1. Попробуйте Hue больше? Похоже, что Хюэ дал вам довольно хорошее различие между серебром и медью / золотом, хотя и не между медью и золотом, по крайней мере в одном примере, который вы показали здесь. Рассматривали ли вы с использованием оттенка более подробно, чтобы увидеть, может ли быть жизнеспособным свойство отличать серебро от меди / золота?

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

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

  2. Другие цветовые пространства? Точно так же вы можете попробовать преобразовать в rg chromacity и затем поэкспериментировать, чтобы увидеть, поможет ли результат отличить серебро от меди / золота. Вполне возможно, что это поможет скорректировать изменение освещенности, поэтому стоит попробовать.

  3. Проверить относительные различия между монетами, а не смотреть на каждую монету изолированно? Я понял, что из соотношений размеров монет (радиусов) у вас есть исходная гипотеза для типа каждой монеты. Если у вас есть монет, это вектор. Я предлагаю вам проверить всю эту сложную гипотезу за один раз, а не раз проверить свою гипотезу для каждой монеты отдельно.н н нnnn

    Почему это может помочь? Что ж, это может позволить вам воспользоваться относительными оттенками монет друг к другу, которые должны быть ближе к инварианту относительно освещения (при условии относительно равномерного освещения), чем индивидуальный оттенок каждой монеты. Например, для каждой пары монет вы можете вычислить разницу их оттенков и проверить, соответствует ли это тому, что вы ожидаете, дать свою гипотезу об их двух идентичностях. Или вы можете сгенерировать вектор с предсказанными оттенками для монет; вычислите вектор с наблюдаемыми оттенками для монет; кластеризовать каждого; и проверьте, что между оттенками есть взаимно-однозначное соответствие. Или, учитывая векторыp n n o n p , o T o T ( p ) o iT ( p i ) Tnpnnonp,o , вы можете проверить, существует ли простое преобразование такое, что , т. е. для каждого i. Возможно, вам придется поэкспериментировать с различными возможностями для класса , который вы допускаете. Одним из примеров класса является набор функций , где константа охватывает все возможности.ToT(p)oiT(pi)TT(x)=x+c(mod360)c

  4. Сравнить с эталонными изображениями? Вместо того, чтобы использовать цвет монеты, вы можете попытаться соответствовать тому, что напечатано на монете. Например, предположим, что вы обнаружили монету на изображении, и вы предполагаете, что это монета весом в один фунт. Вы можете взять эталонный образ из одного фунта монет и тест ли , похоже, соответствует .CRRC

    Вам нужно будет учитывать различия в позе. Позвольте мне начать с предположения, что у вас есть прямое изображение монеты, как на вашем примере изображения. Тогда главное, что вам нужно учитывать, - это вращение: вы априори не знаете, сколько вращается. Простой подход может захлестнуть диапазон возможных углов поворота , поворот на , и проверить , является ли , похоже, соответствует . Чтобы проверить совпадение, вы можете использовать простую пиксельную разностную метрику: т.е. для каждой координаты вычислить (разница между значением пикселя вCθRθRθC(x,y)D(x,y)=Rθ(x,y)C(x,y)Rθи значение пикселя в ); затем используйте норму (сумму квадратов) или что-то подобное, чтобы объединить все значения разностей в одну метрику того, насколько близко у вас есть совпадение (т. е. ). Вам нужно будет использовать достаточно маленький шаг приращения, чтобы пиксельная разница работала. Например, в вашем примере изображения монета весом в один фунт имеет радиус около 127 пикселей; если вы развернете значения , увеличиваясь на градуса на каждом шаге, то вам нужно будет всего лишь попробовать около 1460 различных значений вращения, и погрешность на окружности монеты в ближайшем приближении к истинномуCL2(x,y)D(x,y)2θ0.25θ должно быть не более одной четверти пикселя, что достаточно мало, чтобы разница в пикселях могла работать нормально.

    Вы можете поэкспериментировать с несколькими вариантами этой идеи. Например, вы можете работать с серой версией изображения; полный RGB и используйте норму всех трех разностей R, G, B; полный HSB и использовать норму по всем трем различиям H, S, B; или работайте только с плоскостью Оттенок, Насыщенность или Яркость. Кроме того, другой возможностью было бы сначала запустить детектор краев на обоих и , а затем сопоставить полученное изображение краев.L2L2RC

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

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

  5. Проверьте, как изменяется цвет в зависимости от расстояния от центра? Вот возможный промежуточный шаг между «средним цветом монеты» (одно число, т. Е. 0-мерное) и «всем изображением монеты» (2-мерное изображение). Для каждой монеты вы можете вычислить одномерный вектор или функцию , где представляет средний цвет пикселей на расстоянии приблизительно от центра монеты. Затем вы можете попытаться сопоставить вектор для монеты на вашем изображении с вектором для эталонного изображения этой монеты.ff(r)rfCCfRR

    Это может позволить вам исправить различия в освещении. Например, вы можете работать в оттенках серого или только в одной битовой плоскости (например, Hue, или Saturation, или Brightness). Или вы можете сначала нормализовать функцию , вычитая среднее значение: , где - средний цвет монеты, - затем попытайтесь сопоставить с .fg(r)=f(r)μμgCgR

    Хорошая вещь в этом подходе заключается в том, что вам не нужно определять, сколько монет было повернуто: функция зависит от вращения.f

    Если вы хотите поэкспериментировать с этой идеей, я бы вычислил функцию для множества различных примеров изображений и составил их график. Затем вы сможете визуально осмотреть их, чтобы убедиться, что функция имеет относительно постоянную форму, независимо от освещения. Возможно, вам придется попробовать это для нескольких различных возможностей (оттенки серого, каждая из битовых плоскостей HSB и т. Д.).fC

    Если монета , возможно , не было сфотографировано с непосредственно лобовыми, но , возможно , от угла, вы будете в первую очередь необходимо проследить эллипс периметра «s вывести угол , из которого он был сфотографирован , а затем правильно для , что в расчет .CCf

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

  7. Посмотрите в Color Constant Color Indexing. Основная идея CCCI , насколько я понимаю, состоит в том, чтобы сначала отменить неизвестный источник освещения, заменив значение R каждого пикселя соотношением между его значением R и одним из значений R его соседа; и аналогично для самолетов G и B. Идея состоит в том, что (мы надеемся) эти отношения теперь должны быть в основном независимы от источника освещения. Затем, когда у вас есть эти отношения, вы вычисляете гистограмму отношений, представленных на изображении, и используете это как подпись изображения. Теперь, если вы хотите сравнить изображение монеты с эталонным изображением , вы можете сравнить их подписи, чтобы увидеть, кажется ли они совпадающими. В вашем случае вам также может понадобиться отрегулировать угол, если изображение монетыCRC не был взят в лоб - но это, кажется, может помочь уменьшить зависимость от источника освещения.

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

DW
источник
3

Интересная проблема и хорошая работа.

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

Martino
источник
Хороший крик с медианой, на самом деле я также закодировал это и это также плохо с точки зрения установления правильного цвета. С помощью гистограммного подхода я осознаю вычислительные затраты; как только я начну перебирать пиксели в 2D, я буду нести расходы! Тем не менее, может быть, стоит добавить что-то подобное (как вы указали), чтобы установить какие-либо корреляции. Я создал всевозможные графики для компонентов RGB, и из-за меняющихся условий освещения (следствие фотографирования в разных местах) значения RGB могут сильно перекрываться для всех трех типов монет.
MoonKnight
Я также посмотрел на подгонку модели для оценки апостериорной вероятности того, что точка цветового пространства принадлежит определенному типу монет. Я также смотрел на моделирование гауссовой смеси, но пока не очень далеко продвинулся в этом. Мне также сообщили о другом (несколько произвольном, но более простом) подходе, который заключается в использовании чего-то вроде интерполяции ближайшего соседа. Спасибо за ваше время.
MoonKnight
1
На совершенно другой дорожке другое различие между монетами - это дизайн спереди / сзади (хотя некоторые могут иметь одинаковый дизайн на одной стороне). Как насчет перекрестной корреляции набора шаблонов дизайна с пикселями монеты (или с использованием взаимной информации) чтобы помочь определить, на какую монету вы смотрите. Благодаря сочетанию соотношений, цвета пикселей и подобного дизайна вы, вероятно, сможете снизить вероятность ложных открытий.
Мартино
Я думал об этом - но это требует слишком много нынешнего программного обеспечения для распознавания и было бы огромной работой, чтобы писать с нуля (OCR ??). Также есть огромная вариация в графике на таких монетах, что делает такую ​​реализацию кошмаром. Я собираюсь сыграть позже - я сообщу, что я найду. Еще раз спасибо.
MoonKnight
Почему отрицательный голос? Если есть проблема с ответом, было бы полезно указать на это - я не вижу ее
martino