前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >照片处理-饱和度调节

照片处理-饱和度调节

作者头像
公号sumsmile
发布2020-11-03 10:14:32
1.2K0
发布2020-11-03 10:14:32
举报

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

一、饱和度与明度的定义

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

饱和度调节

明度调节

饱和度与明度的关联性:

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

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

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

当前饱和度为:

L为明度

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

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

实现效果

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

代码语言:javascript
复制
#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;
};
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、饱和度与明度的定义
    • 饱和度与明度的关联性:
    • 二、调节饱和度的算法原理
      • 当前饱和度为:
        • 根据设置的饱和度s,反求出新的RGB值
        • 三、调节饱和度的代码实现
        相关产品与服务
        图片处理
        图片处理(Image Processing,IP)是由腾讯云数据万象提供的丰富的图片处理服务,广泛应用于腾讯内部各产品。支持对腾讯云对象存储 COS 或第三方源的图片进行处理,提供基础处理能力(图片裁剪、转格式、缩放、打水印等)、图片瘦身能力(Guetzli 压缩、AVIF 转码压缩)、盲水印版权保护能力,同时支持先进的图像 AI 功能(图像增强、图像标签、图像评分、图像修复、商品抠图等),满足多种业务场景下的图片处理需求。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档