Skip to content
Snippets Groups Projects
MexContrastEnhancement.cpp 3.37 KiB
Newer Older
#include "MexCommand.h"
Eric Wait's avatar
Eric Wait committed
#include "Vec.h"
Eric Wait's avatar
Eric Wait committed
#include "CWrappers.cuh"
Eric Wait's avatar
Eric Wait committed
void MexContrastEnhancement::execute( int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[] )
	int device = 0;

	if (nrhs>3)
		device = mat_to_c((int)mxGetScalar(prhs[3]));

	double* sigmasD = (double*)mxGetData(prhs[1]);
	double* neighborhoodD = (double*)mxGetData(prhs[2]);

Eric Wait's avatar
Eric Wait committed

	Vec<float> sigmas((float)sigmasD[0],(float)sigmasD[1],(float)sigmasD[2]);
Eric Wait's avatar
Eric Wait committed
	Vec<size_t> neighborhood((size_t)neighborhoodD[0],(size_t)neighborhoodD[1],(size_t)neighborhoodD[2]);
Eric Wait's avatar
Eric Wait committed
	Vec<size_t> imageDims;
	if (mxIsUint8(prhs[0]))
	{
		unsigned char* imageIn,* imageOut;
		setupImagePointers(prhs[0],&imageIn,&imageDims,&plhs[0],&imageOut);

Eric Wait's avatar
Eric Wait committed
		contrastEnhancement(imageIn,imageDims,sigmas,neighborhood,&imageOut,device);
Eric Wait's avatar
Eric Wait committed
	}
	else if (mxIsUint16(prhs[0]))
	{
Eric Wait's avatar
Eric Wait committed
		unsigned short* imageIn,* imageOut;
Eric Wait's avatar
Eric Wait committed
		setupImagePointers(prhs[0],&imageIn,&imageDims,&plhs[0],&imageOut);

Eric Wait's avatar
Eric Wait committed
		contrastEnhancement(imageIn,imageDims,sigmas,neighborhood,&imageOut,device);
Eric Wait's avatar
Eric Wait committed
	}
	else if (mxIsInt16(prhs[0]))
Eric Wait's avatar
Eric Wait committed
	{
		short* imageIn,* imageOut;
		setupImagePointers(prhs[0],&imageIn,&imageDims,&plhs[0],&imageOut);

Eric Wait's avatar
Eric Wait committed
		contrastEnhancement(imageIn,imageDims,sigmas,neighborhood,&imageOut,device);
Eric Wait's avatar
Eric Wait committed
	}
	else if (mxIsUint32(prhs[0]))
	{
		unsigned int* imageIn,* imageOut;
		setupImagePointers(prhs[0],&imageIn,&imageDims,&plhs[0],&imageOut);

Eric Wait's avatar
Eric Wait committed
		contrastEnhancement(imageIn,imageDims,sigmas,neighborhood,&imageOut,device);
Eric Wait's avatar
Eric Wait committed
	}
	else if (mxIsInt32(prhs[0]))
Eric Wait's avatar
Eric Wait committed
	{
		int* imageIn,* imageOut;
		setupImagePointers(prhs[0],&imageIn,&imageDims,&plhs[0],&imageOut);

Eric Wait's avatar
Eric Wait committed
		contrastEnhancement(imageIn,imageDims,sigmas,neighborhood,&imageOut,device);
Eric Wait's avatar
Eric Wait committed
	}
	else if (mxIsSingle(prhs[0]))
	{
		float* imageIn,* imageOut;
		setupImagePointers(prhs[0],&imageIn,&imageDims,&plhs[0],&imageOut);

Eric Wait's avatar
Eric Wait committed
		contrastEnhancement(imageIn,imageDims,sigmas,neighborhood,&imageOut,device);
Eric Wait's avatar
Eric Wait committed
	}
	else if (mxIsDouble(prhs[0]))
	{
		double* imageIn,* imageOut;
		setupImagePointers(prhs[0],&imageIn,&imageDims,&plhs[0],&imageOut);

Eric Wait's avatar
Eric Wait committed
		contrastEnhancement(imageIn,imageDims,sigmas,neighborhood,&imageOut,device);
Eric Wait's avatar
Eric Wait committed
	}
	else
	{
		mexErrMsgTxt("Image type not supported!");
	}
Eric Wait's avatar
Eric Wait committed
std::string MexContrastEnhancement::check( int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[] )
	if (nrhs<3 || nrhs>4)
		return "Incorrect number of inputs!";

	if (nlhs!=1)
		return "Requires one output!";

	size_t numDims = mxGetNumberOfDimensions(prhs[0]);
Eric Wait's avatar
Eric Wait committed
	if (numDims>3)
		return "Image can have a maximum of three dimensions!";

	size_t numEl= mxGetNumberOfElements(prhs[1]);
	if (numEl!=3 || !mxIsDouble(prhs[1]))
		return "Sigmas has to be an array of three doubles!";

	numEl = mxGetNumberOfElements(prhs[2]);
	if (numEl!=3 || !mxIsDouble(prhs[2]))
		return "Median neighborhood has to be an array of three doubles!";

	return "";
}

Eric Wait's avatar
Eric Wait committed
std::string MexContrastEnhancement::printUsage()
	return "imageOut = CudaMex('ContrastEnhancement',imageIn,[sigmaX,sigmaY,sigmaZ],[MedianNeighborhoodX,MedianNeighborhoodY,MedianNeighborhoodZ],[device]);";
Eric Wait's avatar
Eric Wait committed
std::string MexContrastEnhancement::printHelp()
{
	std::string msg = "\tContrastEnancement will do a high-pass background subtraction followed by a median smoothing.\n";
	msg += "\tsigmaX, sigmaY, and sigmaZ correspond to the Gaussian smoothing kernel in those dimensions.\n";
	msg += "\tMedianNeighborhoodX, MedianNeighborhoodY, and MedianNeighborhoodZ relate to how big the median smoothing window will be.\n";
	msg += "\n";
	return msg;
}