图像处理------调整亮度与饱和度

什么是亮度:

简单点说一幅图像的亮度属性是图像的RGB值的大小,RGB各个值越大亮度越高RGB

分量取值范围为0~255之间。调整图像亮度。

什么是饱和度:

饱和度是是指颜色的强度,调整饱和度可以修正过度曝光或者未充分曝光的图片。使

图像看上去更加自然。

基本思想:

通常在RGB色彩空间调整亮度与饱和度不是很直观,而HSL彩色空可以很直观表示出

每个像素的饱和度与亮度。所以首先读取图像的像素RGB值然后再转换到HSL空间得

到饱和度与亮度值,调整以后再从HSL空间转换到RGB空间的RGB值,对每个像素完

成这样的调整就完成图像的亮度与饱和度调整。关于RGB与HSL色彩空间的转换

看这里:http://en.wikipedia.org/wiki/HSL_color_space

程序效果:

滤镜源代码:

[java] view plaincopy

  1. package com.gloomyfish.filter.study;  
  2.   
  3. import java.awt.image.BufferedImage;  
  4. /** 
  5.  * http://en.wikipedia.org/wiki/HSL_color_space 
  6.  * @author gloomy fish 
  7.  * @date 2012-09-26  
  8.  * 
  9.  */  
  10. public class HSLFilter extends AbstractBufferedImageOp {  
  11.     public final static double c1o60  = 1.0 / 60.0;  
  12.     public final static double c1o255 = 1.0 / 255.0;  
  13.     private double hue;  
  14.     private double saturation;  
  15.     private double lightness;  
  16.       
  17.     public HSLFilter() {  
  18.         System.out.println("Hue Filter");  
  19.     }  
  20.       
  21.     public double getHue() {  
  22.         return hue;  
  23.     }  
  24.   
  25.     public void setHue(double hue) {  
  26.         while (hue < 0.0) {  
  27.             this.hue += 360;  
  28.         }  
  29.         while (hue >= 360.0) {  
  30.             this.hue -= 360;  
  31.         }  
  32.     }  
  33.   
  34.     public double getSaturation() {  
  35.         return saturation;  
  36.     }  
  37.   
  38.     public void setSaturation(double saturation) {  
  39.         if((saturation >= -100.0) && (saturation <= 100.0)) {  
  40.             this.saturation = saturation;  
  41.         }  
  42.     }  
  43.   
  44.     public double getLightness() {  
  45.         return lightness;  
  46.     }  
  47.   
  48.     public void setLightness(double lightness) {  
  49.         if((lightness >= -100.0) && (lightness <= 100.0)) {  
  50.             this.lightness = lightness;  
  51.         }  
  52.     }  
  53.   
  54.     @Override  
  55.     public BufferedImage filter(BufferedImage src, BufferedImage dest) {  
  56.         int width = src.getWidth();  
  57.         int height = src.getHeight();  
  58.         double sat = 127.0d * saturation / 100.0d;  
  59.         double lum = 127.0d * lightness / 100.0d;  
  60.         if ( dest == null )  
  61.             dest = createCompatibleDestImage( src, null );  
  62.   
  63.         int[] inPixels = new int[width*height];  
  64.         int[] outPixels = new int[width*height];  
  65.         getRGB( src, 0, 0, width, height, inPixels );  
  66.         double min, max, dif, sum;  
  67.         double f1, f2;  
  68.         int index = 0;  
  69.         double h, s, l;  
  70.         double v1, v2, v3, h1;  
  71.         for(int row=0; row<height; row++) {  
  72.             int ta = 0, tr = 0, tg = 0, tb = 0;  
  73.             for(int col=0; col<width; col++) {  
  74.                 index = row * width + col;  
  75.                 ta = (inPixels[index] >> 24) & 0xff;  
  76.                 tr = (inPixels[index] >> 16) & 0xff;  
  77.                 tg = (inPixels[index] >> 8) & 0xff;  
  78.                 tb = inPixels[index] & 0xff;  
  79.                   
  80.                 // convert to HSL space  
  81.                 min = tr;  
  82.                 if (tg < min)   
  83.                     min = tg;  
  84.                 if (tb < min)   
  85.                     min = tb;  
  86.                 max = tr;  
  87.                 f1 = 0.0;  
  88.                 f2 = tg - tb;  
  89.                 if (tg > max) {  
  90.                    max = tg;  
  91.                    f1 = 120.0;  
  92.                    f2 = tb - tr;  
  93.                 }  
  94.                 if (tb > max) {  
  95.                    max = tb;  
  96.                    f1 = 240.0;  
  97.                    f2 = tr - tg;  
  98.                 }  
  99.                 dif = max - min;  
  100.                 sum = max + min;  
  101.                 l = 0.5 * sum;  
  102.                 if (dif == 0) {  
  103.                     h = 0.0;  
  104.                     s = 0.0;  
  105.                 }   
  106.                 else if(l < 127.5) {  
  107.                     s = 255.0 * dif / sum;  
  108.                 }  
  109.                 else {  
  110.                     s = 255.0 * dif / (510.0 - sum);  
  111.                 }  
  112.   
  113.                 h = (f1 + 60.0 * f2 / dif);  
  114.                 if (h < 0.0) {   
  115.                     h += 360.0;  
  116.                 }  
  117.                 if (h >= 360.0) {  
  118.                     h -= 360.0;  
  119.                 }  
  120.                   
  121.                 // Apply transformation.  
  122.                 h = h + hue;  
  123.                 if( h >= 360.0) {  
  124.                     h = h - 360.0;  
  125.                 }  
  126.                 s = s + sat;  
  127.                 if( s < 0.0) {  
  128.                     s = 0.0;  
  129.                 }  
  130.                 if( s > 255.0) {  
  131.                     s = 255.0;  
  132.                 }  
  133.                 l = l + lum;  
  134.                 if( l < 0.0) {  
  135.                     l = 0.0;  
  136.                 }  
  137.                 if( l > 255.0) {  
  138.                     l = 255.0;  
  139.                 }  
  140.                   
  141.                 // conversion back to RGB space here!!  
  142.                 if (s == 0) {  
  143.                    tr = (int)l;  
  144.                    tg = (int)l;  
  145.                    tb = (int)l;  
  146.                 } else {  
  147.                   
  148.                    if (l < 127.5) {  
  149.                       v2 = c1o255 * l * (255 + s);  
  150.                    } else {  
  151.                       v2 = l + s - c1o255 * s * l;  
  152.                    }  
  153.                      
  154.                    v1 = 2 * l - v2;  
  155.                    v3 = v2 - v1;  
  156.                    h1 = h + 120.0;  
  157.                    if (h1 >= 360.0)   
  158.                        h1 -= 360.0;  
  159.                      
  160.                    if (h1 < 60.0) {  
  161.                       tr = (int)(v1 + v3 * h1 * c1o60);  
  162.                    }  
  163.                    else if (h1 < 180.0) {  
  164.                       tr = (int)v2;  
  165.                    }  
  166.                    else if (h1 < 240.0) {  
  167.                       tr = (int)(v1 + v3 * (4 - h1 * c1o60));  
  168.                    }  
  169.                    else {  
  170.                       tr = (int)v1;  
  171.                    }  
  172.                      
  173.                    h1 = h;  
  174.                    if (h1 < 60.0) {  
  175.                       tg = (int)(v1 + v3 * h1 * c1o60);  
  176.                    }  
  177.                    else if (h1 < 180.0) {  
  178.                       tg = (int)v2;  
  179.                    }   
  180.                    else if (h1 < 240.0) {  
  181.                       tg = (int)(v1 + v3 * (4 - h1 * c1o60));  
  182.                    }  
  183.                    else {  
  184.                       tg = (int)v1;  
  185.                    }  
  186.                      
  187.                    h1 = h - 120.0;  
  188.                    if (h1 < 0.0) {  
  189.                        h1 += 360.0;  
  190.                    }  
  191.                    if (h1 < 60.0) {  
  192.                       tb = (int)(v1 + v3 * h1 * c1o60);  
  193.                    }  
  194.                    else if (h1 < 180.0) {  
  195.                       tb = (int)v2;  
  196.                    }  
  197.                    else if (h1 < 240.0) {  
  198.                       tb = (int)(v1 + v3 * (4 - h1 * c1o60));  
  199.                    }  
  200.                    else {  
  201.                       tb = (int)v1;  
  202.                    }  
  203.                 }  
  204.                 outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;  
  205.             }  
  206.         }  
  207.   
  208.         setRGB( dest, 0, 0, width, height, outPixels );  
  209.         return dest;  
  210.     }  
  211.   
  212. }  
