Страницы

Поиск по вопросам

вторник, 25 февраля 2020 г.

Вычисление пропорций цветов

#алгоритм #математика


Дано:
 4 RGB цвета - A,B,C,D
 Цвет D получен в результате смешивания A,B,C.

Вопрос: 
 как получить пропорцию выбранного нами цвета(например А) в результирующем D?

Моя попытка решить:


Преобразуем A,B,C,D в CIELAB для использования результата в виде Vector3.
Строим треугольник где A,B,C вершины, D - центр масс(предположительно)
Из D строим перпендикуляры к AB и AC и получаем четырехугольник, который представляет
собой площадь, которая является пропорцией искомого цвета.(предположительно)
Считаем площадь треугольника, и вычисляем отношение с результатом из пункта 3.


У меня затык в пункте 3, туго с математикой. Прошу помочь с алгоритмом(С++).
Так же возможно мой ход мыслей не правильный, в таком случае прошу представить ваш
вариант решения данной задачи.

PS: CIELAB вполне ок, в задаче с 2-мя цветами результат отвечает ожиданиям.

Для лучшего понимания проблемы прикладываю пикчи:

Это слой, который содержит так называемые цветовые идентификаторы объекта(colorId),
этим цветом заливается объект целиком.


Этот слой содержит сглаживание:



Нужно получить:


Поясню почему так. В данном случае объекты которые имеют зеленый и коричневый colorId
выбраны, и их нужно отобразить. Причем мне нужно выделить их так на маске, что бы граница
не была резкой. Для вычисления границ используются данные из слоев colorId и colorId
+ AA. В случаях когда рядом с пикселем граничат лишь 2 colorId, проблем с расчетом
пропорций нет. Проблема когда 2+.

Варианты с блюрами\и различными сглаживаниями не катят. Нужно повторить 1 в 1 то
что изображено на 3-й картинке, т.к. данный продукт используется в графике.
    


Ответы

Ответ 1



А почему бы не взять просто средневзвешенное? result.r = (A.R * weight_A + B.R * weight_B + C.R * weight_C) / (weight_A + weight_B + weight_C); и т. д. По результатам дискуссии в чате, выяснилось следующее. При сглаживании цветов цвет резцльтирующего пикселя будет (приближённо) оцениваться как средневзвешенное цветов исходных пикселей с некоторыми весовыми коэффициентами. Задача состоит в том, чтобы найти эти самые весовые коэффициенты. Причём под значением пикселя подразумевается его координаты в цветовом пространстве LAB (как ни странно, это имеет определённый физический смысл). Итак, вычисление. Пусть компоненты цветов A, B, C в цветовой модели LAB равны (x₁, y₁, z₁), (x₂, y₂, z₂), (x₃, y₃, z₃) соответственно, а компоненты результирующего цвета D — (x, y, z). Пусть неизвестные весовые коэффициенты равны α, β, γ. Имеем: α ⋅ (x₁, y₁, z₁) + β ⋅ (x₂, y₂, z₂) + γ ⋅ (x₃, y₃, z₃) = (x, y, z) Поскольку суммарный вес должен равняться 1, то α + β + γ = 1. Получаем систему α ⋅ x₁ + β ⋅ x₂ + γ ⋅ x₃ = x α ⋅ y₁ + β ⋅ y₂ + γ ⋅ y₃ = y α ⋅ z₁ + β ⋅ z₂ + γ ⋅ z₃ = z α + β + γ = 1 Поскольку точки должны лежать в одной плоскости, третье уравнение обязано быть следствием первых двух, убираем его. Заменяем γ = 1 − α − β, получаем: α ⋅ x₁ + β ⋅ x₂ + (1 − α − β) ⋅ x₃ = x α ⋅ y₁ + β ⋅ y₂ + (1 − α − β) ⋅ y₃ = y или α ⋅ (x₁ − x₃) + β ⋅ (x₂ − x₃) = x − x₃ α ⋅ (y₁ − y₃) + β ⋅ (y₂ − y₃) = y − y₃ Это система линейных уравнений с двумя неизвестными, решаем её стандартным образом.

Комментариев нет:

Отправить комментарий