Как сравнить два цвета по сходству / разнице - PullRequest
154 голосов
/ 26 января 2012

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

Подробнее: цвета взяты из фотографий тюбиков с гелем разных цветов. У меня есть 5 трубок с разными цветами, каждая из которых является представителем 1 из 5 уровней. Я хочу сфотографировать другие образцы и на компьютере оценить, к какому уровню относится этот образец, сравнивая цвета, и я хочу знать это с процентным приближением. Я хотел бы программу, которая делает что-то вроде этого: http://www.colortools.net/color_matcher.html

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

Ответы [ 16 ]

1 голос
/ 10 августа 2016

Простой метод, который использует только RGB:

cR=R1-R2 
cG=G1-G2 
cB=B1-B2 
uR=R1+R2 
distance=cR*cR*(2+uR/256) + cG*cG*4 + cB*cB*(2+(255-uR)/256)

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

1 голос
/ 26 января 2012

Полагаю, вы хотите проанализировать целое изображение в конце, не так ли? Таким образом, вы можете проверить наименьшую / наибольшую разницу в единичной цветовой матрице.

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

Так что я думаю, что вы должны начать здесь:

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

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

... и как уже говорила Беска выше:

Это может не дать лучшего "видимого" различия ...

Это также означает, что ваш алгоритм зависит от вашего определения "аналогично", если вы обрабатываете изображения.

0 голосов
/ 26 июня 2019

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

Вот версия Python

def lum(c):
    def factor(component):
        component = component / 255;
        if (component <= 0.03928):
            component = component / 12.92;
        else:
            component = math.pow(((component + 0.055) / 1.055), 2.4);

        return component
    components = [factor(ci) for ci in c]

    return (components[0] * 0.2126 + components[1] * 0.7152 + components[2] * 0.0722) + 0.05;

def color_distance(c1, c2):

    l1 = lum(c1)
    l2 = lum(c2)
    higher = max(l1, l2)
    lower = min(l1, l2)

    return (higher - lower) / higher


c1 = ImageColor.getrgb('white')
c2 = ImageColor.getrgb('yellow')
print(color_distance(c1, c2))

Даст вам

0.0687619047619048
0 голосов
/ 08 июня 2017

Для быстрого и грязного, вы можете сделать

import java.awt.Color;
private Color dropPrecision(Color c,int threshold){
    return new Color((c.getRed()/threshold),
                     (c.getGreen()/threshold),
                     (c.getBlue()/threshold));
}
public boolean inThreshold(Color _1,Color _2,int threshold){
    return dropPrecision(_1,threshold)==dropPrecision(_2,threshold);
}

, используя целочисленное деление для квантования цветов.

0 голосов
/ 25 мая 2015

Единственный «правильный» способ сравнения цветов - сделать это с deltaE в CIELab или CIELuv.

Но для многих приложений я думаю, что это достаточно хорошее приближение:

distance = 3 * |dR| + 4 * |dG| + 3 * |dB|

Я думаю, что взвешенное расстояние в Манхэттене имеет гораздо больше смысла при сравнении цветов. Помните, что цветовые праймериз есть только у нас в голове. Они не имеют никакого физического значения. CIELab и CIELuv моделируются статистически исходя из нашего восприятия цвета.

0 голосов
/ 07 июня 2013

Вам нужно будет преобразовать любые цвета RGB в цветовое пространство Lab, чтобы иметь возможность сравнивать их так, как их видят люди. В противном случае вы получите цвета RGB, которые «совпадают» очень странными способами.

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

Удобно, что в проекте OpenIMAJ реализована Java-реализация более сложного алгоритма CIEDE2000. Предоставьте ему два набора цветов Lab, и он вернет вам единичное значение расстояния.

...