Enhance contrast using histogram equalization

transforms the color map associated with the indexed image `newmap`

= histeq(`X`

,`map`

,`hgram`

)`X`

so that the histogram of the gray component of the indexed image
(`X`

,`newmap`

) approximately matches
the target histogram `hgram`

. The `histeq`

function returns the transformed color map in `newmap`

.
`length(hgram)`

must be the same as
`size(map,1)`

.

`[___,`

also returns the transformation `T`

]
= histeq(___)`T`

that maps the gray
component of the input grayscale image or color map to the gray component of the
output grayscale image or color map.

When you supply a desired histogram `hgram`

, `histeq`

chooses the grayscale transformation `T`

to minimize

$$\left|{c}_{1}(T(k))-{c}_{0}(k)\right|,$$

*c*_{0} is the cumulative
histogram of the input image `I`

, and
*c*_{1} is the cumulative sum of
`hgram`

for all intensities *k*. This
minimization is subject to these constraints:

`T`

must be monotonic*c*_{1}*(T(a))*cannot overshoot*c*_{0}*(a)*by more than half the distance between the histogram counts at*a*

`histeq`

uses the transformation *b* =
*T*(*a*) to map the gray levels in
`X`

(or the color map) to their new values.

If you do not specify `hgram`

, then `histeq`

creates a
flat `hgram`

,

hgram = ones(1,n)*prod(size(A))/n;

and then applies the previous algorithm.