[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). 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"> if
im.mode=="1":</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab
>a=Numeric.fromstring(im.tostring(),Numeric.UnsignedInt8) <span
></span> <x-tab>
</x-tab><x-tab>
</x-tab> </font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab>#mystery why is needed</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab>im.mode="L"</font></div>
<div><font face="Courier New"
size="+1"><x-tab> </x-tab>a
= Numeric.fromstring(im.tostring(), Numeric.UnsignedInt8)</font></div>
<div><font face="Courier New"
size="+1"><x-tab> </x-tab>a
= a > 0</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab>bands=1</font></div>
<div><font face="Courier New" size="+1"> elif
im.mode == "L":</font></div>
<div><font face="Courier New"
size="+1"> a =
Numeric.fromstring(im.tostring(), Numeric.UnsignedInt8)</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab>bands=1</font></div>
<div><font face="Courier New" size="+1"> elif
im.mode == "F":</font></div>
<div><font face="Courier New"
size="+1"> a =
Numeric.fromstring(im.tostring(), Numeric.Float32)</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab>bands=1</font></div>
<div><font face="Courier New" size="+1"> elif
(im.mode=='RGB')|(im.mode=='YCbCr'):</font></div>
<div><font face="Courier New"
size="+1"><x-tab> </x-tab>a
= Numeric.fromstring(im.tostring(), Numeric.UnsignedInt8)</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab>bands=3</font></div>
<div><font face="Courier New" size="+1"> elif
(im.mode=='RGBA')|(im.mode=='CMYK'):</font></div>
<div><font face="Courier New"
size="+1"><x-tab> </x-tab>a
= Numeric.fromstring(im.tostring(), Numeric.UnsignedInt8)</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab>bands=4</font></div>
<div><font face="Courier New" size="+1">
else:</font></div>
<div><font face="Courier New"
size="+1"><x-tab> </x-tab>
raise ValueError, im.mode+" mode not
considered"</font></div>
<div><font face="Courier New" size="+1"> #print
"array u to now"</font></div>
<div><font face="Courier New" size="+1"> #print
a</font></div>
<div><font face="Courier New" size="+1"> if
outputDim==3:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab>
a.shape=(im.size[1],im.size[0],bands)</font></div>
<div><font face="Courier New" size="+1"> elif
outputDim==2:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab>
a=Numeric.reshape(a,(im.size[1],im.size[0]))</font></div>
<div><font face="Courier New" size="+1"> elif
outputDim==1:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab>
a=Numeric.reshape(a,(im.size[1]*im.size[0],))</font></div>
<div><font face="Courier New" size="+1"> #print
"shape change"</font></div>
<div><font face="Courier New" size="+1"> #print
a</font></div>
<div><font face="Courier New" size="+1"> return
a</font></div>
<div><font face="Courier New" size="+1"><br></font></div>
<div><font face="Courier New"
size="+1"> </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>
</x-tab></font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab>maxV=max(Numeric.ravel(mat))</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab>minV=min(Numeric.ravel(mat))</font></div>
<div><font face="Courier New"
size="+1"><x-tab> </x-tab>if
maxV<>minV:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab><x-tab>
</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"> #print
a.shape</font></div>
<div><font face="Courier New" size="+1"> if
len(a.shape)==3:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab>b=()</font></div>
<div><font face="Courier New"
size="+1"><x-tab> </x-tab>if
scale==2:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab><x-tab>
</x-tab>a=_imagesc(a)</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab>for i in range(a.shape[2]):</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab><x-tab>
</x-tab>#print a[:,:,i].shape</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab><x-tab>
</x-tab></font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab><x-tab> </x-tab>if
scale==1:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab><x-tab>
</x-tab><x-tab>
</x-tab>a[:,:,i]=_imagesc(a[:,:,i])<x-tab>
</x-tab></font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab><x-tab>
</x-tab>b+=(array2image(a[:,:,i]),)</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab>#print b[0].size</font></div>
<div><font face="Courier New"
size="+1"><x-tab> </x-tab>if
a.shape[2]==3:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab><x-tab>
</x-tab>#print "here shape 3",b</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab><x-tab>
</x-tab>#return b</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab><x-tab>
</x-tab>return Image.merge("RGB",b)</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab>elif a.shape[2]==1:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab><x-tab>
</x-tab>#print "here shape 1",b</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab><x-tab>
</x-tab>return b[0]</font></div>
<div><font face="Courier New" size="+1"> elif
len(a.shape)==2:</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab> print "autoescaling
image"</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab> a=_imagesc(a)</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab> mode ="L"</font></div>
<div><font face="Courier New" size="+1"> elif
a.typecode() == Numeric.UnsignedInt8:</font></div>
<div><font face="Courier New"
size="+1"> mode =
"L"</font></div>
<div><font face="Courier New" size="+1"> elif
a.typecode() == Numeric.Float32:</font></div>
<div><font face="Courier New"
size="+1"> mode =
"F"</font></div>
<div><font face="Courier New" size="+1">
else:</font></div>
<div><font face="Courier New"
size="+1"> raise ValueError,
"unsupported image mode"</font></div>
<div><font face="Courier New" size="+1"> 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 </font></div>
<div><font face="Courier New" size="+1">def
array2file(a,filename):</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab>s=array2string(a,a.shape[0]*5,2,1,"\n")</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab>file=open(filename,"w")</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</x-tab>file.write(s[1:-1])</font></div>
<div><font face="Courier New"
size="+1"><x-tab>
</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============--