-
Notifications
You must be signed in to change notification settings - Fork 1
/
GrayWorld.asv
116 lines (88 loc) · 3.18 KB
/
GrayWorld.asv
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
function correctedImg = GrayWorld(Im)
%------------- STEP 1 ------------%
% The brightness of all the pixels in the image is put in order from top to low,
% taking the top 5% of the pixels. If the number of pixels is more than enough
% (such as more than 1000), then calculate the respective average of these
% pixels component (R,G,B) and record as AR, AG, AB;
Im = double(Im);
% Separate channels
R = Im(:,:,1);
G = Im(:,:,2);
B = Im(:,:,3);
% Calculate brightness (arithmetic mean)
brightness = (R + G + B) / 3;
% Find number of pixels in top 5%
totalPixels = numel(brightness);
numTopPixels = round(0.05 * totalPixels);
% Sorting the brightness values in descending order
sortedBrightness = sort(brightness(:), 'descend');
% Get top 5% brightest pixels
topPixelIndices = sortedIndices(1:numTopPixels);
% Calculate the average of the top pixels for each channel
AR = mean(R(topPixelIndices));
AG = mean(G(topPixelIndices));
AB = mean(B(topPixelIndices));
%--------------- STEP 2 ---------------% Behövs ej eller??????
% Calculate the value of max(AR, AG, and AB)/ min(AR, AG, and AB).
% If the value greatly deviates from 1, then determine the image has light interference.
Max = max([AR, AG, AB]);
Min = min([AR, AG, AB]);
Div = Max ./ Min;
% Determine if there is light interference
if Div > 1.2 % Adjust this threshold as needed
disp('The image has light interference.');
else
disp('The image does not have significant light interference.');
end
%--------------- STEP 1 ---------------%
% Calculate the respective averages
avgR = mean(R(:));
avgG = mean(G(:));
avgB = mean(B(:));
avgGray = (avgR + avgG + avgB) / 3;
%--------------- STEP 2 ---------------%
% Calculate the adjustment factors
aR = avgGray / avgR;
aG = avgGray / avgG;
aB = avgGray / avgB;
%--------------- STEP 3 ---------------%
% Adjust the values of R, G and B with the adjustment factors
adjustedR = R * aR;
adjustedG = G * aG;
adjustedB = B * aB;
% Check if the adjusted values exceed 255, if they do, set them to 255
% Gives range of [0 255]
adjustedR(adjustedR > 255) = 255;
adjustedG(adjustedG > 255) = 255;
adjustedB(adjustedB > 255) = 255;
%--------------- STEP 4 ---------------%
% Combine the adjusted channels to get the final adjusted image
% correctedImg = cat(3, adjustedR, adjustedG, adjustedB);
correctedImg(:,:,1) = adjustedR;
correctedImg(:,:,2) = adjustedG;
correctedImg(:,:,3) = adjustedB;
% % Respective average of the channels
% AR = mean(R(:));
% AG = mean(G(:));
% AB = mean(B(:));
%
% % Av
% avgR = R / AR;
% avgG = G / AG;
% avgB = B / AB;
%
% avgGray = (avgR + avgG + avgB) / 3;
%
% % Adjustment factor
% aR = avgGray / avgR;
% aG = avgGray / avgG;
% aB = avgGray / avgB;
%
% % Adjust values of R, G, and B
% R = R * aR;
% G = G * aG;
% B = B * aB;
% correctedImg(:,:,1) = av_R/max(av_R(:));
% correctedImg(:,:,2) = av_G/max(av_R(:));
% correctedImg(:,:,3) = av_B/max(av_R(:));
end