Можно ли программно раскрасить изображение?

В моих "самых смелых мечтах" я хотел бы передать изображение такому методу (псевдо C#):

string pathToOriginalImg = @"http://commons.wikimedia.org/wiki/File:Mark_Twain_by_AF_Bradley.jpg";
Image colorizedImg = new ColorizeImage(pathToOriginalImg, [array of colors]);

IOW, передайте путь изображения, которое нужно раскрасить, методу вместе с массивом цветов, которые вы хотите использовать при раскрашивании. Например, если бы я хотел "испанизировать" это изображение Марка Твена, я мог бы передать ему цвета флагов Испании и Мексики, что-то вроде: Forest Green, White, MexicanRed; ИспанскийКрасный, Желтый.

Возможно ли это, или мне не хватает одного бревна в каюте даже для желающих?

4 ответа

Решение

Это возможно, но довольно сложно...

Прежде всего вам нужно перевести цвета вашего изображения в другое цветовое пространство. RGB не обладает характеристиками человеческого восприятия цветов, если можно так выразиться. Поэтому, если вы хотите получить красивый результат, вам нужно использовать другой (например, HSL).

Смотрите здесь для различных цветовых пространств: http://en.wikipedia.org/wiki/Color_space

С помощью HSL вы можете "переместить" некоторые цвета в другое значение, но сохраняя параметры яркости и насыщенности.

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

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

Это широкое объяснение того, как вы могли этого достичь.

Я думаю, что эта ссылка может дать вам некоторую полезную информацию о цветовых манипуляциях в изображении, это может быть началом: Как гармонизировать цветное изображение

Также поиск в Google о Color harmonization мог бы дать вам несколько подсказок.

Я пробовал что-то подобное некоторое время назад, если у меня будет время, я найду его и смогу опубликовать используемый код. В моем коде есть несколько полезных инструментов для преобразования цветового пространства и тому подобное, он вообще не оптимизирован, но полезен, когда вы пытаетесь понять, как действовать дальше.

Ваше описание напоминает псевдоцвет, в котором исходные цвета сопоставляются с новыми цветами на основе шаблона сопоставления. Конечно, то, как вы будете отображать карту, полностью зависит от вас, и автоматизировать ее для каждого изображения таким образом, что это имеет смысл (каким-то образом), почти невозможно в лучшем случае. Однако вы можете определить некоторые общие правила, например, всегда пытаться отобразить зеленый цвет на одно из них, если они доступны: желтый, затем синий, а затем 58% шкалы яркости. Чтение здесь может дать вам дополнительные идеи. В качестве примера шаблона для 256-цветных изображений RGB в качестве исходного и 6-цветного для целевого изображения вы можете разделить 256 на 6, и для каждой "цветовой области" вы предоставляете новый цвет из целевого цветового массива. Результирующее изображение будет иметь только 6 цветов, и детали почти наверняка будут потеряны.

Если ваше изображение использует индексированные цвета и таблицу поиска цветов (LUT), вам нужно всего лишь изменить LUT, чтобы получить каждый пиксель, который использует этот индекс для изменения.

Ваше изображение, вероятно, не использует LUT, но вы можете использовать утилиту, чтобы использовать его. Что-то вроде ImageMagick (используйте команду "-colors") может сделать уменьшение цвета, а затем написать изображение на паллетах. Используйте LUT из другого изображения на первом, и у вас будет изменение цвета (для этого используйте команду ImageMagick "-clut").

Ответ на этот пост может помочь вам, для создания наложения поверх изображения, что наложение может быть вашим флагом или что вы хотите

Другие вопросы по тегам