As a programmer, you can extend the Python language using modules written in
C, C++ and even the .NET language C#, with the right glue in place. Python scripts in Scorpion have
access to all data being processed within Scorpion, and this example shows
how to access and process the raw image data from Scorpion in a
Python extension module. A grayscale image is represented by 8-bit pixels,
stored rowwise. A colour picture would use four bytes per pixel, in the
order <blue><green><red><pad>.
If you create a Python module called "myext" (source code
below) that exports a Python function "average", you can do your
own image processing as follows, in a Scorpion Python script tool:
import arr,myext
im = GetImageMatr('1')
r,c = im.dim()
format = im.elemtype()
p = arr.getArrDataPointer(im)
avg = myext.average(p,r,c,format)
# avg now contains your result...
For instructions on how to create a Python module, please consult the
Python docs, or "Python Essential Reference" by David M. Beazley, where you will find detailed
documentation on how to create a Python extension. Below you will find the
source code for the "myext" module, written in C. The "image
processing" is done in the routine average, which gets a pointer to the
image data. The routine _average is the Python interface.
myext.h
/**************************************************************************
* myext.h
*
* Skeleton Python extension
**************************************************************************/
#include "Python.h"
#define byte unsigned char
myext.c
/**************************************************************************
* myext.c
*
* Skeleton Python extension
**************************************************************************/
#define DLL_PREFIX __declspec(dllexport)
#include "myext.h"
// c image processing routine...
static double average(byte *image,int rows,int cols)
{
double sum = 0;
int n = rows*cols;
int i;
for (i=0;i<n;i++) sum += *image++;
return sum/n;
}
// python callable methods
static PyObject *_average(PyObject *self,PyObject *args)
{
int rows;
int cols;
char *format;
byte *image;
if (!PyArg_ParseTuple(args,"iiis",&image,&rows,&cols,&format))
return NULL;
if (strcmp(format,"uint8")) {
PyErr_SetString(PyExc_TypeError,"Non-supported image format. Must be 'uint8'");
return NULL;
}
return Py_BuildValue("d",average(image,rows,cols));
}
// module methods table
static struct PyMethodDef myext_methods[] = {
// DLL exports
{"average",_average,METH_VARARGS},
// sentinel
{NULL, NULL}
};
DLL_PREFIX void initmyext()
{
PyObject *m;
m = Py_InitModule("myext", myext_methods);
}
|