Pillow-6.0.0/src/_imagingmorph.c
/* Apply a morphologic LUT to a binary image. Outputs a
   a new binary image.

   Expected parameters:

      1. a LUT - a 512 byte size lookup table.
      2. an input Imaging image id.
      3. an output Imaging image id

   Returns number of changed pixels.
*/
Apply a morphologic LUT to a binary image. Outputs a
a new binary image.

Expected parameters.

1. a LUT - a 512 byte size lookup table.
2. an input Imaging image id.
3. an output Imaging image id

Returns number of changed pixels.
Apply a morphologic LUT to a binary image . Outputs a a new binary image . Expected parameters . 1 . a LUT - a 512 byte size lookup table . 2 . an input Imaging image id . 3 . an output Imaging image id Returns number of changed pixels .
static PyObject*
apply(PyObject *self, PyObject* args)
{
    const char *lut;
    PyObject *py_lut;
    Py_ssize_t lut_len, i0, i1;
    Imaging imgin, imgout;
    int width, height;
    int row_idx, col_idx;
    UINT8 **inrows, **outrows;
    int num_changed_pixels = 0;
    if (!PyArg_ParseTuple(args, "Onn", &py_lut, &i0, &i1)) {
        PyErr_SetString(PyExc_RuntimeError, "Argument parsing problem");
        return NULL;
    }
    if (!PyBytes_Check(py_lut)) {
        PyErr_SetString(PyExc_RuntimeError, "The morphology LUT is not a bytes object");
        return NULL;
    }
    lut_len = PyBytes_Size(py_lut);
    if (lut_len < LUT_SIZE) {
        PyErr_SetString(PyExc_RuntimeError, "The morphology LUT has the wrong size");
        return NULL;
    }
    lut = PyBytes_AsString(py_lut);
    imgin = (Imaging) i0;
    imgout = (Imaging) i1;
    width = imgin->xsize;
    height = imgin->ysize;
    if (imgin->type != IMAGING_TYPE_UINT8 ||
        imgin->bands != 1) {
        PyErr_SetString(PyExc_RuntimeError, "Unsupported image type");
        return NULL;
    }
    if (imgout->type != IMAGING_TYPE_UINT8 ||
        imgout->bands != 1) {
        PyErr_SetString(PyExc_RuntimeError, "Unsupported image type");
        return NULL;
    }
    inrows = imgin->image8;
    outrows = imgout->image8;
    for (row_idx=0; row_idx < height; row_idx++) {
        UINT8 *outrow = outrows[row_idx];
        UINT8 *inrow = inrows[row_idx];
        UINT8 *prow, *nrow; 
        outrow[0] = outrow[width-1] = 0;
        if (row_idx==0 || row_idx == height-1) {
            for(col_idx=0; col_idx<width; col_idx++)
                outrow[col_idx] = 0;
            continue;
        }
        prow = inrows[row_idx-1];
        nrow = inrows[row_idx+1];
        for (col_idx=1; col_idx<width-1; col_idx++) {
            int cim = col_idx-1;
            int cip = col_idx+1;
            unsigned char b0 = prow[cim] &1;
            unsigned char b1 = prow[col_idx]&1;
            unsigned char b2 = prow[cip]&1;
            unsigned char b3 = inrow[cim]&1;
            unsigned char b4 = inrow[col_idx]&1;
            unsigned char b5 = inrow[cip]&1;
            unsigned char b6 = nrow[cim]&1;
            unsigned char b7 = nrow[col_idx]&1;
            unsigned char b8 = nrow[cip]&1;
            int lut_idx = (b0
                           |(b1 << 1)
                           |(b2 << 2)
                           |(b3 << 3)
                           |(b4 << 4)
                           |(b5 << 5)
                           |(b6 << 6)
                           |(b7 << 7)
                           |(b8 << 8));
            outrow[col_idx] = 255*(lut[lut_idx]&1);
            num_changed_pixels += ((b4&1)!=(outrow[col_idx]&1));
        }
    }
    return Py_BuildValue("i",num_changed_pixels);
}
static PyObject * apply ( PyObject * self , PyObject * args ) { const char * lut ; PyObject * py_lut ; Py_ssize_t lut_len , i0 , i1 ; Imaging imgin , imgout ; int width , height ; int row_idx , col_idx ; UINT8 * * inrows , * * outrows ; int num_changed_pixels = 0 ; if ( ! PyArg_ParseTuple ( args , " " , & py_lut , & i0 , & i1 ) ) { PyErr_SetString ( PyExc_RuntimeError , " " ) ; return NULL ; } if ( ! PyBytes_Check ( py_lut ) ) { PyErr_SetString ( PyExc_RuntimeError , " " ) ; return NULL ; } lut_len = PyBytes_Size ( py_lut ) ; if ( lut_len < LUT_SIZE ) { PyErr_SetString ( PyExc_RuntimeError , " " ) ; return NULL ; } lut = PyBytes_AsString ( py_lut ) ; imgin = ( Imaging ) i0 ; imgout = ( Imaging ) i1 ; width = imgin -> xsize ; height = imgin -> ysize ; if ( imgin -> type != IMAGING_TYPE_UINT8 || imgin -> bands != 1 ) { PyErr_SetString ( PyExc_RuntimeError , " " ) ; return NULL ; } if ( imgout -> type != IMAGING_TYPE_UINT8 || imgout -> bands != 1 ) { PyErr_SetString ( PyExc_RuntimeError , " " ) ; return NULL ; } inrows = imgin -> image8 ; outrows = imgout -> image8 ; for ( row_idx = 0 ; row_idx < height ; row_idx ++ ) { UINT8 * outrow = outrows [ row_idx ] ; UINT8 * inrow = inrows [ row_idx ] ; UINT8 * prow , * nrow ; outrow [ 0 ] = outrow [ width - 1 ] = 0 ; if ( row_idx == 0 || row_idx == height - 1 ) { for ( col_idx = 0 ; col_idx < width ; col_idx ++ ) outrow [ col_idx ] = 0 ; continue ; } prow = inrows [ row_idx - 1 ] ; nrow = inrows [ row_idx + 1 ] ; for ( col_idx = 1 ; col_idx < width - 1 ; col_idx ++ ) { int cim = col_idx - 1 ; int cip = col_idx + 1 ; unsigned char b0 = prow [ cim ] & 1 ; unsigned char b1 = prow [ col_idx ] & 1 ; unsigned char b2 = prow [ cip ] & 1 ; unsigned char b3 = inrow [ cim ] & 1 ; unsigned char b4 = inrow [ col_idx ] & 1 ; unsigned char b5 = inrow [ cip ] & 1 ; unsigned char b6 = nrow [ cim ] & 1 ; unsigned char b7 = nrow [ col_idx ] & 1 ; unsigned char b8 = nrow [ cip ] & 1 ; int lut_idx = ( b0 | ( b1 << 1 ) | ( b2 << 2 ) | ( b3 << 3 ) | ( b4 << 4 ) | ( b5 << 5 ) | ( b6 << 6 ) | ( b7 << 7 ) | ( b8 << 8 ) ) ; outrow [ col_idx ] = 255 * ( lut [ lut_idx ] & 1 ) ; num_changed_pixels += ( ( b4 & 1 ) != ( outrow [ col_idx ] & 1 ) ) ; } } return Py_BuildValue ( " " , num_changed_pixels ) ; }
Apply a morphologic LUT to a binary image.
Apply a morphologic LUT to a binary image .
/* Previous and next row */ /* zero boundary conditions. TBD support other modes */