[Pythonmac-SIG] Types and casting

Aureli Soria Frisch aureli@ipk.fhg.de
Fri, 13 Sep 2002 12:33:22 +0200


--============_-1180209287==_ma============
Content-Type: text/plain; charset="us-ascii" ; format="flowed"

Hi,


>I am reading in raw image files from a frame grabber for processing.
>What I really want is a matrix of integers for analysis (I don't 
>care about the image itself).  Is there an easy way to get python to 
>do this?

I use a combination of PIL and Numeric for that purpose. So the frame 
grabber should save an image file (in supported formats) and then you 
can do a conversion to Numeric in order to have the numeric arrays. 
If you want to take the image directly from the buffer of the frame 
grabber I do not know how can you do that (or even if you can).

I personally use following conversion functions (they are light 
modified from some functions I got from the Image-SIG mailing list):

#######################################################
##dataConversion.py
##functions for data conversion between Numeric and PIL
#
import Numeric
import Image
from ArrayPrinter import array2string

#conversion image object (PIL) to narray object (Numeric)
#outputDim: rank of output array
def image2array(im,outputDim=3):
     if im.mode=="1":
	a=Numeric.fromstring(im.tostring(),Numeric.UnsignedInt8)    
		  
	#mystery why is needed
	im.mode="L"
	a = Numeric.fromstring(im.tostring(), Numeric.UnsignedInt8)
	a = a > 0
	bands=1
     elif im.mode == "L":
         a = Numeric.fromstring(im.tostring(), Numeric.UnsignedInt8)
	bands=1
     elif im.mode == "F":
         a = Numeric.fromstring(im.tostring(), Numeric.Float32)
	bands=1
     elif (im.mode=='RGB')|(im.mode=='YCbCr'):
	a = Numeric.fromstring(im.tostring(), Numeric.UnsignedInt8)
	bands=3
     elif (im.mode=='RGBA')|(im.mode=='CMYK'):
	a = Numeric.fromstring(im.tostring(), Numeric.UnsignedInt8)
	bands=4
     else:
	 raise ValueError, im.mode+" mode not considered"
     #print "array u to now"
     #print a
     if outputDim==3:
	    a.shape=(im.size[1],im.size[0],bands)
     elif outputDim==2:
	    a=Numeric.reshape(a,(im.size[1],im.size[0]))
     elif outputDim==1:
	    a=Numeric.reshape(a,(im.size[1]*im.size[0],))
     #print "shape change"
     #print a
     return a

    
#autoescaling function for representation with UnsignedInt8
def _imagesc(mat):

	maxV=max(Numeric.ravel(mat))
	minV=min(Numeric.ravel(mat))
	if maxV<>minV:
		return 
(255*(mat-minV)/(maxV-minV)).astype(Numeric.UnsignedInt8)

#conversion array object (Numeric) to image object (PIL)
#scale=1: autoscales image, each chanel independently
#scale=2: autoscales image, with max value of all channels
#scale=0: do not autoscale
def array2image(a,scale=1):
     #print a.shape
     if len(a.shape)==3:
	b=()
	if scale==2:
		a=_imagesc(a)
	for i in range(a.shape[2]):
		#print a[:,:,i].shape

		if scale==1:
			a[:,:,i]=_imagesc(a[:,:,i])
		b+=(array2image(a[:,:,i]),)
	#print b[0].size
	if a.shape[2]==3:
		#print "here shape 3",b
		#return b
		return Image.merge("RGB",b)
	elif a.shape[2]==1:
		#print "here shape 1",b
		return b[0]
     elif len(a.shape)==2:
	    print "autoescaling image"
	    a=_imagesc(a)
	    mode ="L"
     elif a.typecode() == Numeric.UnsignedInt8:
         mode = "L"
     elif a.typecode() == Numeric.Float32:
         mode = "F"
     else:
         raise ValueError, "unsupported image mode"
     return Image.fromstring(mode, (a.shape[1], a.shape[0]), 
a.astype(a.typecode()).tostring())

#write array in an ASCII file   
def array2file(a,filename):
	s=array2string(a,a.shape[0]*5,2,1,"\n")
	file=open(filename,"w")
	file.write(s[1:-1])
	file.close()



