Estimate illuminant using gray world algorithm
Correct White Balance Using Gray World Algorithm
Open an image and display it. Specify an optional magnification to shrink the size of the displayed image.
A = imread('foosball.jpg'); figure imshow(A,'InitialMagnification',25) title('Original Image')
The gray world algorithm assumes that the RGB values are linear. However, the JPEG file format saves images in the gamma-corrected sRGB color space. Undo the gamma correction by using the
A_lin = rgb2lin(A);
Estimate the scene illumination, excluding the top and bottom 10% of pixels. Because the input image has been linearized,
illumgray returns the illuminant in the linear RGB color space.
percentiles = 10; illuminant = illumgray(A_lin,percentiles)
illuminant = 1×3 0.2206 0.2985 0.5219
The third coefficient of
illuminant is the largest, which is consistent with the blue tint of the image.
Correct colors by providing the estimated illuminant to the
B_lin = chromadapt(A_lin,illuminant,'ColorSpace','linear-rgb');
To display the white-balanced image correctly on the screen, apply gamma correction by using the
B = lin2rgb(B_lin);
Display the corrected image, setting the optional magnification.
figure imshow(B,'InitialMagnification',25) title(['White-Balanced Image Using Gray World with percentiles=[' ... num2str(percentiles) ' ' num2str(percentiles) ']'])
A — RGB image
m-by-n-by-3 numeric array
RGB image, specified as an m-by-n-by-3 numeric array.
percentile — Percentile of pixels to exclude
1 (default) | numeric scalar | 2-element numeric vector
Percentile of pixels to exclude from the illuminant estimation, specified as a numeric scalar or 2-element numeric vector. Excluding pixels helps prevent overexposed and underexposed pixels from skewing the estimation.
percentileis a scalar, the same value is used for both the bottom percentile and the top percentile. In this case,
percentilemust be in the range [0, 50] so that the sum of the bottom and top percentiles does not exceed 100.
percentileis a 2-element vector, the first element is the bottom percentile and the second element is the top percentile. Both percentiles must be in the range [0, 100) and their sum cannot exceed 100.
The following image indicates the range of pixels that are included in the illuminant estimation. The selection is separate for each color channel.
Specify optional pairs of arguments as
the argument name and
Value is the corresponding value.
Name-value arguments must appear after other arguments, but the order of the
pairs does not matter.
Before R2021a, use commas to separate each name and value, and enclose
Name in quotes.
illuminant = illumgray(I,'Mask',m) estimates the scene
illuminant using a subset of pixels in image
according to a binary mask,
Mask — Image mask
m-by-n logical or numeric
Image mask, specified as the comma-separated pair consisting of
'Mask' and an
m-by-n logical or numeric
array. The mask indicates which pixels of the input image
A to use when estimating the illuminant. The
computation excludes pixels in
A that correspond to
a mask value of 0. By default, the mask has all 1s, and all pixels in
A are included in the estimation.
Norm — Type of vector norm (p-norm)
1 (default) | positive numeric scalar
Type of vector norm (p-norm), specified as the comma-separated pair
'Norm' and a positive numeric scalar.
The p-norm affects the calculation of the average RGB value in the input
A. The p-norm is defined as sum(abs(x)p) ^ (1/p).
illuminant — Estimate of scene illumination
3-element numeric row vector
Estimate of scene illumination, returned as a 3-element numeric row vector. The three elements correspond to the red, green, and blue values of the illuminant.
The gray world algorithm assumes uniform illumination and linear RGB values. If you are working with nonlinear sRGB or Adobe RGB images, use the
rgb2linfunction to undo the gamma correction before using
illumgray. Also, make sure to convert the chromatically adapted image back to sRGB by using the
When you specify
Mask, the bottom percentile and top percentile apply to the masked image.
You can adjust the color balance of the image to remove the scene illumination by using the
 Ebner, Marc. "The Gray World Assumption." Color Constancy. Chichester, West Sussex: John Wiley & Sons, 2007.
Introduced in R2017b