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

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

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

Выход с изменением оттенка Изображение *

Требуемый выход Изображение **

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

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

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

Ответы [ 5 ]

3 голосов
/ 26 марта 2011

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

3 голосов
/ 23 марта 2011

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

Hue Rotation While Preserving Luminance

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

2 голосов
/ 30 марта 2011

Я сделал быстрый пример во 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}});
}
2 голосов
/ 26 марта 2011

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

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

1 голос
/ 23 марта 2011

вот быстрый способ сделать это, если вы хотите установить оттенок, скажем, 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];

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

...