# Images, FITS files, and so on

This was originally a much longer message with a great

> deal of context, but I'm going to make it a lot shorter
> as a series of questions in the hopes of getting a
> Socratic dialog going?

> 1. Is anyone else bothered by the fact that
> imshow(array) displays array[i,j] at Cartesian
> coordinates [j,shape(array)[0]-i] if origin is 'upper'
> and at [j,i] if origin is 'lower'?

Just to make sure I understand, does it bother you that rows and
columns are reversed, or is there a specific gripe with the upper and
lower handling. My motivation in doing is illustrated in this example

In [10]: x = arange(50.); x.shape=5,10

In [11]: imshow(x, interpolation='nearest', origin='upper')
Out[11]: <matplotlib.image.AxesImage instance at 0xb5f00e6c>

In [12]: x
Out[12]:
[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.,]
[ 10., 11., 12., 13., 14., 15., 16., 17., 18., 19.,]
[ 20., 21., 22., 23., 24., 25., 26., 27., 28., 29.,]
[ 30., 31., 32., 33., 34., 35., 36., 37., 38., 39.,]
[ 40., 41., 42., 43., 44., 45., 46., 47., 48., 49.,]]

The voxels on the screen and the array as printed have the same
layout: 5 rows and 10 columns. Basically the inversion happens
because event though it is tradtional to think of x as the first axis
and y as the second, visually if you move along the x axis you are
moving across columns and if you move along the y axis you are moving
along rows.

In any case, I am not sure exactly what your complaint is (and how you
want it to work) so I am just offering a bit of explanation of why it
is the way it is. I think matlab behaves differently, but I don't
have matlab installed right now. I am not sure that the way we are
doing it is the right way, so feel free to offer suggestions.

> 2. In light of the above, how do you handle overlaying
> contours on an image? I see by experiment that
> contour(array) also treats array[i,j] the same way as
> imshow.

Right; does that answer your question? If you want to flip the
indices, you can always transpose....

> 3. Are the astronomers as confused by all of this in
> relation to the FITS WCS standard as I seem to be? How
> do I do the computation correctly so that x[i,j] is the
> first WCS coordinate of FITS pixel (i,j) (which is at
> array[j-1,i-1] after a PyFITS read)?

I'll leave this one to the astronomers... If desired, we can probably
add an option to handle images in the layout that is typical for
astronomers, but the image and contour code is already a bit hairy
trying to deal with upper and lower origin.

JDH