精华内容
下载资源
问答
  • OpenCV——调整图片的对比度、亮度饱和度
    千次阅读
    2019-10-19 10:05:21
    一、图片的对比度和亮度调整
    1、原理:
    • f(row, col):原始图像的像素。
    • g(row, col):调整后图像的像素。
    • a(a>0:称为增益(gain),常常被用来控制图像的对比度,其取值范围一般为0.0-3.0
    • b:称为偏置(bias),常常被用来控制图像的亮度。
    • g(row, col) = a*f(row, col) + b:随原始图像进行对比度亮度调节的公式。
    • new_img.at<Vec3b> (row, col)[c]:opencv访问图片每个像素的语法。
    • saturate_cast<uchar>():防止溢出。当运算完之后,结果为负,则转为0,结果超出255,则为255。
    2、C++ OpenCV核心代码:

    遍历原始图片的每一个像素,对R,G,B分别使用公式进行变换。

    void contrast_bright (int, void*)
    {
    	contrastValue_f = 0.1 * contrastValue; // 为了使滑动条调节的幅度变大,把 contrastValue值进行缩小。
    	for (int row = 0; row < img.rows; row++)
    	{
    		for (int col = 0; col < img.cols; col++)
    		{
    			for (int c = 0; c < 3; c++) {
    				new_img.at<Vec3b> (row, col)[c] = saturate_cast<uchar>(contrastValue_f * (img.at<Vec3b> (row, col)[c]) + brightValue);  // g(x,y) = af(x,y) + b; a 是对比度调节,b是亮度调节
    			}
    		}
    	}
    	imshow ("Effect Image", new_img);
    }
    
    二、图片的饱和度调整

    网上关于图片饱和度调整的算法很多,不知道选择哪一个。所以就都试一遍看看哪个效果好。这里,参考了:https://blog.csdn.net/u012198575/article/details/82985482 这篇文章提及的算法,算法思路写的比较清楚。

    1、Photoshop饱和度调整思想(我也不知道是不是PS的~~):
    1. 计算每个像素点关于RGB的最大值,最小值。
    2. 设 delta 为两值的差 / 255,value为两值的和 / 255。
    3. 两值之差 delta 为0不做操作,即跳过该像素点。否则,进行下面操作:
    4. 把RGB图像转换成HSL图像(Hue:色彩,Saturability:饱和度,Light:亮度)
    5. light = value / 2,如果 light < 0.5, sat = delta / value;否则: sat = delta / (2-value);
    6. 最后根据增量判断做怎么样的处理,将转换后的新的RGB值存到新图片内。
    2、C++核心代码:
    void saturability (int, void*)
    {
    	float increment = (saturation - 80) * 1.0 / max_increment;
    	for (int col = 0; col < img.cols; col++)
    	{
    		for (int row = 0; row < img.rows; row++)
    		{
    			// R,G,B 分别对应数组中下标的 2,1,0
    			uchar r = img.at<Vec3b> (row, col)[2];		
    			uchar g = img.at<Vec3b> (row, col)[1];
    			uchar b = img.at<Vec3b> (row, col)[0];
    
    			float maxn = max (r, max (g, b));
    			float minn = min (r, min (g, b));
    
    			float delta, value;
    			delta = (maxn - minn) / 255;
    			value = (maxn + minn) / 255;
    
    			float new_r, new_g, new_b;
    
    			if (delta == 0)		 // 差为 0 不做操作,保存原像素点
    			{
    				new_img.at<Vec3b> (row, col)[0] = new_b;
    				new_img.at<Vec3b> (row, col)[1] = new_g;
    				new_img.at<Vec3b> (row, col)[2] = new_r;
    				continue;
    			}
    
    			float light, sat, alpha;
    			light = value / 2;
    
    			if (light < 0.5)
    				sat = delta / value;
    			else
    				sat = delta / (2 - value);
    
    			if (increment >= 0)
    			{
    				if ((increment + sat) >= 1)
    					alpha = sat;
    				else
    				{
    					alpha = 1 - increment;
    				}
    				alpha = 1 / alpha - 1;
    				new_r = r + (r - light * 255) * alpha;
    				new_g = g + (g - light * 255) * alpha;
    				new_b = b + (b - light * 255) * alpha;
    			}
    			else
    			{
    				alpha = increment;
    				new_r = light * 255 + (r - light * 255) * (1 + alpha);
    				new_g = light * 255 + (g - light * 255) * (1 + alpha);
    				new_b = light * 255 + (b - light * 255) * (1 + alpha);
    			}
    			new_img.at<Vec3b> (row, col)[0] = new_b;
    			new_img.at<Vec3b> (row, col)[1] = new_g;
    			new_img.at<Vec3b> (row, col)[2] = new_r;
    		}
    	}
    	imshow ("Effect Image", new_img);
    }
    
    三、OpenCV实现的图片的对比度、亮度、饱和度完整代码
    #include<iostream>
    #include<algorithm>
    #include<opencv2/core/core.hpp>
    #include<opencv2/imgproc/imgproc.hpp>
    #include<opencv2/highgui/highgui.hpp>
    #include <opencv2\imgproc\types_c.h>
    
    using namespace std;
    using namespace cv;
    
    int contrastValue;	// 对比度值
    float contrastValue_f; // 实际使用的对比度值,对contrastValue进行的缩小处理
    int brightValue;   // 亮度值
    int saturation;	// 饱和度
    const int max_increment = 200;
    Mat img, new_img;	   //img:原始图像; new_img:最终要展示图像;
    
    void contrast_bright (int, void*);
    void saturability (int, void*);
    
    // 调整对比度和亮度
    void contrast_bright (int, void*)
    {
    	contrastValue_f = 0.1 * contrastValue;
    	for (int row = 0; row < img.rows; row++)
    	{
    		for (int col = 0; col < img.cols; col++)
    		{
    			for (int c = 0; c < 3; c++) {
    				new_img.at<Vec3b> (row, col)[c] = saturate_cast<uchar>(contrastValue_f * (img.at<Vec3b> (row, col)[c]) + brightValue);  // g(x,y) = af(x,y) + b; a 是对比度调节,b是亮度调节
    			}
    		}
    	}
    	imshow ("Effect Image", new_img);
    }
    
    //调整饱和度
    void saturability (int, void*)
    {
    	float increment = (saturation - 80) * 1.0 / max_increment;
    	for (int col = 0; col < img.cols; col++)
    	{
    		for (int row = 0; row < img.rows; row++)
    		{
    			// R,G,B 分别对应数组中下标的 2,1,0
    			uchar r = img.at<Vec3b> (row, col)[2];		
    			uchar g = img.at<Vec3b> (row, col)[1];
    			uchar b = img.at<Vec3b> (row, col)[0];
    
    			float maxn = max (r, max (g, b));
    			float minn = min (r, min (g, b));
    
    			float delta, value;
    			delta = (maxn - minn) / 255;
    			value = (maxn + minn) / 255;
    
    			float new_r, new_g, new_b;
    
    			if (delta == 0)		 // 差为 0 不做操作,保存原像素点
    			{
    				new_img.at<Vec3b> (row, col)[0] = new_b;
    				new_img.at<Vec3b> (row, col)[1] = new_g;
    				new_img.at<Vec3b> (row, col)[2] = new_r;
    				continue;
    			}
    
    			float light, sat, alpha;
    			light = value / 2;
    
    			if (light < 0.5)
    				sat = delta / value;
    			else
    				sat = delta / (2 - value);
    
    			if (increment >= 0)
    			{
    				if ((increment + sat) >= 1)
    					alpha = sat;
    				else
    				{
    					alpha = 1 - increment;
    				}
    				alpha = 1 / alpha - 1;
    				new_r = r + (r - light * 255) * alpha;
    				new_g = g + (g - light * 255) * alpha;
    				new_b = b + (b - light * 255) * alpha;
    			}
    			else
    			{
    				alpha = increment;
    				new_r = light * 255 + (r - light * 255) * (1 + alpha);
    				new_g = light * 255 + (g - light * 255) * (1 + alpha);
    				new_b = light * 255 + (b - light * 255) * (1 + alpha);
    			}
    			new_img.at<Vec3b> (row, col)[0] = new_b;
    			new_img.at<Vec3b> (row, col)[1] = new_g;
    			new_img.at<Vec3b> (row, col)[2] = new_r;
    		}
    	}
    	imshow ("Effect Image", new_img);
    }
    
    int main ()
    {
    	img = imread ("test.jpg");		// 加载图片,保存在 Mat 对象 img 中
    	new_img = Mat::zeros (img.size (), img.type ());    // 最终要展示结果的对象
    
    	contrastValue = 1;	//对比度初始值
    	brightValue = 1;	//亮度初始值
    	saturation = 10;	//饱和度初始值
    
    	namedWindow ("Effect Image", WINDOW_NORMAL);		// 创建效果图窗口
    
    	createTrackbar ("Contrast:", "Effect Image", &contrastValue, 100, contrast_bright);	// 创建对比度滑动条
    	createTrackbar ("Brightness:", "Effect Image", &brightValue, 200, contrast_bright);	// 创建亮度滑动条
    	createTrackbar ("Saturability:", "Effect Image", &saturation, 200, saturability); // 创建饱和度滑动条
    
    	// 函数回调,因为是全局变量,所以 userdata 为0
    	contrast_bright (contrastValue, 0);
    	contrast_bright (brightValue, 0);
    	saturability (saturation, 0);
    	
    	cv::waitKey (0);
    	return 0;
    }
    
    
    更多相关内容
  • 图像亮度饱和度

    2013-10-30 16:20:16
    图像的亮度饱和度算法,能出力图片的亮度和饱和度,相对大家有帮助
  • 亮度饱和度和对比度的计算

    千次阅读 2020-05-29 22:50:03
    //使用亮度值创建一个饱和度为0的颜色值 fixed3 luminanceCol = fixed3(luminance,luminance,luminance); //颜色之间进行插值,从而得到希望的饱和度颜色 finalCol = lerp(luminanceCol,finalCol,_Saturation); //...

    Unity Shader入门精要学习记录

    灰度像素的值计算为相应的红色,绿色和蓝色像素的加权总和,如下所示:

    Y = 0.2125 R + 0.7154 G + 0.0721 B

    固定值参考
    http://poynton.ca/PDFs/ColorFAQ.pdf](http://poynton.ca/PDFs/ColorFAQ.pdf) ColorFAQ.pdf

    sampler2D _MainTex; 
    half _Brightness;
    half _Saturation;
    half _Contrast;

    fixed4 frag(v2f i) : SV_Target
    {
        //获取原屏幕图像的采样结果
        fixed4 renderTex = tex2D(_MainTex,i.uv);

        //调整亮度乘以系数即可
        fixed3 finalCol = renderTex.rgb * _Brightness;

        //计算该像素对应的亮度值,通过对每个颜色分量乘以一个特定的系数相加得到
        fixed luminance = 0.2125 * renderTex.r + 0.7154 * renderTex.g + 0.0721 * renderTex.b;

        //使用亮度值创建一个饱和度为0的颜色值
        fixed3 luminanceCol = fixed3(luminance,luminance,luminance);

        //颜色之间进行插值,从而得到希望的饱和度颜色
        finalCol = lerp(luminanceCol,finalCol,_Saturation);

        //创建一个对比度为0的颜色值(各分量均为0.5
        fixed3 avgCol = fixed3(0.5,0.5,0.5);

        //使用饱和度属性对颜色进行插值得到最终的结果
        finalCol = lerp(avgCol,finalCol,_Contrast);

        return fixed4(finalCol,renderTex.a);
    }

    MSDN YUV To RGB
    https://docs.microsoft.com/en-us/previous-versions/windows/embedded/ms893078(v=msdn.10)?redirectedfrom=MSDN

    展开全文
  • 有时,为了处理图像颜色,更加直观的看颜色,会进行颜色空间转换,从一种颜色空间转到另一种颜色空间,或者是从RGB转到LCH,来看亮度饱和度和色度。 整体框图 用下面这个图来表示从RGB到LCH的变换过程,从中可以看到...

    目录

    前言

    整体框图

    EOTF-NolinearToLinear

    sRGB中的EOTF

    BT.1886的EOTF

    BT.709

     色域

     sRGB色域

    DCI-P3色域

    Display P3色域

    Adobe RGB (1998) 色域

    BT2020色域

    RGB2XYZ

    计算公式

    代码 

    仿真结果

    颜色空间

     LAB颜色空间

    JzAzBz颜色空间

     ICtCp颜色空间

    ICaCb颜色空间

     ColorSpaceToLCH

     RGB2HSV/L

    RGB和HSV互转

     RGB与HSL互转

    RGB2YUV

    参考文献


    前言

    在图像处理中,经常会遇到各种颜色空间,比如RGB,YUV,Lab,HSV等等,同时,也会涉及到各种色域,比如sRGB色域,DCI-P3,Display P3色域,BT2020色域等等。有时,为了处理图像颜色,更加直观的看颜色,会进行颜色空间转换,从一种颜色空间转到另一种颜色空间,或者是从RGB转到LCH,来看亮度饱和度和色度。

    整体框图

            用下面这个图来表示从RGB到LCH的变换过程,从中可以看到,大体上分两类,一类是区分色域空间的,一类是不区分色域空间的。区分色域空间的,即使RGB的数值完全相等,只要对应的色域不一样,得到LCH也会不一样,这一类都是先将RGB转到和人眼比较相似的CIE1931 XYZ空间上,然后再选取某种颜色空间来衡量颜色,当然,不同的颜色空间,其得到的LCH也会不一样。总体来说,这一类是比较准确的,符合人眼特性的。而另一类,不区分色域的,哪怕是不同色域,RGB一样,得到的LCH就一样(实际人眼感知是不一样的),所以这一类是不准确的,不过这一类的计算相对要简单很多,经常一步或者两步就可以了。

    下面,分不同模块来介绍。

    EOTF-NolinearToLinear

    EOTF主要是将非线性域RGB转到线性域RGB,对应的还有个OETF,就是将线性域转到非线性域,而不同标准下,其转换是不同的,主要介绍以下几种:

    sRGB中的EOTF[1]

            在sRGB色域中,有对EOTF应的规定,如下所示:

            其反变换OETF为:

     

            由IEC 61966-2-1:1999 (International Electrotechnical Commission, 1999) 发布的,其函数是分段的,使用的是gamma2.4,暗处是线性。 

    BT.1886的EOTF[2]

            BT.1886中,对EOTF进行如下规定:

             基本上就是采用了gamma2.4,LB是屏幕最暗,就是0对应的亮度,Lw是屏幕的最亮,就是1对应的亮度,都是用nit为单位。

    BT.709[3]

    BT709中,对OETF的定义如下,也是分段函数,一段是线性,另一段是gamma2.2,和BT1886中和sRGB色域中,都有些不同。

            当然,除了上面几种,还有些HDR标准的EOTF定义,比如PQ,HLG等,具体可以参照以下资料。

    HDR相关标准-HLG/HDR10/HDR10+/DOLBY VISION_图像算法菜鸟的博客-CSDN博客_hlg和hdr10什么区别 

    PQ和HLG标准及其转换_图像算法菜鸟的博客-CSDN博客_hlg pq 

     色域

    在业界,有很多种色域标准,sRGB色域,DCI-P3,Display P3色域,BT2020色域,他们都是定义在XYZ空间上,规定RGB三个色坐标和白点色坐标即可。色域色坐标都确定了,那么就可以在线性RGB和XYZ空间进行转换了。主要介绍以下色域:

     sRGB色域

    sRGB的色坐标定义如下:

    RGB Primaries:

    [[ 0.64  0.33]                      

    [ 0.3   0.6 ]                      

    [ 0.15  0.06]]

    Whitepoint: [ 0.3127  0.329 ]

    DCI-P3色域

    DCI-P3的色坐标定义如下:

    RGB Primaries:

    [[ 0.68   0.32 ]                      

    [ 0.265  0.69 ]                      

    [ 0.15   0.06 ]]

    Whitepoint: [ 0.314  0.351]

    Display P3色域

    Display P3的色坐标定义如下:

    RGB Primaries:

    [[ 0.68   0.32 ]                      

    [ 0.265  0.69 ]                      

    [ 0.15   0.06 ]]

    Whitepoint: [ 0.3127  0.329 ]

    和DCI-P3对比,二者的差异是白点色坐标不同,Display P3使用的是D65的白点,而DCI-P3不是

    Adobe RGB (1998) 色域

    Adobe RGB的色坐标定义如下:

    RGB Primaries :

    [[ 0.64  0.33]                      

    [ 0.21  0.71]                      

    [ 0.15  0.06]]

    Whitepoint : [ 0.3127  0.329 ]

    BT2020色域

    BT2020的色坐标定义如下:

    RGB Primaries :

    [[ 0.708  0.292]                      

    [ 0.17   0.797]                      

    [ 0.131  0.046]]

    Whitepoint: [ 0.3127  0.329 ]

    可以使用Python提供的colour库[4]进行画图,得到各个色域的信息和画图,参考代码如下:

    import colour
    import colour.plotting
    if __name__ == '__main__':
        srgb = colour.RGB_COLOURSPACES['sRGB']
        print('srg :', srgb)
        dcip3 = colour.RGB_COLOURSPACES['DCI-P3']
        print('dci-p3:', dcip3)
    
        bt2020 = colour.RGB_COLOURSPACES['ITU-R BT.2020']
        print('ITU-R BT.2020:', bt2020)
    
        adobe1998 = colour.RGB_COLOURSPACES['adobe1998']
        print('adobe1998:', adobe1998)
    
        DisplayP3 = colour.RGB_COLOURSPACES['Display P3']
        print('DisplayP3:', DisplayP3)
    
    
        colour.plotting.plot_RGB_colourspaces_in_chromaticity_diagram_CIE1931(['sRGB', 'ITU-R BT.2020', 'adobe1998',
                                                                               'DCI-P3', 'Display P3'])

    结果图如下:

     

    RGB2XYZ

    只要色域的RGB三个色坐标和白点色坐标确定了,就可以得到RGB到XYZ空间的转换矩阵,很多时候,我们都是记住这个矩阵,不过有时,会定义一个不是标准的色域,这个时候就没有对应的转换矩阵了。而实际上,这个转换矩阵是可以通过计算得到的[5],

    计算公式

     

    代码 

    其实现代码和测试代码如下:

    import numpy as np
    
    
    def XYZToxy(XYZ):
        XYZ = XYZ.reshape(-1, 3)
        num, _ = XYZ.shape
        sumXYZ = np.sum(XYZ, axis=0)
        xy = np.zeros((num, 2), np.float)
        xy[:, 0] = XYZ[:, 0] / sumXYZ
        xy[:, 1] = XYZ[:, 1] / sumXYZ
    
        return xy
    
    def xyToXYZ(xy):
        xy = xy.reshape(-1, 2)
        num, _ = xy.shape
        XYZ = np.zeros((num, 3), np.float)
        XYZ[:, 0] = xy[:, 0] / xy[:, 1]
        XYZ[:, 1] = 1
        XYZ[:, 2] = (1 - xy[:, 0] - xy[:, 1]) / xy[:, 1]
        return XYZ
    
    def GetRGBXYZMatrices(xy):
        XYZ = xyToXYZ(xy)
        # print(XYZ)
        matXYZrgb = XYZ[0:3, :].T
        XYZw = XYZ[3, :]
        Srgb = np.linalg.inv(matXYZrgb) @ XYZw.T
        # print(Srgb.shape)
    
        matRGB2XYZ = np.zeros((3, 3), np.float)
        matRGB2XYZ[0, 0] = Srgb[0] * matXYZrgb[0, 0]
        matRGB2XYZ[0, 1] = Srgb[1] * matXYZrgb[0, 1]
        matRGB2XYZ[0, 2] = Srgb[2] * matXYZrgb[0, 2]
    
        matRGB2XYZ[1, 0] = Srgb[0] * matXYZrgb[1, 0]
        matRGB2XYZ[1, 1] = Srgb[1] * matXYZrgb[1, 1]
        matRGB2XYZ[1, 2] = Srgb[2] * matXYZrgb[1, 2]
    
        matRGB2XYZ[2, 0] = Srgb[0] * matXYZrgb[2, 0]
        matRGB2XYZ[2, 1] = Srgb[1] * matXYZrgb[2, 1]
        matRGB2XYZ[2, 2] = Srgb[2] * matXYZrgb[2, 2]
    
        matXYZ2RGB = np.linalg.inv(matRGB2XYZ)
    
        print('matRGB2XYZ:', matRGB2XYZ)
        print('matXYZ2RGB:', matXYZ2RGB)
        return matRGB2XYZ, matXYZ2RGB
    
    if __name__ == '__main__':
        xysRGB = np.array([
            [0.64, 0.33],
            [0.30, 0.60],
            [0.15, 0.06],
            [0.3127, 0.3290]
        ])
    
        xyDisplayP3 = np.array([
            [0.68, 0.32],
            [0.265, 0.69],
            [0.15, 0.06],
            [0.3127, 0.3290]
        ])
    
        xyBT2020 = np.array([
            [0.708, 0.292],
            [0.17, 0.797],
            [0.131, 0.046],
            [0.3127, 0.3290]
        ])
    
        xySMPTE_C = np.array([
            [0.63, 0.34],
            [0.31, 0.595],
            [0.155, 0.07],
            [0.3127, 0.3290]
        ])
    
        xyNTSC = np.array([
            [0.67, 0.33],
            [0.21, 0.71],
            [0.14, 0.08],
            [0.3101, 0.3162]
        ])
    
        xyAdobe = np.array([
            [0.64, 0.33],
            [0.21, 0.71],
            [0.15, 0.06],
            [0.3127, 0.3290]
        ])
    
        GetRGBXYZMatrices(xysRGB)
        GetRGBXYZMatrices(xyDisplayP3)
        GetRGBXYZMatrices(xyAdobe)

    代码中计算了三种色域的转换矩阵,分别为

    仿真结果

    sRGB色域

    matRGB2XYZ:

    [[ 0.4123908   0.35758434  0.18048079]
     [ 0.21263901  0.71516868  0.07219232]
     [ 0.01933082  0.11919478  0.95053215]]
    matXYZ2RGB:

    [[ 3.24096994 -1.53738318 -0.49861076]
     [-0.96924364  1.8759675   0.04155506]
     [ 0.05563008 -0.20397696  1.05697151]] 

    Display-P3色域

    matRGB2XYZ:

    [[  4.86570949e-01   2.65667693e-01   1.98217285e-01]
     [  2.28974564e-01   6.91738522e-01   7.92869141e-02]
     [ -3.97207552e-17   4.51133819e-02   1.04394437e+00]]
    matXYZ2RGB:

    [[ 2.49349691 -0.93138362 -0.40271078]
     [-0.82948897  1.76266406  0.02362469]
     [ 0.03584583 -0.07617239  0.95688452]]

    Adobe RGB色域

    matRGB2XYZ:

    [[ 0.57666904  0.18555824  0.18822865]
     [ 0.29734498  0.62736357  0.07529146]
     [ 0.02703136  0.07068885  0.99133754]]
    matXYZ2RGB:

    [[ 2.0415879  -0.56500697 -0.34473135]
     [-0.96924364  1.8759675   0.04155506]
     [ 0.01344428 -0.11836239  1.01517499]]

    颜色空间

            当转到XYZ以后,一般就会将XYZ再转到各种颜色空间来衡量,最常见的就是CIE的Lab空间,后面还有些其他的颜色空间,比如ICtCp, ICaCb, JzAzBz等等,下面主要介绍以下几种。

     LAB颜色空间[6]

    XYZ转到LAB的公式如下:

    JzAzBz颜色空间[7]

    XYZ转到JzAzBz的颜色空间公式如下:

     ICtCp颜色空间[8]

    XYZ转到ICtCp颜色空间公式如下:

     

    ICaCb颜色空间[8]

    XYZ转到ICaCb颜色空间公式如下:

     

     

            当然,还有些其他的颜色空间,比如proLab[9],zICaCb[10]颜色空间等等,这些颜色空间基本上都是考虑颜色的更加均匀性和一致性,和人眼的感知接近,或者是和XYZ直接是线性转换,而不是非线性转换。 

     ColorSpaceToLCH

            当转到各种颜色空间,比如LAB,ICtCp, ICaCb, JzAzBz和YUV或者YCbCr之后,其中L,I,Jz和Y等是亮度,其他两个分量是颜色,但也没有转到饱和度和色度上。以Lab为例,按如下方法计算即可:

     

     RGB2HSV/L

    RGB和HSV互转

            RGB转HSV的公式如下,这个颜色空间相对来说,色相和饱和度比较好点,当然均匀性和一致性和LAB,JzAzBz等空间没法比,但亮度V和人眼感知的相差很远,并不能代表真实亮度。

    HSV转到RGB的公式如下:

     

     

     RGB与HSL互转

    RGB2HSL的公式:

    HSL2RGB的公式:

     

     HSL颜色空间的色度和HSV是一样的,亮度分量L比HSV中的亮度分量要好些,但也不是很准确,饱和度S分量不好,均匀性很差,只要RGB里有0或者255,算出来的S就为1,很不连续,和人眼感知相差很远。

    RGB2YUV

    RGB转YUV有多种公式,不同标准,其系数不一样,不过都是线性变换,格式类似,只是数值不一样,详细可以参考如下资料。

    各种标准下的YUV与RGB间的转换公式_图像算法菜鸟的博客-CSDN博客

     

    参考文献:

    [1] Multimedia systems and equipment - Colour measurement and management - Part 2-1: Colour management - Default RGB colour space - sRGB。

    IEC 61966-2-1:1999 | IEC Webstore

    [2] R-REC-BT.1886-0-201103-I!!PDF-E.pdf

    [3] R-REC-BT.709-6-201506-I!!PDF-E.pdf

    [4] API Reference — Colour 0.4.1 documentation

    [5] Welcome to Bruce Lindbloom's Web Site

    [6] CIE 1976 uniform colour spaces

    [7] Perceptually uniform color space for image signals including high dynamic range and wide gamut

    [8] Encoding High Dynamic Range and Wide Color Gamut Imagery

    [9] ProLab: perceptually uniform projective colour coordinate system

    [10] investigating performance of uniform color spaces for high dynamic range and wide gamut color difference applications

    展开全文
  • JS图片上传对比度饱和度调整代码是一款从本地上传图片到服务端,然后通过滤器算法来处理图片,为图片设置不同的亮度,对比度和饱和度
  • 饱和度:色彩饱和度,可以理解为色彩的纯度,纯度越高,表现越鲜艳,纯度越低,表现越暗淡,简单来说就是色彩中灰色成分多少,这将直接影响了色彩的饱和度 。再来看一张图⬇️饱和度和明度,是色彩设计中,最常用的...

    今天是色彩三要素最后一篇了,学起学起!

    a75929207edbd9ff9580e1a5f01f40e0.gif 3b726102ea56fd8022c0bb08ee6823b4.png

    何为饱和度?

    饱和度:色彩饱和度,可以理解为色彩的纯度,纯度越高,表现越鲜艳,纯度越低,表现越暗淡,简单来说就是色彩中灰色成分多少,这将直接影响了色彩的饱和度 。

    9a4f75195fdd8336d6e5289cf60c23de.gif

     再来看一张图⬇️

    ee9baf2dbadb8d9862c22c026a305d57.png 9a38b6c7ce3157da015851280c04804f.png

    饱和度和明度,是色彩设计中,最常用的两个变量,饱和度和明度很大程度上决定了色彩呈现给人的感受,饱和度、明度越高,视觉冲击力越强烈;饱和度、明度较低的时候,视觉上越温和。

    656f86f61b6115d962beea6efe1d45d7.png

    一起看上面这张图,多盯一会,相信大家用不了多久就会有刺眼的感觉,这时会不自觉的把目光转移到右边部分,就会有一种如释负重的舒适,类似于开车的时候,目光躲避对面远光狗的感觉😄。我们会发现对低饱和、低明度色彩的容忍程度更高,观看时间更久;而对色彩饱和度高、明度高,看不了多久我们就会感觉眼睛疲劳不堪,再也不想多看一眼睛。

    9a4f75195fdd8336d6e5289cf60c23de.gif

    饱 I 和 I 度 

    04dce4d662a9bc80362ac89b37fe1a73.png 8e5d8f4c4232e7906a2bbae8cec734ca.png

    杀马特风格中,无论是发色或者服装,色彩饱和度和明度都很高,色彩很突兀且生硬,看起来就很低廉粗糙,也毫无质感可言。

    0f03e6004dafdacc8581054f4a8b4ccf.png

    就先拿我自己举例

    81154d9b5ac6758bc77815fc7f4a4a9c.png

    不好意思我又发错了

    743d5f9ca09cac868da414595566c0a4.png

    低饱和、低明度的图片看起来更加整体,色调更加和谐,相互之间有较强的联系,给人一种很强的品质感,完全不失层次。

    9a4f75195fdd8336d6e5289cf60c23de.gif

    当然,搭配得当那就另说了

    e0809f9f569023eadef245237fc49fa5.png

    上图的色彩设计是一种很科学的配色方案,叫做对比色,在色相环中相距120度到180度之间的颜色,两种颜色首先就有强烈的视觉冲击,通过明度,饱和度来改变两种颜色中不和谐的部分,背景墙底色为蓝色,就等于空间内大色块的基色都是蓝色,那这个部分的颜色,明度和饱和度就不能太高,不然就会有前文中视觉疲劳的现象发生。

    - - - - - - - - - - - - - - - - 

    那么图中家具的配色,饱和度就相对来讲很高了,但是大家注意细节,饱和度高的橘色沙发上,有一个比背景墙的蓝色明度更高的一个抱枕,而背景墙上的画的内容有若干种橘色明度的变化,这叫啥,这叫你中有我我中有你,再看图中窗帘、花瓶,改变明度和饱和度,拉开色彩层次,这波操作贼6.

    8ea383f0f41de48935a99b71c2ba98a0.png

    迄今为止,色彩三要素的色相、明度、饱和度,就给大家讲解的差不多了,相对都比较通俗易懂,也希望可以在大家纠结装修选色的时候,能通过这些对色彩的认知,帮助到大家。

    最后还得说件事,涂料颜色,我个人认为哪个都好看,最重要的是啥?是搭配啊,刚才那张附带色号的图,相信很多人不太敢选择那么跳跃的颜色,就怕搭配不好,但是一旦搭配好,绝对就是整个亲戚朋友什么的,装修装的最炫的了。

    9a4f75195fdd8336d6e5289cf60c23de.gif

                                  4612fd2fe79976287025368e44d49857.png

    可能有人会说了,我不想选择这种颜色太跳跃的,想试试什么灰色啊,咖色啊什么的,比较百搭的颜色,完全NO趴奔,今后的文章中会尽量多给大家一些附带色号的效果图,大家如果有想详细询问的,欢迎私信,回见!

    8e7dae07dce426fd4afaf2da01028f17.png
    展开全文
  • JS调节图片饱和度..

    2016-10-21 08:31:27
    JS控制本地多张图片 在画布中组装 实现控制亮度饱和度等等
  • //saturation饱和度:首先根据公式计算同等亮度情况下饱和度最低的值: fixed gray = 0.2125 * c.rgb.r + 0.7154 * c.rgb.g + 0.0721 * c.rgb.b; fixed3 grayColor = fixed3(gray, gray, gray); //根据Saturation在...
  • 亮度、对比度与饱和度

    千次阅读 2019-09-04 09:48:42
    亮度是指图片的明暗程度,对比度是指图片明暗的差异,饱和度则是图片颜色的饱满程度。 图片文件一般是RGB格式,当然也有的是YCBR格式。前者主要用于显示,后者则主要用于印刷。当然世上没有绝对的事情,也有人喜欢...
  • out = im.transpose(Image.FLIP_LEFT_RIGHT) newname = r"F:\data\png_3_sym" + '\\' + filename + "_sym.jpg" out.save(newname) ''' ### 图片亮度饱和度调整 === def update(input_img_path, output_img_path, ...
  • OpenCV调整彩色图像的饱和度亮度

    千次阅读 2021-01-17 18:39:04
    问题如何调整彩色图像的饱和度亮度解决思路详细步骤:将RGB图像值归一化到[0, 1]然后使用函数cvtColor进行色彩空间的转换接下来可以根据处理灰度图像对比度增强伽马变换或者线性变换调整饱和度亮度分量最后转换...
  • 使用Python调整亮度和对比,添加模糊并检测边缘! 遵循教程: : 为了下载此代码,请单击右上角的绿色按钮并以ZIP git clone https://github.com/kying18/pyphotoshop.git下载,或使用git clone ...
  • # 调整图像饱和度 input_image = cv2.cvtColor(input_image , cv2.COLOR_BGR2HLS) # saturation input_image [:, :, 2] = sclale_value * input_image [:, :, 2] input_image [:, :, 2][input_image [:, :, 2] &...
  • 由于一个项目需要,调节图片的亮度,开始使用遍历图片每一个像素,并修改图像的RGB值,发现修改后无法恢复到原来图像。在网上查了一些资料,发现了强大的MagickImage,给大家分享一下,希望对大家有所帮助。
  • H:hue 色调 S:saturation 饱和度 L:lum 亮度 从人的视觉系统看,颜色可用色调、饱和度亮度来描述 其中色调与光波的波长有直接关系,亮度饱和度与光波的幅度有关。 人眼看到的任一彩色光都是这三个特性的...
  • 当要减少对比的时候,则增加亮度值比中值小的值,降低亮度值比中值更大的值,使所有亮度值向中值靠近。 根据公式(x-avg_R(G/B)*a + x (a 为-1到1 之间,x 是原像素值)计算 亮度的调节: 介绍 将图像转化为HLS格式...
  • HSL LESS函数不返回颜色,而是返回名称指示的颜色部分的整数值.hue(@color); // returns the `hue` channel of @color in the HSL space例子.foo{color: hue(#167e8a);}// rendered as.foo {// invalid...hence you ...
  • 可能有部分小伙伴们,对于亮度饱和度、对比度这些概念还不是很清楚,这里先大致做下解释。 我们知道,在计算机中描述一个物体颜色的常见方式是“RGB颜色模型”,这种方式虽然很方便计算机的计算,但却不方便人们...
  • 射算法常以提升亮度为目的,加重了饱和度不足的问题。 2. OLED 长时间、高亮度显示,像素会发生亮度衰退,导致屏幕显示亮度不均匀。 本文针对以上两个问题,提出了两种相应的解决方案。首先通过改进像素排 列方式与...
  • 色调、饱和度亮度概念 HSB是一种符合直觉的色彩空间。使用色调、饱和度亮度这三个概念来描述图像颜色。 此三种概念并没有标准的定义,但有定性的描述。 色调 色调(hue)指的是一幅画中画面色彩的总体倾向。也...
  • 对比: 对比指不同颜色之间的差别。对比越大,不同颜色之间的反差越大,即所谓黑白分明,对比度过大,图像就会显得很刺眼。对比越小,不同颜色之间的反差就越小。 亮度亮度指照射在景物或图像上光线的明...
  • 自己编写的一个edit的类,可以调节图片的饱和度亮度,对比度。直接复制到工程文件下使用,
  • 其次是饱和度饱和度是离灰度偏离越大,饱和度越大,我们首先可以计算一下同等亮度条件下饱和度最低的值,根据公式:gray = 0.2125 * r + 0.7154 * g + 0.0721 * b即可求出该值(公式应该是一个经验公式),然后...
  • 图像处理之调整亮度饱和度什么是亮度:简单点说一幅图像的亮度属性是图像的RGB值的大小,RGB各个值越大亮度越高RGB分量取值范围为0~255之间。调整图像亮度。什么是饱和度饱和度是是指颜色的强度,调整饱和度...
  • WPF图像处理程序,包括亮度饱和度、对比度、Gamma调节。 // Lightness Adjust public static void BitmapLightnessAdjust(Bitmap curBitmap, int width, int height, int delta) { if (delta == 0...
  • 我们在做游戏的时候,虽然现在有了Unity等引擎,不用我们自己处理一些繁琐的东西,但是不管怎么样,最后显示在屏幕上的还是一些RGB的像素信息,了解这些基本的概念,肯定对我们做游戏有更大的帮助。
  • 提供rgb和hsl的相互转化的AS3代码
  • 本文章会详细的介绍RGB颜色空间与RGB三色中色调、饱和度亮度之间的关系,最后会介绍HSV颜色空间! 一.RGB颜色空间 1.起源 RGB三原色起源于上世纪初1809年ThomasYoung提出视觉的三原色学说,随后Helmholtz在...
  • 理解图像中基本概念:色调、色相、饱和度、对比度、亮度 对比度: 对比度指不同颜色之间的差别。对比度越大,不同颜色之间的反差越大,即所谓黑白分明,对比度过大,图像就会显得很刺眼。对比度越小,不同颜色之间...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,619
精华内容 11,847
关键字:

亮度饱和度