上一章加载图片的过程,在这里就不做赘述。
之前我们通过YUV数据格式的处理知道,只要保留Y的数据,就是灰度的图片。但是OpenGL中处理的是RGB格式的数据,我们要如何去取得灰度图呢?
我们可以通过公式,计算出新的RGB值,就是灰度的图片了。
我们的目标已经确定。下面我们需要将片段着色器上的每个像素的RGB值,通过上面的公式计算,装换成我们的灰度值。
根据上面的思路,我们需要去改片元着色器。 texture_fragment_shader.glsl
对比之前的,需要是有如下的修改点:
按照之前的想法,我们需要将我们的公式中的系数传递进入,就可以完成我们的 *** 作了。基于之前的认识,我们知道传递我们的属性 uniform 给OpenGL的都是通过创建数组,绑定属性,这一套流程。
与上面的黑白色的处理相似,冷色调的处理就是单一增加蓝色通道的值,暖色调的处理可以增加红绿通道的值。
不管是冷色还是暖色。每个像素的颜色都和我们传入的色值相加,产生偏置之后的颜色。同时还要确保颜色的值合法。如果超过最大,或者小于最小,就用极限值表示。
还是之前的套路。
红黄通道增加的结果
蓝色通道增加的结果
图片模糊处理相对上面的色调处理稍微复杂一点,通常图片模糊处理是采集周边多个点,
然后利用这些点的色彩和这个点自身的色彩进行计算,得到一个新的色彩值作为目标色彩。
模糊处理有很多算法,类似高斯模糊、径向模糊等等。
最常用的还是高斯模糊。先看一下高斯模糊的原理。
使用正态分布作为权重分配模式,对周围像素取平均值的方式,就是高斯模糊。
在图形上,正态分布是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小。
计算平均值的时候,我们只需要将"中心点"作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。
上面的正态分布是一维的,图像都是二维的,所以我们需要二维的正态分布。
二维高斯函数:
有了这个函数 ,就可以计算每个点的权重了。
为了计算权重矩阵,需要设定σ的值。假定σ=1.5,则 模糊半径为1 的权重矩阵,权重之和等于1,得到最终的权重矩阵。
对所有点重复这个过程,就得到了高斯模糊后的图像。如果原图是彩色图片,可以对RGB三个通道分别做高斯模糊。
如果一个点处于边界,周边没有足够的点,怎么办?
一个变通方法,就是把已有的点拷贝到另一面的对应位置,模拟出完整的矩阵。
上面着色器。我们是计算好了卷积核,直接在 shader 内写死应用的。
这一小节的内容耗时比较长。其实就是利用OpenGL的shader对图像进行简单的滤镜处理。
从这节我们学习到
下一章,会回到Android的内容。将OpenGl和Camera结合在一起。通过OpenGl来显示一个预览的画面。
[13:45:57]很抱歉,安卓系统无法调用苹果滤镜。苹果滤镜是苹果手机自带的功能,只能在苹果设备上使用。如果您想在安卓设备上使用类似的滤镜,可以尝试使用一些第三方滤镜应用,如VSCO、Snapseed等。这些应用可供下载,并可在Google Play商店中获得。您可以通过这些应用来调整照片颜色和光线等效果,以达到与苹果滤镜相似的效果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)