美狐滤镜sdk技术(二):浅析基础颜色滤镜算法

[复制链接]
查看: 2505|回复: 0
发表于 2019-9-5 16:47:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
无论是日常拍照记录生活还是直播短视频应用场景下的视频拍摄,都离不开添加滤镜的步骤,虽然现阶段来看原质相机像素各方面性能都有质的提升,但是为了满足用户对照片或视频质感效果的需求,在APP中接入滤镜sdk成为了当下最流行的方式。而滤镜sdk技术也因此在业内逐渐受欢迎,本文以基础的颜色滤镜算法为主简单分享下相关内容。
什么是颜色滤镜
美狐滤镜sdk中所包含的颜色滤镜,其实也可以认为是调色滤镜,是最基础也是最常见的滤镜。即任何通过调节图像像素值的亮度、饱和度、对比度、色相等方法,所得到的不同于原图像颜色的效果,都可以看作是颜色滤镜。
颜色滤镜的实现原理
1.PS饱和度调节算法的实现原理
假设所使用图片原图像素为P,RGB颜色空间所对应的颜色分量为R/G/B,饱和度调整参数为saturation,范围是[-100,100],则可参考代码如下所示:
float k = saturation/100
rgbMin = min( K. G, B)
rgbMax = max( R, G, B)
delta = (rgbMax —rgbMin) /255 .0
f(delta = O)return RGB
vlaue = (rgbMax±rgbMin)/ 255
L = value /2
S = L < 0.5 ?(deltaIvalue) : delta 1(2 — value)
if (k>= 0)
{
alpha=k±S>=1?S: 1—k
alhpa = 1/alpha—1
}
else
{
alpha=k
}
RGB=RGB+(RGBL*255)*alpha
2.C语言实现
可供参考代码如下所示:
intf_Stauration(unsigned char* srcData, int width, int height, int stride, intsaturation)
{
      unsigned char* pSrc = srcData;
      int r, g, b, rgbMin, rgbMax;
      int k = saturation / 100.0f * 128;
      int alpha = 0;
      for(int j = 0; j < height; j++)
      {
           for(int i = 0; i < width; i++)
           {
                 r = pSrc[2];
                 g = pSrc[1];
                 b = pSrc[0];
                 rgbMin = MIN2(MIN2(r, g), b);
                 rgbMax = MAX2(MAX2(r, g), b);
                 int delta = (rgbMax - rgbMin);
                 int value = (rgbMax + rgbMin);
                 if(delta ==0)
                 {
                      pSrc += 4;
                      continue;
                 }               
                 int L = value >> 1;
                 int S = L < 128 ? (delta << 7) / value delta << 7) / (510 - value);
                 if(k >= 0)
                 {
                      alpha = k + S >= 128 ? S : 128 - k;
                      alpha = 128 * 128 / alpha - 128;
                 }
                 else
                      alpha = k;
                 r = r + ((r - L) * alpha >> 7);
                 g = g + ((g - L) * alpha >> 7);
                 b = b + ((b - L) * alpha >> 7);
                 pSrc[0] = CLIP3(b, 0, 255);
                 pSrc[1] = CLIP3(g, 0, 255);
                 pSrc[2] = CLIP3(r, 0, 255);
                 pSrc += 4;
           }
      }
      return 0;
}
3.颜色增强滤镜
可供参考代码如下所示:
intf_ColorFilter(unsigned char* srcData, int width, int height, int stride)
{
      return f_Saturation(srcData, width, height, stride, 41);
}
以上就是美狐滤镜sdk中关于制作颜色滤镜的大概流程,以PS模拟的滤镜效果并结合参考代码,这样一来在开发滤镜sdk的过程中就可以利用该算法程序(滤镜算法)去处理图片或视频。
声明:以上内容均为作者本人原创,转载需注明作者及原文链接,欢迎转载分享。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接


 
 
工作时间:
8:00-18:00
客服热线:
15368564009
客服微信