Android GPU加速实现图像颜色传递(Color transfer)

来源:互联网 发布:狄仁杰魔术师皮肤优化 编辑:程序博客网 时间:2024/06/05 05:12

题记:

最近研究了使用opengl es在安卓上实现图像颜色传递。其要实现的效果是将一张图像的颜色特征传递给另外一幅目标图像。算法基于http://www.cs.utah.edu/~shirley/papers/ColorTransfer.pdf。基本思想是将图像转换到lab色彩空间,计算被转移图像和目标图像在该空间中的均值与色彩方差,之后将目标图像像素的lab值减去该图像的lab均值,再乘以被转移图像方差与目标图像的方差比值,最后加上被转移图像的lab均值。计算结束后,将图像从lab转换到rgb颜色空间进行显示。

该算法在pc上可以使用cpu进行计算,但是在手机上只是使用cpu需要消耗很长的时间,尤其该算法需要至少5次遍历图像像素,即便提前计算出被转移图像的lab空间均值与方差,依旧需要3次图像像素遍历(目标图像计算均值遍历一次,计算方差遍历一次,还原rgb计算一次),同时该算法遍历图像时需要进行log和pow运算,该两项运算又是极为耗时。在实现GPU版本之前,本人先实现了安卓上的cpu版本(native层实现处理),其中log和pow运算使用查表方式,但是处理一张1080*720的图像依旧需要300ms。这在用户体验上是不可接受的,尤其为了更方便用户的操作,本人对于原算法进行了一点改进,在最后一步加被转移图像均值时(假设为 meanSource),用户可以实时的在(0 - 2 * meanSource)中进行选择,其意义为将该图像有多么偏向于被转移图像。用户在拖动seekbar时需要进行实时计算最终结果,而这即只能提供40-50ms,所以最终只能考虑使用gpu加速进行实现。

最终效果图如下图:最下面一排为被转移图像或者可以称为自定义滤镜,下面这张图像使用了最左边的作为自定义滤镜。


1. 搭建Android gpu图像处理加速框架

在安卓上使用opengles进行绘制比较简单,


0 0
原创粉丝点击