大家好,我是图像处理的新手。我想在IOS上做一些换色滤镜,就像在photoshop中的“选择色”和“色彩平衡”一样。但是,我不知道这些令人敬畏的功能的算法。
我试过在Paint.Net的源代码中找到但不幸的是,PainDotNet没有这个功能。
通过色彩平衡,我尝试了这个链接color balance on the iPhone但结果并不好。这与photoshop的结果不同。
所以有人知道两种技术的算法:选择性颜色和色彩平衡吗?
谢谢你,对我复杂的演讲感到抱歉
答案 0 :(得分:2)
我已经试图找到一个解决方案2天了,得到了一些结果,但它们与Photoshop实现不同,我担心不完全正确。
我尝试接近它的方法是将RGB颜色转换为HSL颜色空间,然后沿不同的轴(青色/红色,黄色/蓝色,绿色/洋红色)调整色调和饱和度颜色值。 我通过使用笛卡尔坐标系而不是极坐标系来做到这一点,如下所述: http://en.wikipedia.org/wiki/HSL_and_HSV#Hue_and_chroma
我的想法是,在笛卡尔坐标空间(带有alpha和beta轴)中,更改alpha会导致沿着青色/红色轴修改颜色。通过同时修改alpha和beta可以实现沿黄/蓝轴改变颜色:
alpha = alpha + adjustment * cos(PI/3)
beta = beta + adjustment * sin(PI/3)
其他轴也可以这样做。 获得新的alpha和beta值后,您可以将它们转换为HSL,然后转换为RGB。
不幸的是,结果仍然与Photoshop实现不同。此外,我无法找到适当的方法来调整红色,黄色,中性色,黑色等,而不会触及其余颜色。
有没有人对如何实现这种调整有任何暗示?
更新
以下是关于GIMP和Photoshop中色彩平衡滤镜的讨论:
https://github.com/BradLarson/GPUImage/issues/193
以下是重新设置GIMP色彩平衡滤镜作为着色器的示例代码:
https://gist.github.com/3168961
它目前仅针对中间调实现,但对高光和阴影进行更改应该非常直接。
不幸的是,GIMP的色彩平衡滤镜提供了与Photoshop不同的结果:(
我为GPUImage框架创建了一个色彩平衡过滤器: https://github.com/liovch/GPUImage/commit/fcc85db4fdafae1d4e41313c96bb1cac54dc93b4
答案 1 :(得分:1)
也许这会有所帮助。我通过Pixel Bender将其写为photoshop和flash扩展 这是Adobe着色器语言,但它等同于任何其他着色器语言。 这大致是将Adobe ShaderLab转换为CG着色器语言。
Shader "Filters/ColorBalance"
{
Properties
{
_MainTex ("Main (RGB)", 2D) = "white" {}
// Red, Green, Blue
_Shadows ("shadows", Vector) = (0.0,0.0,0.0,0.0)
_Midtones ("midtones", Vector) = (0.0,0.0,0.0,0.0)
_Hilights ("hilights", Vector) = (0.0,0.0,0.0,0.0)
_Amount ("amount mix", Range (0.0, 1.0)) = 1.0
}
SubShader
{
Tags {"RenderType"="Transparent" "Queue"="Transparent"}
Lighting Off
Pass
{
ZWrite Off
Cull Off
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
sampler2D _MainTex;
uniform float4 _Shadows;
uniform float4 _Midtones;
uniform float4 _Hilights;
uniform float _Amount;
uniform float pi = 3.14159265358979;
struct appdata
{
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
float4 color : COLOR;
};
// vertex output
struct vertdata
{
float4 pos : SV_POSITION;
float2 texcoord : TEXCOORD0;
float4 color : COLOR;
};
vertdata vert(appdata ad)
{
vertdata o;
o.pos = mul(UNITY_MATRIX_MVP, ad.vertex);
o.texcoord = ad.texcoord;
o.color = ad.color;
return o;
}
fixed4 frag(vertdata i) : COLOR
{
float4 dst = tex2D(_MainTex, i.texcoord);
float intensity = (dst.r + dst.g + dst.b) * 0.333333333;
// Exponencial Shadows
float shadowsBleed = 1.0 - intensity;
shadowsBleed *= shadowsBleed;
shadowsBleed *= shadowsBleed;
// Exponencial midtones
float midtonesBleed = 1.0 - abs(-1.0 + intensity * 2.0);
midtonesBleed *= midtonesBleed;
midtonesBleed *= midtonesBleed;
// Exponencial Hilights
float hilightsBleed = intensity;
hilightsBleed *= hilightsBleed;
hilightsBleed *= hilightsBleed;
float3 colorization = dst.rgb + _Shadows.rgb * shadowsBleed +
_Midtones.rgb * midtonesBleed +
_Hilights.rgb * hilightsBleed;
dst.rgb = lerp(dst.rgb, colorization, _Amount);
return dst;
}
ENDCG
}
}
}
答案 2 :(得分:0)
关于色彩平衡,更改红色/青色调整的红色通道值,绿色为品红色/绿色,蓝色为黄色/蓝色。这解决了问题。
但是如同在photoshop中使用保留光度选项一样,我们必须保持一个像素的亮度不变(原始和颜色平衡像素)。
我阅读Gimp的源代码,它使用转换RGB解决了这个问题将新像素替换为HSL,将L替换为旧像素的L值,然后将新HSL转换回RGB。在平衡颜色的同时,该RGB值保持像素的亮度。但是,当我在GIMP上测试时,使用“保留光度”选项调整阴影和高光模式的颜色通道,这是错误的。
我很困惑如何确定阴影,中间色调或高亮?
答案 3 :(得分:0)
选择性色彩之谜
红色是颜色,由洋红色,黄色和黑色(无青色)组成。但是,如果选择红色范围并减少青色,则颜色会发生变化。