[SciPy-user] histogram equalization using scipy.interpolate.splrep

Sebastian Haase haase at msg.ucsf.edu
Tue Jul 31 17:58:19 EDT 2007


Hi,
I'm trying to implement an efficiant numpy / scipy based
implementation of an image analysis procedure called "histogram
equalization".
http://en.wikipedia.org/wiki/Histogram_equalization

(I don't want to use the Python Imaging Library !)

For that I calculate the intesity histogram of my 2D or 3D images
(Let's call this 1D array `h`). Then I calculate `hh=
h.astype(N.float).cumsum()`

Now I need to create a new 2D / 3D image replacing each pixel value
with the corresponding "look-up value" in `hh`.
The means essentially doing something like

`a2 = hh[a]`  -- if `a` was the original image.
Of course this syntax does not work, because
a) the array index lookup probably is not possible using 2D/3D indices
like this - right !?
and
b) my histogram is just sampling / approximating all the actually
occuring values in `a`. In other words:  the histogram is based on
creating bins, and nearby pixel values in `a` are then counted into
same bin.  Consequently there is no simple  "array index lookup" to
get the needed value out of the `h` array. Instead one needs to
interpolate.

This is were I thought the scipy.interpolate package might come in handy ;-)
In fact, if `a` was a 1D "image" I think this would work:
 >>> rep = scipy.interpolate.splrep(x,y)   # x,y being the
horizontal,count axis in my histogram
 >>> aa = scipy.interpolate.splev(a,rep)

But for a.ndim being 2 I get:
Traceback (most recent call last):
  File "<input>", line 1, in ?
  File "C:\PrWinN\scipy\interpolate\fitpack.py", line 443, in splev
    y,ier=_fitpack._spl_(x,der,t,c,k)
ValueError: object too deep for desired array

Using N.vectorize(lambda x: scipy.interpolate.splev(x,rep))
works but is slow.

I there a fast vectorized version of some interpolation already in
scipy.interpolate ?
Am I missing something ?

Thanks,
Sebastian Haase



More information about the SciPy-User mailing list