时间: 2024-08-04 11:08:44

图像处理------调整亮度与饱和度的相关文章

图像处理------调整亮度与对比度

很多时候,一张图像被过度曝光显得很白,或者光线不足显得很暗,有时候背景跟图像人物 也观察不清楚,这个时候可以通过调节图像的两个基本属性-亮度与对比度来获得整体效果 的提升,从而得到质量更高的图片.   基本原理: 图像亮度本质上图像中每个像素的亮度,每个像素的亮度本质上RGB值的大小,RGB值为0 是像素点为黑色,RGB都为255时像素点最亮,为白色.对比度则是不同像素点之间的差值, 差值越大,对比度越明显.从直方图分析的观点来看,对比度越好的图片,直方图曲线会越 明显,分布也越显得均匀.  

Photoshop模拟画笔手绘照片教程

很简单的教程,但是创意挺好,教程只是一个思路,大家可以换其他照片来达到同样的效果. 很简单的教程,但是创意挺好,这里我就不给大家详细翻译了!估计大家看图就能看懂了!这个教程只是一个思路,大家可以换其他照片来达到同样的效果. 最终效果: 需要的素材: 步骤1 打开原图 步骤2 复制图层,去色,再复制图层,然后反相,改变图层模式为颜色加深,选择中间那个去色的图层,高斯模糊,模糊半径设置为2-3px就可以,最后调整图层模式为亮度.:   步骤3 现在我们合并上面的两个图层,然后改变模式为亮度模式. 步

