PS 图像调整算法——亮度调整
这个算法是参考自 阿发伯 的博客,在此对 阿发伯 表示感谢,
亮度调整
非线性亮度调整:
对于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 图像调整算法——亮度调整的更多相关文章
- PS 图像调整算法——阈值
PS里面这个算法,先将图像转成灰度图像,然后根据给定的阈值,大于该阈值的像素赋值为1,小于该阈值的赋值为0. if x>T, x=1; if x<T, x=0; 原图: 效果图:阈值为 1 ...
- PS 图像调整算法——自动色阶 (Auto Levels)
PS 给出的定义: Enhance Per Channel Contrast:Maximizes the tonal range in each channel to produce a more d ...
- PS 图像调整算法——黑白
这个算法是参考自 阿发伯 的博客: http://blog.csdn.net/maozefa 黑白调整 Photoshop CS的图像黑白调整功能,是通过对红.黄.绿.青.蓝和洋红等6种颜色的比例调节 ...
- PS 图像调整算法——饱和度调整
算法参考自 阿发伯 的博客. http://blog.csdn.net/maozefa 饱和度调整 图像的饱和度调整有很多方法,最简单的就是判断每个象素的R.G.B值是否大于或小于128,大于加上调整 ...
- PS 图像调整算法——自动对比度 (Auto Contrast)
PS 给出的定义: Enhance Monochromatic Contrast: Clips all channels identically. This preserves the overall ...
- PS 图像调整算法— —渐变映射
这个调整简单来说就是先建立一张lookup table, 然后以图像的灰度值作为索引,映射得到相应的颜色值.图像的灰度值是由图像本身决定的,但是lookup table 却可以各种各样,所以不同的lo ...
- PS 图像调整算法——色调分离
色调分离的原理就是将R, G, B每个通道 0-255 的色调区间进行强制划分到给定的区间里去,所以色调会合并,最终的图像看起来颜色就是一块一块的. clc; clear all; close all ...
- PS 图像调整算法——反相
这个顾名思义,对图像做减法. Image_new=1-Image_old; 原图: 反相:
- Python: PS 图像调整--亮度调整
本文用 Python 实现 PS 图像调整中的亮度调整,具体的算法原理和效果可以参考之前的博客: http://blog.csdn.net/matrix_space/article/details/2 ...
随机推荐
- Android 的 Sqlite基本操作
在 SQL 数据库中保存数据 使用数据库 将数据保存到数据库对于重复或结构化数据(比如契约信息)而言是理想之选. 本课程假定您基本熟悉 SQL 数据库并且可帮助您开始在 Android 中使用 SQL ...
- Makefile自动生成:cmake
http://blog.csdn.net/pipisorry/article/details/51647073 编辑makefile文件CMakeLists.txt,使用cmake命令自动生成make ...
- 01_Eclipse的使用方法
1 选择工作站 Workspace:表示工作站 2 切换工作站 选择工作站的方式:File->SwitchWorkspace 这里选择其他的工作站 清除工作站的方式: 找到MyEclips ...
- 6、Android Content Provider测试
如果你的应用中使用了Content Provider来与其他应用进行数据交互,你需要对Content Provider进行测试来确保正常工作. 创建Content Provider整合测试 在Andr ...
- 如何在Cocos2D游戏中实现A*寻路算法(六)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- Android 面向协议编程 体会优雅编程之旅
Android中面向协议编程的深入浅出 http://blog.csdn.net/sk719887916/article/details skay编写 说起协议,现实生活中大家第一感觉会想到规则或者约 ...
- Unity UGUI基础之Image
UGUI的Image等价于NGUI的Sprite组件,用于显示图片. 一.Image组件: Source Image(图像源):纹理格式为Sprite(2D and UI)的图片资源(导入图片后选择T ...
- MO_GLOBAL - EBS R12 中 Multi Org 设计的深入研究(1)
在改EBS的BUG过程中,会在网上查找很多资料,这次是碰到一个多组织(Multi Org)的问题,发现Anil Passi写的几篇文章不错,慢慢的会陆续翻译过来,这次翻译的是http://getapp ...
- Socket编程实践(2) --Socket编程导引
什么是Socket? Socket可以看成是用户进程与内核网络协议栈的接口(编程接口, 如下图所示), 其不仅可以用于本机进程间通信,可以用于网络上不同主机的进程间通信, 甚至还可以用于异构系统之间的 ...
- Java实现简易的文本编辑器
需求分析: 获得文本名称 实现尾部追加功能 实现覆盖式添加数据 删除数据 获取光标位置 在特定光标位置处添加数据 查找特定字符串在主串中第一次出现的位置 统计文本文件内出现的数字,汉字,英文字母,特殊 ...