This is machine translation

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

Note: This page has been translated by MathWorks. Click here to see
To view all translated materials including this page, select Country from the country navigator on the bottom of this page.

Enhance Color Separation Using Decorrelation Stretching

Decorrelation stretching enhances the color separation of an image with significant band-to-band correlation. The exaggerated colors improve visual interpretation and make feature discrimination easier. You apply decorrelation stretching with the decorrstretch function. See Linear Contrast Stretching on how to add an optional linear contrast stretch to the decorrelation stretch.

The number of color bands, NBANDS, in the image is usually three. But you can apply decorrelation stretching regardless of the number of color bands.

The original color values of the image are mapped to a new set of color values with a wider range. The color intensities of each pixel are transformed into the color eigenspace of the NBANDS-by-NBANDS covariance or correlation matrix, stretched to equalize the band variances, then transformed back to the original color bands.

To define the band-wise statistics, you can use the entire original image or, with the subset option, any selected subset of it.

Simple Decorrelation Stretching

This example shows how to perform decorrelation stretching to three color bands of an image. A color band scatterplot of the images shows how the bands are decorrelated and equalized.

Perform Decorrelation Stretch

Read an image from the library of images available in the imdata folder. This examples uses a LANDSAT image of the Little Colorado River. The image has seven bands, but just read in the three visible colors.

A = multibandread('littlecoriver.lan', [512, 512, 7], ...
  'uint8=>uint8', 128, 'bil', 'ieee-le', ...
  {'Band','Direct',[3 2 1]});

Perform the decorrelation stretch.

B = decorrstretch(A);

Display the original image and the processed image. Compare the two images. The original has a strong violet (red-bluish) tint, while the transformed image has a somewhat expanded color range.

title('Little Colorado River Image')

title('Little Colorado River Image After Decorrelation Stretch')

Create a Color Band Scatterplot

First separate the three color channels of the original image.

[rA,gA,bA] = imsplit(A);

Separate the three color channels of the image after decorrelation stretching.

[rB,gB,bB] = imsplit(B);

Display the color scatterplot of the original image. Then display the color scatterplot of the image after decorrelation stretching.

grid on
xlabel('Red (Band 3)')
ylabel('Green (Band 2)')
zlabel('Blue (Band 1)')
title('Color Scatterplot Before Decorrelation Stretch')

grid on
xlabel('Red (Band 3)')
ylabel('Green (Band 2)')
zlabel('Blue (Band 1)')
title('Color Scatterplot After Decorrelation Stretch')

Linear Contrast Stretching

Adding linear contrast stretch enhances the resulting image by further expanding the color range. The following example uses the Tol option to saturate equal fractions of the image at high and low intensities. Without the Tol option, decorrstretch applies no linear contrast stretch.

See the stretchlim function reference page for more about calculating saturation limits.


You can apply a linear contrast stretch as a separate operation after performing a decorrelation stretch, using stretchlim and imadjust. This alternative, however, often gives inferior results for uint8 and uint16 images, because the pixel values must be clamped to [0 255] (or [0 65535]). The Tol option in decorrstretch circumvents this limitation.

Decorrelation Stretch with Linear Contrast Stretch

Read the three visible color channels of the LANDSAT image of the Little Colorado River.

A = multibandread('littlecoriver.lan', [512, 512, 7], ...
  'uint8=>uint8', 128, 'bil', 'ieee-le', ...
  {'Band','Direct',[3 2 1]});

Apply decorrelation stretching, specifying the linear contrast stretch. Setting the value 'Tol' to 0.01 maps the transformed color range within each band to a normalized interval between 0.01 and 0.99, saturating 2%.

C = decorrstretch(A,'Tol',0.01);
title(['Little Colorado River After Decorrelation Stretch and ',...
  'Linear Contrast Stretch'])