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

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);

最新文章

  1. 2000条你应知的WPF小姿势 基础篇<69-73 WPF Freeze机制和Template>
  2. ORA-28000: the account is locked 账户被锁
  3. Thrift的TBinaryProtocol二进制协议分析
  4. ROS学习(二)—— 配置ROS环境
  5. Spring AOP专业术语解析
  6. 【MySQL】MySQL 5.7+ 版本的初始化
  7. C# 调用C++/MFC写的dll
  8. 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第五章 3(Sorting/Searching)
  9. [转]前景检测算法--ViBe算法
  10. 一步一步写一个简单通用的makefile(一)
  11. AIX操作oracle
  12. C++初始化列表问题
  13. CentOS7卸载KDE桌面(转)
  14. 使文字在div中水平和垂直居中的的css样式为,四个边分别设置阴影样式
  15. 分享一个开源的网盘下载工具BaiduPCS-Go
  16. asp.net FromBody接收不到参数的解决方法
  17. Wyn BI的机会在哪里:越靠近消费者的行业,比如零售、文娱和金融,信息化投入越大 ZT
  18. Oracle数据库表解锁语句
  19. shell :
  20. 一个纯净的webpack4+angular5脚手架

热门文章

  1. 设置 NSZombieEnabled 定位 EXC_BAD_ACCESS 错误
  2. Afinal加载网络图片及下载文件使用方法
  3. Android播放在线音乐文件
  4. API创建员工
  5. C语言函数--atoi
  6. ceil和floor函数的编程实践
  7. 02基于注解开发SpringMVC项目(jar包,异步,request,参数传递,多选的接收,Model传参,map传参,model传参,ajax,重定向,时间日期转换)
  8. android问题:Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER
  9. cocos2dx 3.3 C++工程添加lua支持
  10. 【安卓中的缓存策略系列】安卓缓存之内存缓存LruCache