[SciPy-user] trying to use weave to access image data in C

Prabhu Ramachandran prabhu at aero.iitm.ernet.in
Wed Sep 29 14:32:31 CDT 2004


>>>>> "PR" == Prabhu Ramachandran <prabhu at aero.iitm.ernet.in> writes:

    AD> 2. How would I step through the img variable in the C code?
    AD> For example would the green value at pixel i,j be referenced
    AD> as img[i][j][2] or img[i + j*rows][2] or img[(i + j*rows)*2] ?

    PR> Depends on how you weave the magic. If you use
    PR> converters.blitz you can simply use img(i,j,k).  If you don't
    PR> use the blitz converter you will only get a flattened array
    PR> (i.e. a 1D array) from Numeric and will need to do pointer
    PR> arithmetic appropriately to access the elements.

I've attached yet another variant that does the array access directly
using pointer arithmetic.  This does not use blitz arrays and builds
faster.  I've also swapped the row and cols names to be consistent
with row-major notation and storage.

cheers,
prabhu
-------------- next part --------------
#!/usr/bin/python
from scipy import imread
import weave
from weave import converters
import Numeric

rows, cols = 2, 3
img = Numeric.zeros((rows, cols, 3), 'b')
count = 0
for i in range(rows):
    for j in range(cols):
        for k in range(3):
            img[i,j,k] = count
            count += 1
print img

# Notice the following:
#  1. '\\n' to escape generating a newline in the C++ code.
#  2. Access array using img(i, j, k)    
#  3. The use of the type_converters=converters.blitz.  This is
#     what makes it possible to access img using img(i, j, k).    

code = """
   for (int i=0; i < rows; i++)
   {
       for (int j=0; j < cols; j++)
       {
           printf("img[%3d][%3d]=%3d %3d %3d\\n", 
                   i, j, img[(i*cols + j)*3], img[(i*cols + j)*3 + 1],
                   img[(i*cols + j)*3 + 2]);
       }
   }
   """

weave.inline(code, ['img', 'rows', 'cols'])



More information about the SciPy-user mailing list