<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Comments below.<br>
<br>
Peter Erwin wrote:
<blockquote cite="mid:4C7A0F23-5747-4C4A-AE11-BF3A577CFEAC@mpe.mpg.de"
 type="cite"><br>
On Apr 8, 2009, at 1:50 PM, Wayne Watson wrote:
  <br>
  <br>
[snip]
  <br>
  <br>
  <blockquote type="cite">This is close to what I'm looking for. That
is, executable Python code,
    <br>
and not interactive code one enters line by line. Right now I'm lacking
    <br>
a way to read, say, a jpg, fits, or gif file, and convert it to fits.
    <br>
I'm also lacking a way to convert the internal image format to fits.
The
    <br>
latter is very important. The internal format is simple. An image
    <br>
640x480 pixels and 8-bits deep, b/w. jpg, etc. is already done for
    <br>
writing the internal file.&nbsp; For fits files, I'd like to write very
    <br>
simple headers that have, say, lat/long of observer, a time stamp, and
    <br>
some other assorted items.
    <br>
    <br>
  </blockquote>
  <br>
*Writing* a FITS file using pyfits is not very difficult.&nbsp; The
bare-bones
  <br>
description of this is in the pyfits manual ("Create FITS Images from
Scratch",
  <br>
on p.10, I think).&nbsp; Since you're working with images, you need to have
the image
  <br>
data as a 2D numpy array (the example on p.10 uses a 1-D array).
  <br>
</blockquote>
It's there, as you say, and I've seen it. Maybe I was put off by what
appeared to be a purely interactive approach, or whatever.&nbsp; Somewhere
over time I apparently drifted off course away from the fits manual and
numpy onto other considerations. The thread certainly got busy. I think
though I realized that I may have to put my internal format in order to
use it, but wasn't quite ready for that. See below. <br>
&nbsp;<br>
Anyway, continuing to read your response. <br>
<br>
<blockquote cite="mid:4C7A0F23-5747-4C4A-AE11-BF3A577CFEAC@mpe.mpg.de"
 type="cite"><br>
(Pyfits manual available here:
<a class="moz-txt-link-freetext" href="http://www.stsci.edu/resources/software_hardware/pyfits">http://www.stsci.edu/resources/software_hardware/pyfits</a>&nbsp;)
  <br>
  <br>
  <br>
Since you say that the existing Python code handles the "internal image
  <br>
format", then it must somewhere have the data in a Python data
structure,
  <br>
perhaps as a list of lists, or perhaps as a Python array.&nbsp; You'll need
to
  <br>
go into this existing code and find out what the internal format is;
then
  <br>
you'll have some idea of how to convert it to a numpy array.&nbsp; It might
be
  <br>
as simple as
  <br>
&nbsp;&nbsp; image_for_fits = numpy.array(image_oldformat)
  <br>
</blockquote>
OK, numpy is apparently from the numPy. I'm pretty sure the author of
the program never used numPy for any image work. Numpy is there, but
probably for different purposes. Possibly with Pylab, which is used
minimally. <br>
<br>
Ah, the data structure. Now there's a story. Apparently, the author of
the program and hardware engineer for the imaging box laid it out in
the box, and I don't think it's visible in the code.&nbsp; However, from
what I understand it must look something like the same
structure used for a bmp file, but without the dib and whatever else
is used by bmp. In other words, it's likely a simple array 640x480.
What I see are hardware commands like:<br>
<br>
&nbsp;&nbsp;&nbsp; def StackAndSave(self):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.Upload("P")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<u><b> &lt;--- using h/w</b></u><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.after_id = self.master.after(10000,self.FetchAndSave)<br>
<br>
&nbsp;&nbsp;&nbsp; def ResetVideo(self):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.Upload("X") &nbsp; &nbsp; &nbsp; &nbsp; <u><b> &lt;--- using h/w</b></u><br>
<br>
and what appears to be the hear of the hardware/software action to get
the image, in part shown here:<br>
&nbsp;&nbsp;&nbsp; def DownloadEvent( self ):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # print "Download event at: %s" % time.asctime()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output_items = []<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.Upload("E") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<u><b> &lt;--- using h/w</b></u><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = self.Download( 8 + 4 * 380 )<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not s:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.LogError( "Time history missed" )<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return False<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ref_img = self.StdSizeImage( ref )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;----- <u><b>he
may have assembled the image here</b></u><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.show_real_time:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.reference_image = ref_img<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.Show( ref_img )<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.subimages = []<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ---<br>
<br>
Actually, I have two worries. The way things are done, I think mostly
in the hardware box, is that the first image into the file is 640x480.
Each successive image is 120x120. The reason for this is the camera is
recording the movement of the meteor, and the background is not going
to change, so for speed and economy purposes I suppose, only the
120x120 box image (sometimes called a sprite) following the meteor
movement is brought down rather than the whole 640x480. To display an
image to the user, the code "pastes" the sprite into the appropriate
place on the full image, and shows that to the user. I only need to
figure out where the assembled image is and check the size. In any
case, it doesn't seem evident from the code that the final 640x480
image is spelled out clearly. In reality then, I have just the one
worry, or maybe none. :-) I do know where the operational (assembled)
image is. I guess that was just an educational moment!<br>
<br>
<blockquote cite="mid:4C7A0F23-5747-4C4A-AE11-BF3A577CFEAC@mpe.mpg.de"
 type="cite"><br>
