В любой задаче компьютерного зрения вы неизбежно наткнетесь на цвета. Проще говоря, компьютерное зрение — это процесс, позволяющий компьютерам видеть, а то, что они видят или читают, — это изображения и видео. Входными данными для любой задачи CV является изображение, рассматривающее видео как последовательность кадров. Изображение представляет собой массив значений пикселей, и каждое значение пикселя хранит значение цвета, обычно в формате RGB. Таким образом, мы можем сказать, что изображения представляют собой массивы значений цвета.

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

Цветовое пространство RGB

Во-первых, у нас есть цветовое пространство RGB, разработанное для его удобства. Он предполагает, что цвета представляют собой смесь трех источников света: красного, зеленого и синего. Пример: сочетание красного и зеленого света дает желтый цвет. Значения для каждого канала варьируются от 0 до 255, где 0 означает отсутствие цвета, а 255 — полноцветность. Значение RGB (0, 0, 0) представляет черный цвет, поскольку отсутствуют все цветовые компоненты, а значение (255, 255, 255) представляет белый цвет, поскольку он представляет собой присутствие всех цветов (представьте себе белый свет и вспомните, как он рассеивается на несколько компонентов). Значения RGB могут представлять в общей сложности 256 * 256 * 256 = 16777216 различных значений цвета.

Шестнадцатеричные цветовые коды

Другой способ представления значений цвета — шестнадцатеричные коды, где значения RGB преобразуются в шестнадцатеричные коды. Шестнадцатеричные коды начинаются с символа «#», за которым следуют шестнадцатеричные значения для каждого значения RGB. Значения для каждого компонента варьируются от 0 до FF. Итак, «#FF0000» — красный, «#00FF00» — зеленый, а «#0000FF» — синий. Аналогично, «#000000» представляет черный цвет, а «#FFFFFF» представляет белый цвет.

Цветовое пространство HSV

Далее у нас есть цветовое пространство HSV, где «H» представляет собой оттенок (цвет), «S» представляет собой насыщенность (серость), а «V» представляет значение (яркость). Хотя RGB обеспечивает удобство, HSV обеспечивает гибкость в работе с оттенками и тонами. HSV отделяет яркость от информации о цвете. Значение оттенка варьируется от 0 до 360, где 0 означает красный цвет, 120 означает зеленый цвет, а 240 означает синий. Значение насыщенности находится в диапазоне от 0 до 100, где 100 означает полноцветный режим, а 0 означает отсутствие цвета (полные оттенки серого). Диапазон значений также составляет от 0 до 100, где 100 — полная яркость, приводящая к полноцветному изображению, а 0 означает отсутствие яркости, что приводит к черному цвету.

Ну, это более знакомые цветовые пространства, и вы, возможно, видели в названии довольно неизвестное цветовое пространство CIE L*a*b. Интересно, что это?? Мы поговорим об этом чуть позже в этой статье. А пока ТЕРПЕНИЕ!!!!

Измерение разницы в цвете

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

Теперь, когда мы знаем, как численно представлять цвета в числах, как мы можем сказать, что один цвет отличается от другого и насколько он отличается? Прежде чем мы говорили о расстоянии, мы также говорили о значениях RGB. Возможно, вы заметили сходство в представлении цветов RGB и декартовой системе координат трехмерного пространства. Если мы думаем о RGB (0, 0, 0) как о начале координат, то все цветовое пространство RGB находится в 1-м октанте, где значения для каждого значения достигают максимума 255 и минимума 0. Затем вычисляется расстояние между две точки в пространстве RGB (два цвета) так же просто, как вычислить евклидово расстояние между двумя точками.

Таким образом, расстояние между двумя цветами (R1, G1, B1) и (R2, G2, B2) можно вычислить в Python с помощью математического модуля.

import math

color1_rgb = (100, 150, 170)  # RGB values of one color.
color2_rgb = (200, 220, 120)  # RGB values of another color.

distance = math.dist(color1_rgb, color2_rgb)

Здесь расстояние будет измерять расстояние между двумя цветами в пространстве RGB. Таким образом, чем меньше расстояние между двумя цветами в цветовом пространстве RGB, тем больше они похожи друг на друга.

Если вычислить расстояние между цветами в пространстве RGB довольно просто, то вычислить расстояние между цветами в HSV немного сложнее. Один из способов — преобразовать цвета HSV в RGB, а затем применить тот же метод, что и выше.

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

В следующем коде показана функция, которая принимает значение HSV в качестве аргумента и возвращает соответствующие декартовы координаты.

