Shader实验室:图片灰度化

Number of views 326

image.png

概念

灰度化处理就是将一幅彩色图像转化为灰度图像的过程。彩色图像分为R,G,B三个分量,分别显示出红绿蓝等各种颜色,灰度化就是使彩色图像的R,G,B分量相等的过程。灰度值大的像素点比较亮(像素颜色值最大为255,为白色),反之比较暗(像素颜色值最小为0,为黑色)。

目的

前面说到将彩色图像转化为灰度图像的过程是图像的灰度化处理过程。彩色图像中的每个像素的颜色由R,G,B三个分量决定,而每个分量中可取值0-255,这样一个像素点可以有1600多万(256256256=16777216)的颜色的变化范围。而灰度图像是R,G,B三个分量相同的一种特殊的彩色图像,其中一个像素点的变化范围为256种,所以在数字图像处理中一般将各种格式的图像转化为灰度图像,使得后续的图像的计算量少一些。灰度图像的描述与彩色图像一样仍然反映了整副图像的整体和局部的色度和高亮等级的分布与特征。现在大部分的彩色图像都是采用RGB颜色模式,处理图像的时候,要分别对RGB三种分量进行处理,实际上RGB并不能反映图像的形态特征,只是从光学的原理上进行颜色的调配。图像灰度化处理可以作为图像处理的预处理步骤,为之后的图像分割、图像识别和图像分析等上层操作做准备。

处理

对灰度图像的处理一般有以下四种方法:

1.分量法,该方法将彩色图像中的三分量的亮度作为三个灰度图像的灰度值,可根据应用需要选取一种灰度图像。即:可以选取RGB中的任一颜色通道作为灰度值。公式为:GrayScale1 = R,GrayScale2=G,GrayScale3=B

2.最大值法,该方法将彩色图像中的三分量亮度的最大值作为灰度图的灰度值,一般的,该方法求取后的灰度图亮度最高。公式为:GrayScale=max(R,G,B)

3.平均值法,该方法将彩色图像中的RGB三分量的颜色值来求取平均值作为灰度值。公式为:GrayScale=(R+G+B)/3

4.加权平均法,该方法根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到相对合理的灰度图像。公式为:GrayScale=0.299R+0.578G+0.114*B

实验

下面进入实验阶段,打开Unity新建Unlit Shader,打开该Shader文件后,定位至frag函数位置。我们将对如下图片进行处理(尽量选择明暗变化比较明显的图片作为实验图片)

分量法
分量法实验,把frag函数修改为如下代码:

fixed4 frag (v2f i) : SV_Target {    
    // sample the texture    
    fixed4 col = tex2D(_MainTex, i.uv);    
    col.rgb = fixed3(col.r, col.r, col.r);    
    // apply fog    
    UNITY_APPLY_FOG(i.fogCoord, col);    
    return col; 
}

赋予实验图片后的效果如下(这里只对R颜色通道进行分量取值,其余通道可自行尝试):
image.png

最大值法
最大值法实验,把frag函数修改为如下代码:

fixed4 frag (v2f i) : SV_Target {    
    // sample the texture    
    fixed4 col = tex2D(_MainTex, i.uv);    
    fixed maxV = max(max(col.r,col.g),col.b);    
    col.rgb = fixed3(maxV, maxV, maxV);    
    // apply fog    
    UNITY_APPLY_FOG(i.fogCoord, col);    
    return col; 
}

实验结果如下(可明显看出亮度比上一张图片更高):
image.png

平均值法
平均值法实验,把frag函数修改为如下代码:

fixed4 frag (v2f i) : SV_Target {    
    // sample the texture    
    fixed4 col = tex2D(_MainTex, i.uv);    
    fixed val = (col.r+col.g+col.b) / 3.0;    
    col.rgb = fixed3(val, val, val);    
    // apply fog    
    UNITY_APPLY_FOG(i.fogCoord, col);    
    return col; 
}

实验结果如下(该方法会使灰度图看上去更加柔和):
image.png

加权平均法
加权平均法, 把frag函数修改为如下代码:

fixed4 frag (v2f i) : SV_Target {     
    // sample the texture     
    fixed4 col = tex2D(_MainTex, i.uv);     
    fixed val = 0.299*col.r+0.578*col.g+0.114*col.b;     
    col.rgb = fixed3(val, val, val);     
    // apply fog     
    UNITY_APPLY_FOG(i.fogCoord, col);     
    return col; 
}

实验结果如下(相对合理):
image.png

我们仅仅简单的对灰度图的算法进行分析,如果觉得有用,就用微信扫描下面的二维码,关注我们吧!
8cm.jpg

0 Answers