-- 
#################################
Aureli Soria Frisch
Fraunhofer IPK
Dept. Pattern Recognition

post: Pascalstr. 8-9, 10587 Berlin, Germany
e-mail: aureli@ipk.fhg.de
fon: +49 30 39006-143
fax: +49 30 3917517
web: http://vision.fhg.de/~aureli/web-aureli_en.html
#################################
--============_-1180209287==_ma============
Content-Type: text/html; charset="us-ascii"

<!doctype html public "-//W3C//DTD W3 HTML//EN">
<html><head><style type="text/css"><!--
blockquote, dl, ul, ol, li { padding-top: 0 ; padding-bottom: 0 }
 --></style><title>Re: [Pythonmac-SIG] Types and
casting</title></head><body>
<div>Hi,</div>
<div><br></div>
<div><br></div>
<blockquote type="cite" cite>I am reading in raw image files from a
frame grabber for processing.</blockquote>
<blockquote type="cite" cite>What I really want is a matrix of
integers for analysis (I don't care about the image itself).&nbsp; Is
there an easy way to get python to do this?</blockquote>
<div><br></div>
<div>I use a combination of PIL and Numeric for that purpose. So the
frame grabber should save an image file (in supported formats) and
then you can do a conversion to Numeric in order to have the numeric
arrays. If you want to take the image directly from the buffer of the
frame grabber I do not know how can you do that (or even if you
can).</div>
<div><br></div>
<div>I personally use following conversion functions (they are light
modified from some functions I got from the Image-SIG mailing
list):</div>
<div><br></div>
<div><font face="Courier New"
size="+1">#######################################################</font
></div>
<div><font face="Courier New"
size="+1">##dataConversion.py</font></div>
<div><font face="Courier New" size="+1">##functions for data
conversion between Numeric and PIL</font></div>
<div><font face="Courier New" size="+1">#</font></div>
<div><font face="Courier New" size="+1">import Numeric</font></div>
<div><font face="Courier New" size="+1">import Image</font></div>
<div><font face="Courier New" size="+1">from ArrayPrinter import
array2string</font></div>
<div><font face="Courier New" size="+1"><br></font></div>
<div><font face="Courier New" size="+1">#conversion image object (PIL)
to narray object (Numeric)</font></div>
<div><font face="Courier New" size="+1">#outputDim: rank of output
array</font></div>
<div><font face="Courier New" size="+1">def
image2array(im,outputDim=3):</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp; if
im.mode==&quot;1&quot;:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab
>a=Numeric.fromstring(im.tostring(),Numeric.UnsignedInt8)&nbsp;&nbsp;<span
></span>&nbsp;<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>&nbsp;&nbsp;</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>#mystery why is needed</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>im.mode=&quot;L&quot;</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </x-tab>a
= Numeric.fromstring(im.tostring(), Numeric.UnsignedInt8)</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </x-tab>a
= a &gt; 0</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>bands=1</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp; elif
im.mode == &quot;L&quot;:</font></div>
<div><font face="Courier New"
size="+1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a =
Numeric.fromstring(im.tostring(), Numeric.UnsignedInt8)</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>bands=1</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp; elif
im.mode == &quot;F&quot;:</font></div>
<div><font face="Courier New"
size="+1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a =
Numeric.fromstring(im.tostring(), Numeric.Float32)</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>bands=1</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp; elif
(im.mode=='RGB')|(im.mode=='YCbCr'):</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </x-tab>a
= Numeric.fromstring(im.tostring(), Numeric.UnsignedInt8)</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>bands=3</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp; elif
(im.mode=='RGBA')|(im.mode=='CMYK'):</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </x-tab>a
= Numeric.fromstring(im.tostring(), Numeric.UnsignedInt8)</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>bands=4</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp;
else:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </x-tab>
raise ValueError, im.mode+&quot; mode not
considered&quot;</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp; #print
&quot;array u to now&quot;</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp; #print
a</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp; if
outputDim==3:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>&nbsp;&nbsp;&nbsp;
a.shape=(im.size[1],im.size[0],bands)</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp; elif
outputDim==2:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>&nbsp;&nbsp;&nbsp;
a=Numeric.reshape(a,(im.size[1],im.size[0]))</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp; elif
outputDim==1:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>&nbsp;&nbsp;&nbsp;
a=Numeric.reshape(a,(im.size[1]*im.size[0],))</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp; #print
&quot;shape change&quot;</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp; #print
a</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp; return
a</font></div>
<div><font face="Courier New" size="+1"><br></font></div>
<div><font face="Courier New"
size="+1">&nbsp;&nbsp;&nbsp;</font></div>
<div><font face="Courier New" size="+1">#autoescaling function for
representation with UnsignedInt8</font></div>
<div><font face="Courier New" size="+1">def
_imagesc(mat):</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab></font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>maxV=max(Numeric.ravel(mat))</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>minV=min(Numeric.ravel(mat))</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </x-tab>if
maxV&lt;&gt;minV:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>return
(255*(mat-minV)/(maxV-minV)).astype(Numeric.UnsignedInt8)</font></div>
<div><font face="Courier New" size="+1"><br></font></div>
<div><font face="Courier New" size="+1">#conversion array object
(Numeric) to image object (PIL)</font></div>
<div><font face="Courier New" size="+1">#scale=1: autoscales image,
each chanel independently</font></div>
<div><font face="Courier New" size="+1">#scale=2: autoscales image,
with max value of all channels</font></div>
<div><font face="Courier New" size="+1">#scale=0: do not
autoscale</font></div>
<div><font face="Courier New" size="+1">def
array2image(a,scale=1):</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp; #print
a.shape</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp; if
len(a.shape)==3:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>b=()</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </x-tab>if
scale==2:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>a=_imagesc(a)</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>for i in range(a.shape[2]):</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>#print a[:,:,i].shape</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab></font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </x-tab>if
scale==1:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>a[:,:,i]=_imagesc(a[:,:,i])<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab></font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>b+=(array2image(a[:,:,i]),)</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>#print b[0].size</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </x-tab>if
a.shape[2]==3:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>#print &quot;here shape 3&quot;,b</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>#return b</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>return Image.merge(&quot;RGB&quot;,b)</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>elif a.shape[2]==1:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>#print &quot;here shape 1&quot;,b</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>return b[0]</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp; elif
len(a.shape)==2:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>&nbsp;&nbsp;&nbsp; print &quot;autoescaling
image&quot;</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>&nbsp;&nbsp;&nbsp; a=_imagesc(a)</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>&nbsp;&nbsp;&nbsp; mode =&quot;L&quot;</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp; elif
a.typecode() == Numeric.UnsignedInt8:</font></div>
<div><font face="Courier New"
size="+1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mode =
&quot;L&quot;</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp; elif
a.typecode() == Numeric.Float32:</font></div>
<div><font face="Courier New"
size="+1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mode =
&quot;F&quot;</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp;
else:</font></div>
<div><font face="Courier New"
size="+1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise ValueError,
&quot;unsupported image mode&quot;</font></div>
<div><font face="Courier New" size="+1">&nbsp;&nbsp;&nbsp; return
Image.fromstring(mode, (a.shape[1], a.shape[0]),
a.astype(a.typecode()).tostring())</font></div>
<div><font face="Courier New" size="+1"><br></font></div>
<div><font face="Courier New" size="+1">#write array in an ASCII
file&nbsp;&nbsp;&nbsp;</font></div>
<div><font face="Courier New" size="+1">def
array2file(a,filename):</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>s=array2string(a,a.shape[0]*5,2,1,&quot;\n&quot;)</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>file=open(filename,&quot;w&quot;)</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>file.write(s[1:-1])</font></div>
<div><font face="Courier New"
size="+1"><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>file.close()</font></div>
<div><font face="Courier New"><br></font></div>
<div><font face="Courier New"><br></font></div>
<div><br></div>
<div>-- </div>
<div>#################################<br>
Aureli Soria Frisch<br>
Fraunhofer IPK<br>
Dept. Pattern Recognition<br>
<br>
post: Pascalstr. 8-9, 10587 Berlin, Germany<br>
e-mail: aureli@ipk.fhg.de<br>
fon: +49 30 39006-143<br>
fax: +49 30 3917517<br>
web: http://vision.fhg.de/~aureli/web-aureli_en.html<br>
#################################</div>
</body>
</html>
--============_-1180209287==_ma============--