void morph_close_double(double *vol, int dims[3], int niter, double th) { unsigned char *buffer; int i; buffer = (unsigned char *)malloc(sizeof(unsigned char)*dims[0]*dims[1]*dims[2]); if(buffer == NULL) { fprintf(stderr,"Memory allocation error\n"); exit(EXIT_FAILURE); } for (i=0;i<dims[2]*dims[1]*dims[0];i++) buffer[i] = (unsigned char) (vol[i] > th); morph_dilate_uint8(buffer, dims, niter, 0); morph_erode_uint8(buffer, dims, niter, 0); for (i=0;i<dims[2]*dims[1]*dims[0];i++) vol[i] = (double)buffer[i]; free(buffer); }
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { double *X, *Y; unsigned char *X8, *Y8; int d[2]; unsigned char *B; int m, n, p, q; unsigned char *Z; //-- // compute depending on type of image //-- //-- // UINT8 image //-- if (mxGetClassID(prhs[0]) == mxUINT8_CLASS) { //-- // INPUT //-- // input image X8 = (unsigned char *) mxGetPr(prhs[0]); m = mxGetM(prhs[0]); n = mxGetN(prhs[0]); // structuring element matrix if (mxIsUint8(prhs[1])) { B = (unsigned char *) mxGetPr(prhs[1]); } else { mexErrMsgTxt("Structuring element must be of class uint8."); } p = (mxGetM(prhs[1]) - 1)/2; q = (mxGetN(prhs[1]) - 1)/2; // get parameters // get mask if (nrhs > 2) { if (mxIsEmpty(prhs[2])) { Z = NULL; } else { if (mxIsUint8(prhs[2])) { Z = (unsigned char *) mxGetPr(prhs[2]); } else { mexErrMsgTxt("Mask must be of class uint8."); } if ((m != mxGetM(prhs[2])) || (n != mxGetN(prhs[2]))) { mexErrMsgTxt("Image and mask must be of the same size."); } } } else { Z = NULL; } //-- // OUTPUT //-- // dilated image *d = (m - 2*p); *(d + 1) = (n - 2*q); Y8 = (unsigned char *) mxGetPr(plhs[0] = mxCreateNumericArray(2, d, mxUINT8_CLASS, mxREAL)); //-- // COMPUTATION //-- morph_dilate_uint8 (Y8, X8, m, n, B, p, q, Z); //-- // DOUBLE image //-- } else { //-- // INPUT //-- // input image X = mxGetPr(prhs[0]); m = mxGetM(prhs[0]); n = mxGetN(prhs[0]); // structuring element matrix if (mxIsUint8(prhs[1])) { B = (unsigned char *) mxGetPr(prhs[1]); } else { mexErrMsgTxt("Structuring element must be of class uint8."); } p = (mxGetM(prhs[1]) - 1)/2; q = (mxGetN(prhs[1]) - 1)/2; // get parameters // get mask if (nrhs > 2) { if (mxIsEmpty(prhs[2])) { Z = NULL; } else { if (mxIsUint8(prhs[2])) { Z = (unsigned char *) mxGetPr(prhs[2]); } else { mexErrMsgTxt("Mask must be of class uint8."); } if ((m != mxGetM(prhs[2])) || (n != mxGetN(prhs[2]))) { mexErrMsgTxt("Image and mask must be of the same size."); } } } else { Z = NULL; } //-- // OUTPUT //-- // dilated image Y = mxGetPr(plhs[0] = mxCreateDoubleMatrix((m - 2*p), (n - 2*q), mxREAL)); //-- // COMPUTATION //-- morph_dilate_double (Y, X, m, n, B, p, q, Z); } }
void morph_open_uint8(unsigned char *vol, int dims[3], int niter, int th) { morph_erode_uint8(vol, dims, niter, th); morph_dilate_uint8(vol, dims, niter, 0); }