作者:爱干球的RD

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

一、饱和度与明度的定义

饱和度:饱和度指RGB三通道中最大值与最小值之差,差别越大,饱和度越大,颜色看起来越鲜艳。

颜色模型:颜色模型有很多种,RGB是一种解析明确的、对计算机友好的模型,但是不便于人去操作,在Munsell Color System模型下,把颜色转换成HSV的形式,方便调试饱和度,亮度。

(Munsell Color System)

先来感性认知明度和饱和度

明度不变,饱和度的极限情况:

饱和度不变,明度的极限情况:

饱和度与明度的关联性:

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

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

上面介绍的是比较直观的理解,略去了细节,下面看看具体的算法和代码。

饱和度的算法有很多,这里介绍一种,设饱和度S的取值范围[-100, 100]。

当前饱和度为:

(L为明度)

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

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

上面这个公式,我捉摸半天也没太懂,有懂的朋友,可以留言告知,3ks

(实现效果)

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

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;}elsealpha = 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;};

参考:

[1]https://zh.wikipedia.org/wiki/孟塞尔颜色系统

[2]图像视频滤镜与人像美颜美妆算法详解

java 调节color亮度算法_照片处理-饱和度调节相关推荐

  1. java矩阵连乘算法_使用java写的矩阵乘法实例(Strassen算法)

    Strassen算法于1969年由德国数学家Strassen提出,该方法引入七个中间变量,每个中间变量都只需要进行一次乘法运算.而朴素算法却需要进行8次乘法运算. 原理 Strassen算法的原理如下 ...

  2. java常见的hash算法_常见的哈希算法和用途

    写在前面 哈希算法经常会被用到,比如我们Go里面的map,Java的HashMap,目前最流行的缓存Redis都大量用到了哈希算法.它们支持把很多类型的数据进行哈希计算,我们实际使用的时候并不用考虑哈 ...

  3. JAVA 判断简单密码算法_十道简单算法题二【Java实现】

    前言 清明不小心就拖了两天没更了-- 这是十道算法题的第二篇了-上一篇回顾:十道简单算法题 最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下, ...

  4. java实现 k nn算法_数据挖掘(二)——Knn算法的java实现

    本文接数据挖掘-基于Kmeans算法.MBSAS算法及DBSCAN算法的newsgroup18828文本聚类器的JAVA实现(上). (update 2012.12.28 关于本项目下载及运行的常见问 ...

  5. java实现排程算法_康托展开算法和逆康托展开算法[Java实现]

    基于这篇介绍我实现了基于Java的算法 都能看懂的康托展开_ltrbless的博客-CSDN博客​blog.csdn.net 条件 一个数组:[1, 2, 3, 4, 5] 康托展开算法 找出 524 ...

  6. java迪杰斯特拉算法_迪杰斯特拉算法完整代码(Java)

    package com.rao.graph; import java.util.*; /** * @author Srao * @className Dijkstra * @date 2019/12/ ...

  7. java 哈希一致算法_一致哈希算法Java实现

    一致哈希算法(Consistent Hashing Algorithms)是一个分布式系统中常用的算法.传统的Hash算法当槽位(Slot)增减时,面临所有数据重新部署的问题,而一致哈希算法确可以保证 ...

  8. java 网页正文抽取算法_网页正文抽取算法 ContentExtractor

    软件介绍 简介 ContentExtractor 是一个开源的网页正文抽取工具,用JAVA实现,具有非常高的抽取精度. 算法 ContentExtractor的网页正文抽取算法使用的是CEPR,适用于 ...

  9. java token redis生成算法_如何访问 Redis 中的海量数据,服务才不会挂掉?

    来源:www.toutiao.com/i6697540366528152077 一.前言 有时候我们需要知道线上的Redis的使用情况,尤其需要知道一些前缀的key值,让我们怎么去查看呢?并且通常情况 ...

最新文章

  1. tmp ubuntu 自动删除吗_Linux tmp目录自动清理总结
  2. VLC视频播放器原理详细分析含TS流格式分析
  3. 生成特定分布随机数的方法:Python seed() 函数numpy scikit-learn随机数据生成
  4. EMUI10安装java_linux ubuntu系统安装java jdk和配置环境,pycharm安装
  5. Apollo进阶课程 ⑮丨Apollo自动定位技术详解—百度无人车定位技术
  6. nodejs从服务器返回静态文件,nodejs静态资源服务器
  7. 实用的 Python 包 —— 使用 win32 的剪贴板
  8. php模拟post提交
  9. C++test对多变参数的函数打桩处理技巧
  10. 大家崇拜凯文.米特尼克吗?
  11. 每个大主播都是满屏弹幕,怎么做到的?Python实战无限刷弹幕!
  12. 【2】CH347应用--在OpenOCD添加CH347-USB转JTAG接口
  13. java实现聊天室(websocket)
  14. win7时间同步出错
  15. 【深度好文】谈谈你对MyBatis的理解
  16. LEDE 源码下载与编译
  17. 基于西门子S7-1200PLC的步进电机控制
  18. 支付宝 收款通知 mysql_基于支付宝微信通知的一种个人收款回调方案(转)
  19. 【现代控制理论】传递函数建立状态空间表达式
  20. Scratch Blocks自定义组件之「点阵」

热门文章

  1. R语言简单的频数统计图
  2. 超便利!教你用ESP32开发板DIY掌上网页服务器!
  3. C++类成员函数指针使用介绍
  4. 什么是CUSDEC 报关单?
  5. iw在java中什么意思,请问程序里piw和iw有什么区别
  6. vertical-align属性的用法
  7. 计算机操作的提升,提升电脑操作的利器 鼠标快捷键解析
  8. 对element-upload二次封装文件图片上传
  9. 关于Ti的C2000芯片的CBC与OSHT做两级保护说明
  10. 2022年G1工业锅炉司炉操作证考试题库及模拟考试