Since your data is 8 bit, it would make sense to use a numpy *integer*
  <br>
array; I believe pyfits is smart enough to save the result as an
integer
  <br>
FITS file.
  <br>
  <br>
The Pyfits manual also explains how to add header keywords (see the
  <br>
chapter on Headers).
  <br>
</blockquote>
Yes, I noticed that, but write has been a deeper issue.<br>
<blockquote cite="mid:4C7A0F23-5747-4C4A-AE11-BF3A577CFEAC@mpe.mpg.de"
 type="cite"><br>
(Note that the Pyfits manual is still based on version 1.0, and so it
refers to
  <br>
"numarray" instead of "numpy"; you should just mentally substitute
"numpy"
  <br>
wherever you see "numarray" in the text.&nbsp; The manual also has problems
with
  <br>
the chapter numbers, which don't agree between the Table of Contents
and
  <br>
the actual main text.&nbsp; But this is a minor issue.)
  <br>
</blockquote>
I noticed the numarray appearance, but not the TOC oddness.<br>
<blockquote cite="mid:4C7A0F23-5747-4C4A-AE11-BF3A577CFEAC@mpe.mpg.de"
 type="cite"><br>
  <br>
As for jpeg, gif, etc. -- you have to find some Python code that can
read those
  <br>
formats (Python Imaging Library, perhaps?).&nbsp; Once they've been read in,
however,
  <br>
you should be able to convert the resulting data structure to a numpy
array,
  <br>
and then you can write it as a FITS file.</blockquote>
Sounds easy by comparison to the internal structure of the image. <br>
<br>
I guess I need to home in arrays in the numPy manual. <br>
<br>
Thanks. <br>
<blockquote cite="mid:4C7A0F23-5747-4C4A-AE11-BF3A577CFEAC@mpe.mpg.de"
 type="cite"><br>
  <br>
cheers,
  <br>
  <br>
Peter
  <br>
  <br>
=============================================================
  <br>
Peter Erwin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Max-Planck-Insitute for Extraterrestrial
  <br>
<a class="moz-txt-link-abbreviated" href="mailto:erwin@mpe.mpg.de">erwin@mpe.mpg.de</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Physics, Giessenbachstrasse
  <br>
tel. +49 (0)89 30000 3695&nbsp;&nbsp;&nbsp;&nbsp; 85748 Garching, Germany
  <br>
fax&nbsp; +49 (0)89 30000 3495&nbsp;&nbsp;&nbsp;&nbsp; <a class="moz-txt-link-freetext" href="http://www.mpe.mpg.de/~erwin">http://www.mpe.mpg.de/~erwin</a>
  <br>
  <br>
  <br>
  <br>
  <br>
</blockquote>
<br>
<div class="moz-signature">-- <br>
<meta content="text/html;" http-equiv="Content-Type">
<title>Signature.html</title>
<pre class="moz-signature" cols="76">           Wayne Watson (Watson Adventures, Prop., Nevada City, CA)

             (121.01 Deg. W, 39.26 Deg. N) GMT-8 hr std. time)<span
 style="font-weight: bold;"></span><b><b
 style="color: rgb(204, 51, 204);" class="b"><span
 style="color: rgb(255, 153, 255);"></span><span
 style="font-family: monospace;"></span></b></b><span
 style="color: rgb(102, 0, 204);">

          "Less than all cannot satisfy Man." -- William Blake
          
</span><font class="sqq"><span class="sqq"
 style="color: rgb(102, 0, 204);"></span></font></pre>
</div>
</body>
</html>