java 调节color亮度算法_照片处理-饱和度调节
作者:爱干球的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亮度算法_照片处理-饱和度调节相关推荐
- java矩阵连乘算法_使用java写的矩阵乘法实例(Strassen算法)
Strassen算法于1969年由德国数学家Strassen提出,该方法引入七个中间变量,每个中间变量都只需要进行一次乘法运算.而朴素算法却需要进行8次乘法运算. 原理 Strassen算法的原理如下 ...
- java常见的hash算法_常见的哈希算法和用途
写在前面 哈希算法经常会被用到,比如我们Go里面的map,Java的HashMap,目前最流行的缓存Redis都大量用到了哈希算法.它们支持把很多类型的数据进行哈希计算,我们实际使用的时候并不用考虑哈 ...
- JAVA 判断简单密码算法_十道简单算法题二【Java实现】
前言 清明不小心就拖了两天没更了-- 这是十道算法题的第二篇了-上一篇回顾:十道简单算法题 最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下, ...
- java实现 k nn算法_数据挖掘(二)——Knn算法的java实现
本文接数据挖掘-基于Kmeans算法.MBSAS算法及DBSCAN算法的newsgroup18828文本聚类器的JAVA实现(上). (update 2012.12.28 关于本项目下载及运行的常见问 ...
- java实现排程算法_康托展开算法和逆康托展开算法[Java实现]
基于这篇介绍我实现了基于Java的算法 都能看懂的康托展开_ltrbless的博客-CSDN博客blog.csdn.net 条件 一个数组:[1, 2, 3, 4, 5] 康托展开算法 找出 524 ...
- java迪杰斯特拉算法_迪杰斯特拉算法完整代码(Java)
package com.rao.graph; import java.util.*; /** * @author Srao * @className Dijkstra * @date 2019/12/ ...
- java 哈希一致算法_一致哈希算法Java实现
一致哈希算法(Consistent Hashing Algorithms)是一个分布式系统中常用的算法.传统的Hash算法当槽位(Slot)增减时,面临所有数据重新部署的问题,而一致哈希算法确可以保证 ...
- java 网页正文抽取算法_网页正文抽取算法 ContentExtractor
软件介绍 简介 ContentExtractor 是一个开源的网页正文抽取工具,用JAVA实现,具有非常高的抽取精度. 算法 ContentExtractor的网页正文抽取算法使用的是CEPR,适用于 ...
- java token redis生成算法_如何访问 Redis 中的海量数据,服务才不会挂掉?
来源:www.toutiao.com/i6697540366528152077 一.前言 有时候我们需要知道线上的Redis的使用情况,尤其需要知道一些前缀的key值,让我们怎么去查看呢?并且通常情况 ...
最新文章
- tmp ubuntu 自动删除吗_Linux tmp目录自动清理总结
- VLC视频播放器原理详细分析含TS流格式分析
- 生成特定分布随机数的方法:Python seed() 函数numpy scikit-learn随机数据生成
- EMUI10安装java_linux ubuntu系统安装java jdk和配置环境,pycharm安装
- Apollo进阶课程 ⑮丨Apollo自动定位技术详解—百度无人车定位技术
- nodejs从服务器返回静态文件,nodejs静态资源服务器
- 实用的 Python 包 —— 使用 win32 的剪贴板
- php模拟post提交
- C++test对多变参数的函数打桩处理技巧
- 大家崇拜凯文.米特尼克吗?
- 每个大主播都是满屏弹幕,怎么做到的?Python实战无限刷弹幕!
- 【2】CH347应用--在OpenOCD添加CH347-USB转JTAG接口
- java实现聊天室(websocket)
- win7时间同步出错
- 【深度好文】谈谈你对MyBatis的理解
- LEDE 源码下载与编译
- 基于西门子S7-1200PLC的步进电机控制
- 支付宝 收款通知 mysql_基于支付宝微信通知的一种个人收款回调方案(转)
- 【现代控制理论】传递函数建立状态空间表达式
- Scratch Blocks自定义组件之「点阵」