专栏首页音视频技术学习笔记照片处理-饱和度调节

照片处理-饱和度调节

图片处理中,调节饱和度、明度、色相是非常常见的功能,这篇文章带你深入理解饱和度的调节,文末附录代码实现。

一、饱和度与明度的定义

一个彩色像素由RGB组成。 明度指RGB三通道的平均值,平局值越高明度越高。 饱和度指RGB三通道中最大值与最小值之差,差别越大,饱和度越大,颜色看起来越鲜艳。

饱和度调节

明度调节

饱和度与明度的关联性:

从饱和度、明度的定义来看,两个值的调节是相互影响的。参考下图,饱和度取最大值255时,就限制最大值、最小值分别为255和0,则明度值为127.5。明度值取最大值255或最小值0时,则最大值和最小值相同都是255或0,即饱和度为0。

二、调节饱和度的算法原理

上面介绍的是比较简单的理解,略去了细节,实际上HSV模型,是基于人的视觉感知来定义的,本没有公式计算 参考:孟塞尔颜色体系 饱和度的算法有很多种,这里介绍一种,设饱和度S的取值范围[-100, 100]。

当前饱和度为:

L为明度

联系上面明度和饱和度的关系曲线,就能理解为什么以128为分界线,有两个算法

根据设置的饱和度s,反求出新的RGB值

实现效果

三、调节饱和度的代码实现

#include"f_Saturation.h"
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<stdio.h>
#include"Commen.h"

int f_Saturation(unsigned char *srcData, int width, int height, int stride, int saturation)
{
    int ret = 0;
    if(saturation == 0)
        return ret;
    unsigned char* pSrc = srcData;
    int r, g, b, rgbMin, rgbMax;
    saturation = CLIP3(saturation,-100,100);
    int k = saturation / 100.0f * 128;
    int alpha = 0;
    int offset = stride - width * 4;
    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);
            // 饱和度为0,不处理
            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;
        }
        pSrc += offset;
    }
    return ret;
};

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 照片处理-几何滤镜实现哈哈镜

    几何滤镜比较简单,不涉及色彩模型,按照某种算法,对原图进行采样,得到一张新的图片。看起来就像是把原图进行了几何变形。 这篇文章通过两个简单的案例,更直观的感受...

    sumsmile
  • 图像处理基础-USM锐化

    上一篇讲拉普拉斯锐化,不能提供精细的调整,在photoshop中采用USM(Unsharp mask)可以进一步优化。目的是:

    sumsmile
  • 1. 解析Bitmap的ARGB,实现图片颜色选择器

    因为大小端的缘故,和我们理解的ARGB的顺序相反,大小端读者有兴趣可以深入了解,

    sumsmile
  • 剑指Offer面试题:5.重建二叉树

      在二叉树的前序遍历序列中,第一个数字总是树的根结点的值。但在中序遍历序列中,根结点的值在序列的中间,左子树的结点的值位于根结点的值的左边,而右子树的结点的值...

    Edison Zhou
  • Web开发纠结于编程语言是非常不必要的

    Java学习123
  • 方块转换 Transformations

    分析:大模拟,不好写且麻烦,不过有些细节可以优化一下 不难看出顺时针转90,180=90*2,270=90*3的关系,所以只要写一个转90度的函数即可,只要镜像...

    glm233
  • Google是否投资你,得看AI支持不支持

    GV,全称Google Ventures,Alphabet旗下风险投资资金,2009年正式成立,是首批聘用工程师的VC机构,原先主要为了配合Google战略协同...

    量子位
  • 【每日算法Day 88】超越妹妹教你如何做这道排序题

    给定一个整数数组,编写一个函数,找出索引 m 和 n,只要将索引区间 [m, n] 的元素排好序,整个数组就是有序的。注意:n-m 尽量最小,也就是说,找出符合...

    godweiyang
  • 【每日算法Day 83】邻居小孩一年级就会的乘法表,你会吗?

    给定高度 、宽度 的一张 的乘法表,以及正整数 ,你需要返回表中第 小的数字。

    godweiyang
  • 图解 Map、Reduce 和 Filter 数组方法

    map、reduce 和 filter 是三个非常实用的 JavaScript 数组方法,赋予了开发者四两拨千斤的能力。我们直接进入正题,看看如何使用(并记住)...

    grain先森

扫码关注云+社区

领取腾讯云代金券