This is machine translation

Translated by Microsoft
Mouseover text to see original. Click the button below to return to the English verison of the page.

Note: This page has been translated by MathWorks. Please click here
To view all translated materals including this page, select Japan from the country navigator on the bottom of this page.


Angle between two RGB vectors


angle = colorangle(rgb1,rgb2)



angle = colorangle(rgb1,rgb2) computes the angle in degrees between two RGB vectors.


collapse all

Open a test image. The image is the raw data captured with a Canon EOS 30D digital camera after correcting the black level and scaling the intensities to 16 bits per pixel. No demosaicing, white balancing, color enhancement, noise filtering, or gamma correction has been applied.

A = imread('foosballraw.tiff');

Interpolate using the demosaic function to obtain a color image. The color filter array pattern is RGGB.

A_demosaiced = demosaic(A,'rggb');

The image contains a ColorChecker chart. Specify the ground truth illuminant, which was calculated in advance using the neutral patches of the chart.

illuminant_groundtruth = [0.0717 0.1472 0.0975];

To avoid skewing the estimation of the illuminant, exclude the ColorChecker chart by creating a mask.

mask = true(size(A_demosaiced,1), size(A_demosaiced,2));
mask(920:1330,1360:1900) = false;

Run three different illuminant estimation algorithms: illumwhite, illumgray, and illumpca.

illuminant_whitepatch = illumwhite(A_demosaiced,'Mask',mask);
illuminant_grayworld = illumgray(A_demosaiced,'Mask',mask);
illuminant_pca = illumpca(A_demosaiced,'Mask',mask);

Compare each estimation against the ground truth by calculating the angle between each estimated illuminant and the ground truth using the colorangle function. The smaller the angle, the better the estimation. The magnitude of the estimation does not matter because only the direction of the illuminant is used to white-balance an image with chromatic adaptation.

angle_whitepatch = colorangle(illuminant_whitepatch, illuminant_groundtruth)
angle_whitepatch = 5.0921
angle_grayworld = colorangle(illuminant_grayworld, illuminant_groundtruth)
angle_grayworld = 5.1036
angle_pca = colorangle(illuminant_pca, illuminant_groundtruth)
angle_pca = 4.9311

The value of angle_pca is smallest, indicating that the PCA illuminant estimation algorithm is closest to the ground truth illumination for this image.

Input Arguments

collapse all

First RGB vector, specified as a 3-element numeric vector.

Data Types: single | double | uint8 | uint16

Second RGB vector, specified as a 3-element numeric vector.

Data Types: single | double | uint8 | uint16

Output Arguments

collapse all

Angle between RGB vectors, returned as a numeric scalar.

Data Types: double

More About

collapse all

Angular Error

Angular error is a useful metric to evaluate the estimation of an illuminant against the ground truth. The smaller the angle between the ground truth illuminant and the estimated illuminant, the better the estimate.

Introduced in R2017b

Was this topic helpful?