2016-02-13 6 views
0

Я пытаюсь использовать CIColorMatrix в Swift на iOS, и я придумываю результат, который не соответствует моему пониманию того, как он должен работать.CIColorMatrix math не имеет смысла

documentation определяет его как:

s.r = dot(s, redVector) 
s.g = dot(s, greenVector) 
s.b = dot(s, blueVector) 
s.a = dot(s, alphaVector) 
s = s + bias 

Так скажем, у меня есть входной пиксель со значениями RGBA [255, 0, 0, 255] (100% красного). И я применяю вектор [0,5, 0, 0, 0] к красному каналу. Не должно ли это иметь значение красного канала ?

(255*0.5)+(0*0)+(0*0)+(255*0) = 127.5 

По какой-то причине, с этими значениями, CIColorMatrix дает мне значение . Разве это не определение dot(), о котором они говорят?

Вот фрагмент кода (входное изображение все красное).

// Before this, the RGB values are [255, 0, 0] 
let vec = CIVector(x: 0.5, y: 0, z: 0, w: 0) 
let filter = CIFilter(name: "CIColorMatrix") 
filter!.setDefaults() 
// Default bias is [0,0,0,0] (explicitly setting it as such doesn't change the result). 
filter!.setValue(myImage, forKey: kCIInputImageKey) 
filter!.setValue(vec, forKey: "inputRVector") 
// After this, the RGB values are [187, 0, 0] 

Что мне не хватает или непонимаю здесь?

+0

Я понял, что после того, как я разместил это, возможно, что-то возится со значениями после запуска фильтра CIColorMatrix. Я конвертирую CIImage в CGImage с CIContext createCGImage(), и именно там я беру выборку значений пикселей. Существует ли какое-то отображение тонов или гамма-кривая, которые применяются на этом этапе? Я не могу найти ничего об этом в документах. – Wouldchux

ответ

1

Все фильтры Core Image работают в рабочем цветовом пространстве CIContext, выполняющих их. Зерна фильтров также работают с альфа-несогласованными значениями пикселей, тогда как выход фильтра предварительно умножается. Если вы видите результаты, которых вы не ожидаете, убедитесь, что ваши рабочие и выходные цветовые пространства настроены так, как вы того захотите, и убедитесь, что вы не делаете ничего смешного с альфа-преумножением.

1

Еще одна оговорка в фильтре CIColorMatrix заключается в том, что ее параметры применяются к un-premultiplied цвета. Таким образом, в действительности ядро ​​ведет себя так, как будто его код выглядит следующим образом:

s = unpremultiply(s) 
s.r = dot(s, redVector) 
s.g = dot(s, greenVector) 
s.b = dot(s, blueVector) 
s.a = dot(s, alphaVector) 
s = s + bias 
s = premultiply(s) 

Если ваши цвета непрозрачны (как с примером [255, 0, 0, 255]), то unpremultiply/предварительным умножением не имеет никакого эффекта.