[AstroPy] Moving Ahead with Raw Image Conversion

Peter Erwin erwin@mpe.mpg...
Mon Apr 13 16:04:59 CDT 2009

```Hi Wayne,

OK, I read up a little on byte --> integer conversion, and the
following seems to work
(there may be a more elegant way of doing this, mind you):

import struct, numpy, pyfits   # struct is part of the main Python
library

# get raw data from .raw file:
raw_file=open('sent_internal.raw','rb')
raw_file.close()

# convert raw data to Python list of integers (1-D):
rawim_intarray = []
for x in raw_image:
# convert byte to integer ('B' = treat data as single unsigned byte)
newint = struct.unpack('B', x)[0]
rawim_intarray.append(newint)

# convert Python list of integers into numpy array of integers (note:
still 1-D at this point)
rawim_numpy = numpy.array(rawim_intarray)

# reshape numpy array into 2D form, using our knowledge of the
original image's
# x and y sizes (kudos to Megan Sosey for pointing out how to do this)
rawim_numpy_2d = numpy.reshape(rawim_numarray,(480, 640))

hdu = pyfits.PrimaryHDU(rawim_numpy_2d)

# (make any modifications to the header you might want to... e.g., see
Megan Sosey's
# email of April 8 for examples)

# ... and save the data to disk as a FITS file:
hdu.writeto("test.fits")

That seemed to work for me...

cheers,

Peter

On Apr 13, 2009, at 6:38 PM, Wayne Watson wrote:

> Hi, not familiar with much of anything in numpy, then again, I'm not
> anxious to read through the 300+ page manual. :-)
> 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_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'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?
>
>
> 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@scipy.org
>> http://mail.scipy.org/mailman/listinfo/astropy
>>
>>
>
> --
>
>            (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)
>
> <sent_internal.raw>_______________________________________________
> AstroPy mailing list
> AstroPy@scipy.org
> http://mail.scipy.org/mailman/listinfo/astropy

=============================================================
Peter Erwin                   Max-Planck-Insitute for Extraterrestrial
erwin@mpe.mpg.de              Physics, Giessenbachstrasse
tel. +49 (0)89 30000 3695     85748 Garching, Germany
fax  +49 (0)89 30000 3495     http://www.mpe.mpg.de/~erwin

```