-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathsimple_color_balance.m
54 lines (39 loc) · 1.19 KB
/
simple_color_balance.m
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
% 对图像进行灰度世界白平衡处理
% 再进行直方图自动对比度调整
function output = simple_color_balance(image)
num = 255;
r = image(:, :, 1);
g = image(:, :, 2);
b = image(:, :, 3);
Ravg = mean(mean(r));
Gavg = mean(mean(g));
Bavg = mean(mean(b));
Max = max([Ravg, Gavg, Bavg]);
ratio = [Max / Ravg, Max / Gavg, Max / Bavg];
satLevel = 0.005 * ratio;
[m,n,p] = size(image);
imgRGB_orig = zeros(p, m*n);
for i = 1 : p
imgRGB_orig(i, : ) = reshape(double(image(:, :, i)), [1, m * n]);
end
imRGB = zeros(size(imgRGB_orig));
%直方图对比度调整
for ch = 1 : p
q = [satLevel(ch), 1 - satLevel(ch)];
tiles = quantile(imgRGB_orig(ch, :), q);
temp = imgRGB_orig(ch, :);
temp(find(temp < tiles(1))) = tiles(1);
temp(find(temp > tiles(2))) = tiles(2);
imRGB(ch, :) = temp;
pmin = min(imRGB(ch, :));
pmax = max(imRGB(ch, :));
% fac(A) = Amin + (A - Alow) * (Amax -Amin)/(Ahigh - Alow)
% 对于8bit图像,Amin = 0,Amax = 255
imRGB(ch, :) = (imRGB(ch, :) - pmin) * num /(pmax - pmin);
end
output = zeros(size(image));
for i = 1 : p
output(:, :, i) = reshape(imRGB(i, :), [m, n]);
end
output = uint8(output);
end