edge_detection in C
[imago.git] / pcf.c
1 #include <Python.h>
2
3 static PyObject* py_edge(PyObject* self, PyObject* args)
4 {
5         const unsigned char *image;
6         int x;
7         int y;
8         int size;
9
10         int i;
11         int j;
12         int sum;
13
14         unsigned char *n_image;
15         PyObject *result;
16
17         if (!PyArg_ParseTuple(args, "(ii)s#", &x, &y, &image, &size)) return NULL;
18
19         n_image = (char*) malloc(size);
20         for (i=0; i < 2 * x; i++) {
21                 n_image[i] = 0;
22                 n_image[(y - 2) * x + i] = 0;
23         }
24         for (i=0; i < y; i++) {
25                 n_image[x * i] = 0;
26                 n_image[x * i + 1] = 0;
27                 n_image[x * i + x - 2] = 0;
28                 n_image[x * i + x - 1] = 0;
29         }
30
31
32
33         for (i=2; i < x - 2; i++) {
34                 for (j=2; j < y - 2; j++) {
35                         sum = image[x * j + i - 2] + image[x * j + i - 1] + image[x * j + i + 1] + image[x * j + i + 2] + 
36                                 image[x * (j - 2) + i - 2] + image[x * (j - 2) + i - 1] + image[x * (j - 2) + i] + 
37                                 image[x * (j - 2) + i + 1] + image[x * (j - 2) + i + 2] + 
38                                 image[x * (j - 1) + i - 2] + image[x * (j - 1) + i - 1] + image[x * (j - 1) + i] + 
39                                 image[x * (j - 1) + i + 1] + image[x * (j - 1) + i + 2] +
40                                 image[x * (j + 2) + i - 2] + image[x * (j + 2) + i - 1] + image[x * (j + 2) + i] + 
41                                 image[x * (j + 2) + i + 1] + image[x * (j + 2) + i + 2] +
42                                 image[x * (j + 1) + i - 2] + image[x * (j + 1) + i - 1] + image[x * (j + 1) + i] + 
43                                 image[x * (j + 1) + i + 1] + image[x * (j + 1) + i + 2] 
44                                 - (25 * image[x * j + i]);
45                         if (sum < 0) sum = 0;
46                         if (sum > 255) sum = 255;
47                         n_image[x * j + i] = sum;
48                 }
49         }
50
51
52
53         result = Py_BuildValue("s#", n_image, size);
54         free(n_image);
55         return result;
56 }
57
58
59 static PyMethodDef myModule_methods[] = {
60         {"edge", py_edge, METH_VARARGS},
61         {NULL, NULL}
62 };
63
64 void initpcf()
65 {
66                 (void) Py_InitModule("pcf", myModule_methods);
67 }