#алгоритм #математика
Дано: 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₃ Это система линейных уравнений с двумя неизвестными, решаем её стандартным образом.
Комментариев нет:
Отправить комментарий