这个算法是参考自 阿发伯 的博客,在此对 阿发伯 表示感谢,

http://blog.csdn.net/maozefa

亮度调整

非线性亮度调整:

对于R,G,B三个通道,每个通道增加相同的增量。

线性亮度调整:

利用HSL颜色空间,通过只对其L(亮度)部分调整,可达到图像亮度的线性调整。但是,RGB和HSL颜色空间的转换很繁琐,一般还需要浮点数的运算,不仅增加了代码的复杂度,更重要的是要逐点将RGB转换为HSL,然后确定新的L值,再将HSL转换为RGB,运行速度可想而知是很慢的。要想提高图像亮度线性调整的速度,应该从三方面考虑,一是变浮点运算为整数运算,二是只提取HSL的L部分进行调整,三是采用汇编代码,在Delphi中,当然是BASM。下面是按照这三方面考虑写的图像亮度线性调整代码:

L := (Max(R, Max(G,B)) + Min(R, Min(G, B))) div 2;

L没有采用通常的百分比表示,而是取值0 - 255,这样就不必要采用浮点数运算了。

下面代码主要完成2个功能,一是用以前的L值与RGB分别求出其HSL的HS部分,其公式用Pascal表示为:

if L > 128 then

begin

  rHS := (R * 128 - (L - 128) * 256) div (256 - L);

  gHS := (G * 128 - (L - 128) * 256) div (256 - L);

  bHS := (B * 128 - (L - 128) * 256) div (256 - L);

end else

begin

  rHS := R * 128 div L;

  gHS := G * 128 div L;

  bHS := B * 128 div L;

end;

二是用新的L值(老的L值加需要调整的亮度值(0 - 255))和上面求出的HS值计算出新的

RGB值,计算方法为:

newL := L + Value - 128;

if newL > 0 then

begin

  newR := rHS + (256 - rHS) * newL div 128;

  newG := gHS + (256 - gHS) * newL div 128;

  newB := bHS + (256 - bHS) * newL div 128;

else begin

  newR := rHS + rHS * newL div 128;

  newG := gHS + gHS * newL div 128;

  newB := bHS + bHS * newL div 128;

end;

如此,一个像素点的线性亮度调整就基本完成了

Program:

clc;

clear all;

close all;

Image=imread('4.jpg');

Image=double(Image);

R=Image(:,:,1);

G=Image(:,:,2);

B=Image(:,:,3);

%%%% 求出原始图像亮度分量

I=(R+G+B)/3;

%%% 利用原始图像的亮度分量结合R,G,B求出HSL空间的H,S;

rHS=R;

gHS=G;

bHS=B;

[row, col]=size(I);

for i=1:row

    for j=1:col

        if(I(i,j)>128)

            rHS(i,j)=(R(i,j)*128-(I(i,j)-128)*256)/(256-I(i,j));

            gHS(i,j)=(G(i,j)*128-(I(i,j)-128)*256)/(256-I(i,j));

            bHS(i,j)=(B(i,j)*128-(I(i,j)-128)*256)/(256-I(i,j));

        else

            rHS(i,j)=R(i,j)*128/(I(i,j));

            gHS(i,j)=G(i,j)*128/(I(i,j));

            bHS(i,j)=B(i,j)*128/(I(i,j));

        end

    end

end

%%%% 然后求出新的亮度值

%%%% Increment: 亮度的调整增量(-255,255)

Increment=-100;

I_out=I+Increment-128;

%%%% 再利用新的亮度值结合H,S,求出新的R,G,B分量

R_new=R;

G_new=G;

B_new=B;

for i=1:row

    for j=1:col

        if(I_out(i,j)>0)

            R_new(i,j)=rHS(i,j)+(256-rHS(i,j))*I_out(i,j)/128;

            G_new(i,j)=gHS(i,j)+(256-gHS(i,j))*I_out(i,j)/128;

            B_new(i,j)=bHS(i,j)+(256-bHS(i,j))*I_out(i,j)/128;

        else

            R_new(i,j)=rHS(i,j)+rHS(i,j)*I_out(i,j)/128;

            G_new(i,j)=gHS(i,j)+gHS(i,j)*I_out(i,j)/128;

            B_new(i,j)=bHS(i,j)+bHS(i,j)*I_out(i,j)/128;

        end

    end

end

Image_new(:,:,1)=R_new;

Image_new(:,:,2)=G_new;

Image_new(:,:,3)=B_new;

imshow(Image/255);

figure, imshow(Image_new/255);

