Как установить одинаковое (постоянное) значение оттенка для каждого пикселя изображения с помощью ColorMatrix?

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

Входное изображение

Сдвиг оттенка выходного изображения *

Желаемый вывод изображения **

* Это можно сделать с помощью цветовой матрицы

** Я могу сделать это с итерацией пикселей, но не с ColorMatrix

PS: я пытаюсь сделать это на Android, но я считаю, что вопрос не имеет прямого отношения к Android, так как подход ColorMatrix распространен на других платформах, таких как Flash, C# и т. Д.

5 ответов

Посмотрите QColorMatrix, в котором есть подпрограмма ColorMatrix, которая называется RotateHue, Исходный код написан на C++, но переносим на другие языки (в прошлом я перенес часть этого на.NET, и он отлично работал).

Не очень знакомый здесь, но я верю, что эта ссылка может помочь: http://www.graficaobscura.com/matrix/index.html это код c, так что вы должны перевести C -> ColorMatrix, но в последнем абзаце есть операция

Hue Rotation While Preserving Luminance

что кажется, что вы ищете.

Я не думаю, что есть способ сделать именно то, что вы просите с помощью ColorMatrix. Похоже, что вы хотите сделать, это преобразовать из цветового пространства RGB в HSL, установить постоянную H для всех пикселей и вернуться обратно из HSL в RGB. Эти преобразования цветового пространства не являются линейными и не могут быть представлены матрицами. Из-за разного способа, которым эти пространства параметризуют цвет, я также подозреваю, что при RGB->HSL->RGB может произойти некоторое ухудшение.

Я думаю, что самое близкое, что вы могли бы достичь с помощью ColorMatrix - это использовать один для преобразования в оттенки серого, а другой - для взвешивания значений RGB (подкрасить их). Такого рода вещи часто используются для создания поддельных фотографий в оттенках сепии, но это не то, о чем вы просите.

Я сделал быстрый пример во Flash (этот вопрос помечен как ActionScript), но не уверен, что это то, что вы ищете:

http://megaswf.com/serve/1047061

Код:

import com.greensock.*; 
import com.greensock.easing.*;
import flash.events.MouseEvent;

colorButton.addEventListener(MouseEvent.CLICK, onColor);
resetButton.addEventListener(MouseEvent.CLICK, onReset);

function onColor(e:MouseEvent):void {
    TweenMax.to(mc, 1, {colorMatrixFilter:{colorize:0x0099ff, amount:1}});
}

function onReset(e:MouseEvent):void {
    TweenMax.to(mc, 1, {colorMatrixFilter:{colorize:0x0099ff, amount:0}});
}

Вот быстрый способ сделать это, если вы хотите установить оттенок, скажем, h(0,5, 0,2, 0,3).

var matrix:Array = new Array();
matrix = matrix.concat([.5, .5, .5, 0, 0]);
matrix = matrix.concat([.2, .2, .2, 0, 0]);
matrix = matrix.concat([.3, .3, .3, 0, 0]);
matrix = matrix.concat([0, 0, 0, 1, 0]);
var filter:ColorMatrixFilter = new ColorMatrixFilter(matrix);

image.filters = [filter];

Я не уверен, что он будет уважать яркость, но он может удовлетворить ваши потребности!

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