亮度调整
非线性亮度调整:
对于R,G,B三个通道,每个通道增加相同的增量。
线性亮度调整:
利用HSL颜色空间,通过只对其L(亮度)部分调整,可达到图像亮度的线性调整。但是,RGB和HSL颜色空间的转换很繁琐,一般还需要浮点数的运算,不仅增加了代码的复杂度,更重要的是要逐点将RGB转换为HSL,然后确定新的L值,再将HSL转换为RGB,运行速度可想而知是很慢的。要想提高图像亮度线性调整的速度,应该从三方面考虑,一是变浮点运算为整数运算,二是只提取HSL的L部分进行调整,三是采用汇编代码,在Delphi中,当然是BASM。下面是按照这三方面考虑写的图像亮度线性调整代码:
1
|
L : = ( Max (R, Max (G,B)) + Min (R, Min (G, B))) div 2 ;
|
L没有采用通常的百分比表示,而是取值0 - 255,这样就不必要采用浮点数运算了。
下面代码主要完成2个功能,一是用以前的L值与RGB分别求出其HSL的HS部分,其公式用Pascal表示为:
1
2
3
4
5
6
7
8
9
10
11
|
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值,计算方法为:
1
2
3
4
5
6
7
8
9
10
11
|
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;
|
如此,一个像素点的线性亮度调整就基本完成了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
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 );
|
总结
以上所述是小编给大家介绍的python中PS 图像调整算法原理之亮度调整 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
原文链接:https://blog.csdn.net/matrix_space/article/details/22991683