美文网首页
照片处理-饱和度调节

照片处理-饱和度调节

作者: 天叔 | 来源:发表于2020-10-31 23:12 被阅读0次

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

一、饱和度与明度的定义

一个彩色像素由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;
};

相关文章

  • 照片处理-饱和度调节

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

  • 用好这个功能,让你的照片更加耀眼!

    如果有张照片,你只想增加或者减少某种色彩怎么办?使用饱和度调节效果不理想怎么办?试试【色相饱和度】也许会让你的照片...

  • Swift 彩色照片转换成黑白照片

    使用滤镜调节照片的饱和度、亮度和对比度值,再调整曝光度实现效果: CIFilter的CIColorControls...

  • UnityShader-屏幕后处理之边缘检测

    一、屏幕后处理原理 我的另外一篇文章有详细的介绍:UnityShader-屏幕后处理(调节亮度,饱和度,对比度) ...

  • 通过“filter”来扒一扒CSS的美颜效果

    前言:之前,美颜相机还没流行的时候,初级美颜的版本,就是对照片的色彩,光影,阴影,对比度,透明度,饱和度进行调节,...

  • OpenGL 饱和度调节

    目录 一.OpenGL 饱和度调节效果演示[#%E4%B8%80OpenGL_%E9%A5%B1%E5%92%8C...

  • 饱和度调色Lightroom预设

    饱和度调色预设应用于Adobe lightroom后期图片处理软件,可增强照片的美感并加快您的照片编辑工作流程,非...

  • 后期能做的,只是锦上添花

    首先要先明确的是这里所说的后期指的是对照片的调色处理,调整或改变照片的白平衡、曝光、对比、饱和度等等数据,而并非 ...

  • 【自学水彩打卡】今天临摹是一片叶子

    其实原图颜色没有这么饱和,自己手机拍了照片,调节了下饱和度……水彩颜料用的是歌文,自己调色很渣,每天下班回家临摹一...

  • 克制欲望

    1 手机拍下的照片还是需要后期处理一下效果:调整对比度、调整饱和度等,让照片鲜亮,富有层次感。好比人要出门见客,梳...

网友评论

      本文标题:照片处理-饱和度调节

      本文链接:https://www.haomeiwen.com/subject/llwjvktx.html