Apply decorrelation stretch to multichannel image

`S = decorrstretch(A)`

`S = decorrstretch(A,Name,Value)`

applies
a decorrelation stretch to RGB or multispectral image `S`

= decorrstretch(`A`

)`A`

and returns the
result in `S`

. The mean and variance in each band of `S`

are the same as in `A`

.

The primary purpose of decorrelation stretch is visual enhancement. Decorrelation stretching is a way to enhance the color differences in an image.

uses name-value pairs to control aspects of the decorrelation stretch, such as the target mean
and standard deviation of each band.`S`

= decorrstretch(`A`

,`Name,Value`

)

The results of a straight decorrelation (without the contrast stretch option) may include values that fall outside the numerical range supported by the class

`uint8`

or`uint16`

(negative values, or values exceeding`255`

or`65535`

, respectively). In these cases,`decorrstretch`

clamps its output to the supported range.For class

`double`

,`decorrstretch`

clamps the output only when you provide a value for`Tol`

, specifying a linear contrast stretch followed by clamping to the interval`[0 1]`

.The optional parameters do not interact, except that a linear stretch usually alters both the band-wise means and band-wise standard deviations. Thus, while you can specify

`TargetMean`

and`TargetSigma`

along with`Tol`

, their effects will be modified.

A decorrelation stretch is a linear, pixel-wise operation in
which the specific parameters depend on the values of actual and desired
(target) image statistics. The vector `a`

containing
the value of a given pixel in each band of the input image `A`

is
transformed into the corresponding pixel `b`

in output
image `B`

as follows:

`b = T * (a - m) + m_target`

.

`a`

and `b`

are `nBands`

-by-1
vectors, `T`

is an `nBands`

-by-`nBands`

matrix,
and `m`

and `m_target`

are `nBands`

-by-1
vectors such that

`m`

contains the mean of each band in the image, or in a subset of image pixels that you specify`m_target`

contains the desired output mean in each band. The default choice is`m_target = m`

.

The linear transformation matrix `T`

depends
on the following:

The band-to-band sample covariance of the image, or of a subset of the image that you specify (the same subset as used for

`m`

), represented by matrix`Cov`

A desired output standard deviation in each band. This is conveniently represented by a diagonal matrix,

`SIGMA_target`

. The default choice is`SIGMA_target = SIGMA`

, where`SIGMA`

is the diagonal matrix containing the sample standard deviation of each band.`SIGMA`

should be computed from the same pixels that were used for`m`

and`Cov`

, which means simply that:`SIGMA(k,k) = sqrt(Cov(k,k), k = 1,..., nBands)`

.

`Cov`

, `SIGMA`

, and `SIGMA_target`

are `nBands`

-by-`nBands`

,
as are the matrices `Corr`

, `LAMBDA`

,
and `V`

, defined below.

The first step in computing `T`

is to perform
an eigen-decomposition of either the covariance matrix `Cov`

or
the correlation matrix

`Corr = inv(SIGMA) * Cov * inv(SIGMA)`

.

In the correlation-based method,

`Corr`

is decomposed:`Corr = V LAMBDA V'`

.In the covariance-based method,

`Cov`

is decomposed:`Cov = V LAMBDA V'`

.

`LAMBDA`

is a diagonal matrix of eigenvalues
and `V`

is the orthogonal matrix that transforms
either `Corr`

or `Cov`

to `LAMBDA`

.

The next step is to compute a stretch factor for each band,
which is the inverse square root of the corresponding eigenvalue.
It is convenient to define a diagonal matrix `S`

containing
the stretch factors, such that:

`S(k,k) = 1 / sqrt(LAMBDA(k,k))`

.

Finally, matrix `T`

is computed from either

`T = SIGMA_target V S V' inv(SIGMA) `

(correlation-based
method)

or

`T = SIGMA_target V S V'`

(covariance-based
method).

The two methods yield identical results if the band variances are uniform.

Substituting `T`

into the expression for `b`

:

```
b = m_target + SIGMA_target V S V' inv(SIGMA) * (a
- m)
```

or

`b = m_target + SIGMA_target V S V' * (a - m)`

and reading from right to left, you can see that the decorrelation stretch:

Removes a mean from each band

Normalizes each band by its standard deviation (correlation-based method only)

Rotates the bands into the eigenspace of

`Corr`

or`Cov`

Applies a stretch

`S`

in the eigenspace, leaving the image decorrelated and normalized in the eigenspaceRotates back to the original band-space, where the bands remain decorrelated and normalized

Rescales each band according to

`SIGMA_target`

Restores a mean in each band.