几种好用PS滤镜介绍

  Viveza Viveza将Photoshop的「颜色范围」加上「亮度/对比」.「色相/饱和度」合为一体,Viveza整合Nikon Capture NX中的U-Point技术,可以针对照片中单点调整亮度与饱和度,操作上完全不复杂,而且Photoshop有图层功能,使用上会比Nikon Capture NX更有变化性.额其实说了这么多还是不如大家看图比较实际: Color Efex Pro Color Efex Pro可以说是摄影师最常用的外挂,从模拟底片效果.人像处理肤质.风景照片后期通通

好照片RAW文件转换 教你创造性冲洗数字底片

RAW文件作为一种图片存储数据格式,只记录下数码相机传感器的原始信息,为图像数码后期的处理提供了更多的灵活性,受到很多摄影师的青睐.一般来说我们可以使用购买相机附赠的的官方软件来打开和处理RAW格式文件,但是如果你平时会使用几种不同品牌的相机,而各个相机厂商有自己专有的RAW文件格式,那么使用第三方软件来打开RAW文件是比较方便的选择. 但是,由于RAW文件记录了更多的图片信息,导致体积比JPEG大许多,此外目前市面上的RAW转换软件大多操作复杂,这些因素导致很多新手玩家不愿意使用RAW格式拍摄

PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF_php实例

给骨头系统开发的图像库的 imagick 部分 ,支持 gif , 完美支持裁切.生成缩略图.添加水印 . 支持按方位生成缩略图像, 如: // 把左上角优先 $image->resize_to(100, 100, 'north_west'); // 右边优先 $image->resize_to(100, 100, 'east'); ... 更多参数看源代码 原图 效果图: 调用方式: include 'imagick.class.php'; $image = new lib_image_im

5种好用的PS滤镜使用介绍

  Viveza Viveza将Photoshop的「颜色范围」加上「亮度/对比」.「色相/饱和度」合为一体,Viveza整合Nikon Capture NX中的U-Point技术,可以针对照片中单点调整亮度与饱和度,操作上完全不复杂,而且Photoshop有图层功能,使用上会比Nikon Capture NX更有变化性.额其实说了这么多还是不如大家看图比较实际: Color Efex Pro Color Efex Pro可以说是摄影师最常用的外挂,从模拟底片效果.人像处理肤质.风景照片后期通通

干货:图像比赛的通用套路有哪些?Kaggle比赛金牌团队为你解答

雷锋网(公众号:雷锋网)  AI 研习社按: Kaggle 是全世界首屈一指的数据科学.机器学习开发者社区和竞赛平台,来看看 Kaggle 亚马逊雨林比赛金牌团队的经验分享吧. 日前,雷锋网 AI 研习社组织的学术青年分享会中,中山大学CIS实验室的研二学生刘思聪为我们带来了一场精彩的分享.他所在的队伍在 Kaggle 上的亚马逊比赛中获得了金牌,在这次的分享上,他为我们详述了比赛过程中所获得的经验以及图像比赛中的一些通用套路. 下面是他的分享内容,雷锋网 AI 研习社做了不改变原意的编辑整理:

php使用imagick模块实现图片缩放、裁剪、压缩示例_php实例

PHP 使用Imagick模块 缩放,裁剪,压缩图片 包括gif图片 缩放 裁剪 复制代码 代码如下: /**  * 图片裁剪  * 裁剪规则:  *   1. 高度为空或为零   按宽度缩放 高度自适应  *   2. 宽度为空或为零  按高度缩放 宽度自适应  *      3. 宽度,高度到不为空或为零  按宽高比例等比例缩放裁剪  默认从头部居中裁剪  * @param number $width  * @param number $height  */ public function

php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法_php技巧

本文实例讲述了php_imagick实现图片剪切.旋转.锐化.减色或增加特效的方法.分享给大家供大家参考.具体分析如下: 一个可以供PHP调用ImageMagick功能的PHP扩展.使用这个扩展可以使PHP具备和ImageMagick相同的功能. ImageMagick是一套功能强大.稳定而且免费的工具集和开发包,可以用来读.写和处理超过185种基本格式的图片文件,包括流行的TIFF, JPEG, GIF, PNG, PDF以及PhotoCD等格式.利用ImageMagick,你可以根据web应