Цветовой баланс с основным изображением - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь воссоздать «фильтр» из Photoshop с Core Image.Я получил более простые вещи, такие как экспозиция, вибрация, снижение тона, но не уверен, как воспроизвести цветовой баланс с тенями, полутонами, бликами.Я пробовал CIColorMatrix, но он не имеет такого же эффекта при настройке цветов соответствующих теней / средних тонов / бликов.CIHighlightShadowAdjust также не создает тот же цветовой эффект, что и цветовой баланс Photoshop.

Что я могу использовать для репликации этого цветового баланса Photoshop, как показано на скриншоте ниже?

photoshop color balance

Я добавлю сюда код, который я пробовал с colormatrix:

let colorFilter = CIFilter(name: "CIColorMatrix")
colorFilter?.setValue(gammaOutput, forKey: kCIInputImageKey)
colorFilter?.setValue(CIVector.init(x: 0.9, y: 0, z: 0, w: 0), forKey: "inputRVector")
colorFilter?.setValue(CIVector.init(x: 0, y: 1.1, z: 0, w: 0), forKey: "inputGVector")
colorFilter?.setValue(CIVector.init(x: 0, y: 0, z: 1.2, w: 0), forKey: "inputBVector")
colorFilter?.setValue(CIVector.init(x: 0, y: 0, z: 0, w: 1), forKey: "inputAVector")
colorFilter?.setValue(CIVector.init(x: 0, y: 0, z: 0, w: 0), forKey: "inputBiasVector")

1 Ответ

0 голосов
/ 28 мая 2018

Core Image также позволяет разрабатывать собственные фильтры изображений.Так называемые пользовательские ядра (CIKernel) - это небольшие программы, написанные на диалекте языка шейдинга OpenGL (GLSL) для запуска вашего пользовательского фильтра на графическом процессоре.

Photoshop является закрытым исходным кодом, и неясно, какой алгоритм они используют, но GIMP имеет функцию цветового баланса и является открытым исходным кодом.

Реализация может быть найдена здесь: https://github.com/GNOME/gimp/blob/master/app/operations/gimpoperationcolorbalance.c

Теперь нам нужно перевести это в GLSL.

К счастью, австралийский разработчик уже сделал это, см. https://gist.github.com/liovch/3168961#file-gistfile1-m-L4

Чтобы быстро проверить, дает ли это ожидаемый результат, можно просто использовать классную утилиту от Apple под названием Quartz Composer.Вы можете скачать его с сайта разработчика Apple, он скрыт в Дополнительные инструменты для Xcode 9.3.dmg .

Там вы выбираете «Фильтр изображения» в качестве шаблона, удаляете все узлы рядом с вводом ивыходное изображение.Из библиотеки добавьте «Core Image Filter».Затем выберите фильтр и нажмите CMD-2.Теперь вы должны увидеть инспектора с редактором кода, который показывает простую общую процедуру ядра Core Image (CIKernel).

Поскольку нам просто необходим доступ к соответствующему исходному пикселю, а не ко всему изображению, мы можем использовать болееспецифический CIColorKernel вместо функции CIKernel.

Дополнительные функции могут быть просто добавлены в функцию ядра.

Учитывая код из файла gist, который выше основан на подпрограммах цветового баланса GIMP, одинМожно скопировать вспомогательные функции RGBToL, RGBToHSL, HueToRGB, HSLToRGB.Затем есть фактическая функция CIColorKernel, где мы только что адаптировали сигнатуру функции и возвращаемое значение:

/* based on GIMP's color balance routine */
kernel vec4 balanceFilter(__sample textureColor,             
                             float redShift,
                             float greenShift,
                             float blueShift) {

    lowp float lightness = RGBToL(textureColor.rgb);
    lowp vec3 shift = vec3(redShift, greenShift, blueShift);

    const lowp float a = 0.25;
    const lowp float b = 0.333;
    const lowp float scale = 0.7;

    lowp vec3 midtones = (clamp((lightness - b) /  a + 0.5, 0.0, 1.0) * clamp ((lightness + b - 1.0) / -a + 0.5, 0.0, 1.0) * scale) * shift;

    lowp vec3 newColor = textureColor.rgb + midtones;
    newColor = clamp(newColor, 0.0, 1.0);

    lowp vec3 newHSL = RGBToHSL(newColor);
    lowp float oldLum = RGBToL(textureColor.rgb);
    textureColor.rgb = HSLToRGB(vec3(newHSL.x, newHSL.y, oldLum));

    return textureColor;
}

Когда код введен, он компилируется автоматически.Затем вы можете подключить узлы в Composer, см. Скриншот.Выбрав узел фильтра, вы можете использовать CMD-1 для переключения на инспектор ввода.Composer автоматически создает пользовательский интерфейс с параметрами redShift, greenShift и blueShift, например, если вы введете -0,64 для greenShift, вы увидите такой результат:

Quartz Composer with Customer Image Filter

Некоторыедополнительные примечания:

  • исходный код из GIMP.Если вы хотите использовать это, пожалуйста, прочитайте лицензию GIMP
  • , результаты GIMP могут сильно отличаться от Photoshop, я не знаю, но все же может быть хорошей отправной точкой для собственных экспериментов
  • очевидно, что реализация из GIST предназначена только для средних тонов, но со ссылкой на исходный код GIMP должно быть легко расширить тени и блики
  • чтобы использовать ядро ​​в приложении iOS, вам нужно обернутькод ядра в виде строки и подача его в конструктор CIColorKernel
...