iOS RGB 黑白滤镜

图片每一个像素的颜色值是由R G B 三种混合的。灰度照片只有256种颜色,要想把彩色照片变成灰度照片,就需要把彩色照片的颜色值RGB
设置为一样的,这样原来的256256256就变成256种了,图片丢失彩色信息,只剩下亮度值,视觉上的效果就是灰色图片。

一般灰度处理方法。

1.取RGB中最大值:R=G=B=Max(R,G,B);(ps:这样处理后的图片看起来亮度值偏高)

2.取RGB中平均值:R=G=B=(R+G+B)/3; (ps:这样处理后的图片比较柔和)

3.取RGB的加权平均值:R=G=B=(R×r+G×g+B×b),一般权重 G 最高,R其次,B最低.只需要RGB转YUV Y数据就行了,
Y = 0.299R + 0.587G + 0.114B

补充:在YUV中,“Y”代表明亮度(Luminance或Luma),也就是灰阶值;
而“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,
用于指定像素的颜色。
“亮度”是通过RGB输入信号来创建的,方法是将RGB信号的特定部分叠加到一起。
“色度”则定义了颜色的两个方面——色调与饱和度,分别用Cr和Cb来表示。
其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异,
而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异,
此即所谓的色差信号,也就是我们常说的分量信号(Y、R-Y、B-Y)。
在专业领域了,“Y CB CR”表示数字色差信号而不是模拟色差信号。
色差信号Y,R-Y,B-Y信号一般通称为Y, Cr,Cb; 习惯上Y,Cr,Cb为数字(PCM)的色差信号,
模拟的色差信号则称Y,Pr,Pb,所以我们常在DVD Player的内部看到Y,Cr,Cb
而在DVD Player的外部看到色差输出标示为Y,Pr,Pb或YUV;
YUV则是在欧洲电视系统PAL中的色差信号的通称,包含数字及模拟的色差信号都称YUV,
所以当您看到YUV时您就要联想到它是PAL系统中的Y,R-Y,B-Y信号,
它可能是数字(PCM)的YUV,也可能是模拟的YUV。

下面是一段openGL中实现黑白效果的shader脚本代码:
vsh代码片段

1
2
3
4
5
6
7
8
9
10
attribute vec4 position;
attribute vec4 inputTextureCoordinate;
varying vec2 textureCoordinate;
void main()
{
gl_Position = position;
textureCoordinate = inputTextureCoordinate.xy;
}

fsh代码片段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
precision highp float;
varying vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
const highp vec3 W = vec3(0.2125, 0.7154, 0.0721);
void main()
{
lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
//dot 加权平均luminance=r*0.2125+g*0.7154+b*0.0721
float luminance = dot(textureColor.rgb, W);
gl_FragColor = vec4(vec3(luminance), textureColor.a);
}