PS 图像调整算法——亮度调整的更多相关文章

  1. PS 图像调整算法——阈值

    PS里面这个算法,先将图像转成灰度图像,然后根据给定的阈值,大于该阈值的像素赋值为1,小于该阈值的赋值为0. if x>T, x=1; if x<T, x=0; 原图: 效果图:阈值为 1 ...

  2. PS 图像调整算法——自动色阶 (Auto Levels)

    PS 给出的定义: Enhance Per Channel Contrast:Maximizes the tonal range in each channel to produce a more d ...

  3. PS 图像调整算法——黑白

    这个算法是参考自 阿发伯 的博客: http://blog.csdn.net/maozefa 黑白调整 Photoshop CS的图像黑白调整功能,是通过对红.黄.绿.青.蓝和洋红等6种颜色的比例调节 ...

  4. PS 图像调整算法——饱和度调整

    算法参考自 阿发伯 的博客. http://blog.csdn.net/maozefa 饱和度调整 图像的饱和度调整有很多方法,最简单的就是判断每个象素的R.G.B值是否大于或小于128,大于加上调整 ...

  5. PS 图像调整算法——自动对比度 (Auto Contrast)

    PS 给出的定义: Enhance Monochromatic Contrast: Clips all channels identically. This preserves the overall ...

  6. PS 图像调整算法— —渐变映射

    这个调整简单来说就是先建立一张lookup table, 然后以图像的灰度值作为索引,映射得到相应的颜色值.图像的灰度值是由图像本身决定的,但是lookup table 却可以各种各样,所以不同的lo ...

  7. PS 图像调整算法——色调分离

    色调分离的原理就是将R, G, B每个通道 0-255 的色调区间进行强制划分到给定的区间里去,所以色调会合并,最终的图像看起来颜色就是一块一块的. clc; clear all; close all ...

  8. PS 图像调整算法——反相

    这个顾名思义,对图像做减法. Image_new=1-Image_old; 原图: 反相:

  9. Python: PS 图像调整--亮度调整

    本文用 Python 实现 PS 图像调整中的亮度调整,具体的算法原理和效果可以参考之前的博客: http://blog.csdn.net/matrix_space/article/details/2 ...

随机推荐

  1. EBS开发技术之trace

    trace的目的 trace主要是用于程序调优,优化,程序bug调试,程序运行系统情况跟踪 trace步骤 1.并发定义中,勾上"启用跟踪" 2.提交一个请求,得到请求编号 注意: ...

  2. 并发计算模型BSP与SEDA

    1    BSP批量同步并行计算 BSP(Bulk Synchronous Parallel)批量同步并行计算用来解决并发编程难的问题.名字听起来有点矛盾,又是同步又是并行的.因为计算被分组成一个个超 ...

  3. 关于MT8127中sdk的编译出错问题

    今天在看MTK提供的SDK编译文档,按照步骤做,结果出错了,文档如下: 2- Building an SDK for MacOS and Linux ------------------------- ...

  4. Android简易实战教程--第十六话《SharedPreferences保存用户名和密码》

    之前在Android简易实战教程--第七话<在内存中存储用户名和密码> 那里是把用户名和密码保存到了内存中,这一篇把用户名和密码保存至SharedPreferences文件.为了引起误导, ...

  5. JDK8帮助文档生成-笔记

    JDK8 出来了,以前习惯了使用.CHM文件来查看API,现在想也这样,这里自己制作了一下,记录一下. 1.需要的工具: ①JD2CHM;②API文档③HTMLlHelper 遇到的问题主要是不知道去 ...

  6. Linux内核编译时会遇到的问题--缺少mkimage

    由于各大平台所带的内核不同,所以编译方式也不同,但方法都是大同小异. 但是,编译内核有时候会提示缺少mkimage这个命令,如何解决? 供应商提供内核的同时也会提供其它的一些,比如Uboot,root ...

  7. UNIX网络编程——心跳包

    所谓的心跳包就是在客户端和服务器端间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包. 一般是用来判断对方(设备,进程或其它网元)是否正常动行,一般采用定 ...

  8. Android进阶(二十七)Android原生扰人烦的布局

    Android原生扰人烦的布局 在开发Android应用时,UI布局是一件令人烦恼的事情.下面主要讲解一下Android中的界面布局. 一.线性布局(LinearLayout) 线性布局分为: (1) ...

  9. windbg分析运行在64位环境下的32位程序的dump

    windbg命令如下 1.   .load wow64exts 2.   !sw 3.   ~* kvnf

  10. Visual Studio2010 安装pthreads2.9.1

    本人最近要利用多线程进行编程,前面一篇博文讲解的是利用VC自带的一些函数库,这里重点探讨一下如何配置pthreads2.9.1的Visual Studio2010的环境.本文分为两个部分,第一部分给出 ...