OpenGL Shader-图像灰度化

1,266 阅读2分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战

灰度化

彩色图像转化为灰度图像的过程称之为图像灰度化处理。彩色图像中每个像素颜色由RGB三个分量决定,简单称之为三原色(RedGreenBlue),每个分量取值区间在[0,255]。因此一个像素可以由1600多万颜色变化范围(255255255)。

灰度图像是RGB三个分量相同的特殊彩色图像,一个像素的变化范围是255,像素值最大255为白色,反之最小0为黑色。一般灰度图像的应用场景是为了减少图像计算量而特意去处理成灰度图的,像素范围小了计算量自然也就小了。图像灰度化处理可以作为图像处理的预处理步骤,也是为之后图像分割、图像识别和分析做前期准备。

实现方法

对于灰度图像处理一般有四种方法:平均值法、加权平均值法、最大值、分量法。

void main() {
    vec2 uv = gl_FragCoord.xy / iResolution.xy;
    vec3 col;
    vec4 color = texture(iChannel2,uv);
    // 平均值0.3
    float blackwhite = (color.r + color.g + color.b) * 0.3333;
    col = vec3(blackwhite);
    // 加权平均值 0.3 0.59 0.11
    blackwhite = dot(color.rgb,vec3(0.3,0.59,0.11));
    col = vec3(blackwhite);
    // 最大值
    blackwhite = max(color.r,color.g);
    blackwhite = max(blackwhite,color.b);
    col = vec3(blackwhite);
    // 分量法
     col = vec3(color.b);
     // https://zhuanlan.zhihu.com/p/148503720
    gl_FragColor = vec4(col,1.0);
}
原图灰度化
image.pngimage.png

平均值法

将彩色图像的RGB三分量颜色值相加求平均值,平均值作为灰度值。

float blackwhite = (color.r + color.g + color.b) * 0.3333;
col = vec3(blackwhite);

加权平均值法

加权平均值法是将RGB三分量以不同权值进行加权平均,由于人眼对于绿色比较敏感,对蓝色不太敏感。因此RGB三分量进行加权平均会采取不同比例值相加:0.3*R+0.59*G+0.11*B,绿色比重最大,蓝色最小。

blackwhite = dot(color.rgb,vec3(0.3,0.59,0.11));
col = vec3(blackwhite);

最大值

RGB三分量中取亮度最大值最为灰度图的灰度值。

blackwhite = max(color.r,color.g);
blackwhite = max(blackwhite,color.b);
col = vec3(blackwhite);

分量法

RGB三分量中选取一个任意一个分量作为灰度值。

col = vec3(color.b);
平均值法加权平均值法最大值分量法
image.pngimage.pngimage.pngimage.png

结尾

灰度化方法处理后的效果各不相同,但对于采用哪种灰度化方法根本目的是相同的就是将图像呈现为灰度图像。在图像处理和效果展示方面来说选取效果最佳的方法能够让图像呈现最佳效果,例如人文摄影采用黑白风格滤镜效果会更出众。