Страницы

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

воскресенье, 12 мая 2019 г.

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

Дано: 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-й картинке, т.к. данный продукт используется в графике.


Ответ

А почему бы не взять просто средневзвешенное?
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₃
Это система линейных уравнений с двумя неизвестными, решаем её стандартным образом.

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

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