[AstroPy] Moving Ahead with Raw Image Conversion

Anne Archibald peridot.faceted at gmail.com
Mon Apr 13 17:32:34 EDT 2009

2009/4/13 Wayne Watson <sierra_mtnview at sbcglobal.net>:
> Hi, not familiar with much of anything in numpy, then again, I'm not anxious
> to read through the 300+ page manual. :-)

The manual is not the place to start. I'd look at several of the
tutorials listed at http://www.scipy.org/Documentation . Even if their
connection to what you want to do is not immediately obvious, they
will give you a better idea of the easiest way to work with numerical
arrays in python.

> Well, let's see if I can explain this in py-talk. Here's a small program I
> wrote to get the raw image
> #import Image
> import string
> def make_array():
>   im_array=[]
>   im_data=range(10)
>   print im_data
>   for j in range(2):
>       row=[]
>       for k in range(5):
>           item=hex(int(im_data[k+j*5]))
>           row.append(item)
>       im_array.append(row)
>   print im_array
> raw_file=open('sent_internal.raw','rb')
> raw_image=raw_file.read()
> raw_file.close()
> print 'info:', len(raw_image), type(raw_image)
> make_array()
> make_array, instead of working on the 307200 byte(640x480) string
> representing the image, is used to see if I can generate a 2x5 array like
> that apparently needed to represent the image to pyfits. The above produces
> this:
> info: 307200 <type 'str'>
> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  <--- my fictional 2x5 image as a py list.
> [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]   <--- the type of structure I think
> numarray(numpy equivalent) wants.

I strongly suspect that if your image is 640x480, pyfits wants a
640x480 array. Since your array is raw (unsigned?) bytes, this is
fairly easy to do:

# read in the file as unsigned 8-bit integers, giving a one-dimensional array
array = numpy.fromfile("file.raw", dtype=numpy.uint8)

# now reinterpret the same array as 640x480
array = numpy.reshape(array, (640,480))

Your most likely problem will be that the image will be mangled
because you're writing it as 480x640 and reading it as 640x480; if
this is what's happening you can instead do

array = numpy.reshape(array, (640,480), order='FORTRAN')

(The history here is that in C, an array of shape 640x480 puts the 480
elements in a column together, while FORTRAN would put the 640
elements in a row together. numpy can do either, but you have to tell
it which you want. You probably want FORTRAN order.)

If you also have matplotlib installed, you can try to view the output:

import pylab

> I'm looking at page 7 of the FITS manual, and I see in the middle,
> hdulist[1].data. This appears to be where the data(image) goes. At the top
> of page 10, the steps to construct a simple fits file are shown. numarray is
> used. Simply put, how do I proceed from here?

>From here I leave you to the people with more pyfits experience, but
you will probably need to supply some metadata - date, time, lat/long,
RA/Dec, field of view, some sort of brightness scale, et cetera - then
hand pyfits your array.

Good luck,

> I've attached the 'sent_internal.raw' file. It may cause this msg to be
> rejected by the mail list.
> Jim Vickroy wrote:
>> Wayne Watson wrote:
>>> I've pretty much gotten my 640x480 1 byte, "raw" image under control
>>> within Python Image and Python file use. I wrote a file of 307200 bytes in
>>> bytes, byte representation of characters. I couldn't see anything within
>>> pyfits or numpy that would help me do that. Now I believe I'm in a position
>>> to use pyfits to create a fits format file. The next step is to arrange the
>>> image (data) into a 640x480 array. I can do that in python, but would like
>>> to know how it can be done in numpy, for the experience. The IDA tutorial
>>> talks to making arrays, but I do not see where they work with creating an
>>> array with fresh data. Once that's done, then I should be able to work out
>>> from a reading of page 10 in the pyfits manual.
>> Hello Wayne,
>> Could you post a sample script illustrating exactly what you want to do
>> along with some sample output showing how it is failing to do so?
>> Are you familiar with the numpy.ndarray.reshape() procedure?
>> -- jv
>> _______________________________________________
>> AstroPy mailing list
>> AstroPy at scipy.org
>> http://mail.scipy.org/mailman/listinfo/astropy
> --
>          Wayne Watson (Watson Adventures, Prop., Nevada City, CA)
>            (121.015 Deg. W, 39.262 Deg. N) GMT-8 hr std. time)
>             Obz Site:  39° 15' 7" N, 121° 2' 32" W, 2700 feet
>          All the neutrons, and protons in the human body occupy          a
> cube whose side is 5.52*10**-6 meters (tiny!). That          adds up to a
> 150 pound person. It's not a surprise that
>          we are mostly space. (Calculation by WTW)
> _______________________________________________
> AstroPy mailing list
> AstroPy at scipy.org
> http://mail.scipy.org/mailman/listinfo/astropy

More information about the AstroPy mailing list