def cylindrical_to_cartesian(hsv):
    theta = hsv[0]  # hue
    radius = hsv[1]     # saturation
    z = hsv[2]  # value

    # conversion to cartesian coordinates
    theta_radian = math.radians(theta)

    x = radius * math.cos(theta_radian)
    y = radius * math.sin(theta_radian)

    return x, y, z

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

Итак, мы обсудили цветовые пространства и увидели, как рассчитать расстояние между цветами. Хотя где это может быть полезно? Существуют приложения, в которых вам необходимо сопоставить цвет объекта с целевым цветом. Таким образом, в этих сценариях вы можете рассчитать расстояние между входным цветом и целевым цветом и, установив минимальный порог, вы можете эффективно оценить, соответствует ли цвет или нет.

НУЛЛЛЛЛЛЛ.……… НОТТТТТТ ДЕЙСТВИТЕЛЬНОЛЛЛЛЛИЫЫЫЫЫЫЫЫЫЫ!!!!!!!!!! Все это работало бы прекрасно, если бы цветовое пространство было однородным, но, к сожалению, это не так. Таким образом, это приблизит вас к желаемому результату, но все равно оставит его далеко от вашей досягаемости. Извините, что втянул вас в эту выбоину. Но не волнуйся, я также вытащу тебя из этого. Я обещал вам способ находить цветовые различия и дам его вам. Побудь со мной еще немного.

Итак, вышеописанные методы не работают. Мы это убрали, но почему это не работает? Важно, чтобы мы это понимали, поэтому я тянул со всем этим, тратя время на набор около 1000 слов. ЕЩЕ РАЗ ИЗВИНИТЕ!! Видите ли, проблема с цветами в том, что они неоднородны, смешиваются и творят всякие странные вещи. Но главная проблема в том, как отличить два цвета? В конце концов, инструмент, который мы используем для проверки разницы, — это наши глаза, и это приводит к проблеме, то есть к тому, как мы воспринимаем цвета. Вся математика, которую мы делаем, не способна уловить наше восприятие. Труднее отличить более темные оттенки и легче отличить более светлые. Очень темно-синий, очень темно-зеленый или очень темно-красный будут выглядеть одинаково, насколько далеко они могут находиться в цветовом пространстве. Я приведу вам еще один пример: визуализируйте два цвета в модели HSV (0, 100, 0) и (120, 100, 0). Здесь два цвета будут находиться на расстоянии 120 градусов друг от друга, но они дают один и тот же цвет, то есть черный. Я надеюсь, что теперь понятно, что дело не в расстоянии, а в том, как мы, люди, воспринимаем цвета.

Ладно, я достаточно долго загонял тебя в выбоину. ВРЕМЯ ВЫБРАТЬ ТЕБЯ!!!

Помните, мы говорили о цветовой модели CIE L*a*b. Я просил вас проявить терпение. Я знаю, что испытал ваше терпение, но теперь вы перейдете к хорошему.

CIE L*a*b — это стандартное цветовое пространство, разработанное специально для измерения разницы между цветами. Я не буду вдаваться в подробности этой цветовой модели, но сообщу, что она лучше всего подходит для данного варианта использования. Это постоянно однородное цветовое пространство. Преимущество работы с этой моделью заключается в том, что она соответствует стандарту CIE (Международной комиссии по освещению), которая также определила формулу для расчета разницы между цветами L*a*b. Здесь мы не будем говорить о самой формуле, но посмотрим, как можно рассчитать разницу с помощью модуля Skimage.

Сначала нам нужно импортировать модуль Skimage. Из этого модуля мы импортируем функцию rgb2lab и deltaE_ciede2000..

from skimage.color import rgb2lab, deltaE_ciede2000

Используя функцию rgb2lab, мы можем преобразовать изображение из формата RGB в формат Lab. Это необходимо, поскольку дельта-функция требует, чтобы входные данные были в лабораторном формате.

Для двух цветов в формате Lab мы можем рассчитать разницу следующим образом.

lab1 = (80, -100, 120)
lab2 = (150, 28, 116)

diff = deltaE_ciede2000(lab1, lab2)

Здесь разница 0 означает, что цвета абсолютно одинаковые, а значения до 10 означают, что они похожи. Порог от 10 до 15 хорошо подходит для целей сопоставления цветов. Пороговое значение может зависеть от приложения.

Итак, вот как мы можем проверить, похожи ли два цвета, используя CIE L*a*b. Надеюсь, вы стали лучше понимать цвета и рассчитывать цветовые различия. И, наконец, еще раз Извините!! за то, что тащил тебя так долго. Надеюсь, вы нашли то, что искали.