int p1b(void)
{
	// initialize data of input
	const char *filename = "Scarlett.raw";
	int SizeW = 400;
	int SizeH = 300;
	int BytesPerPixel = 3;
	unsigned char ImageData[SizeH][SizeW][BytesPerPixel];
	unsigned char R[SizeH][SizeW];
	unsigned char G[SizeH][SizeW];
	unsigned char B[SizeH][SizeW];
	double dImageData[SizeH][SizeW][BytesPerPixel];

	// initialize data of output
	const char *BGfilename = "1b Scarlett_lab_bf.raw";
	const char *BGfilename1 = "1b Scarlett_rgb_bf.raw";
	const char *Exfilename = "1b Scarlett_ex.raw";
	const char *newfilename = "1b Scarlett_ans.raw";
	int newSizeW = SizeW;
	int newSizeH = SizeH;
	int newBytesPerPixel = BytesPerPixel;
	double MBGImageData[newSizeH][newSizeW][newBytesPerPixel];
	double MCImageData[newSizeH][newSizeW][newBytesPerPixel];
	unsigned char BGImageData[newSizeH][newSizeW][newBytesPerPixel];
	unsigned char BGImageData1[newSizeH][newSizeW][newBytesPerPixel];
	unsigned char CBGImageData[newSizeH][newSizeW][newBytesPerPixel];
	unsigned char newImageData[newSizeH][newSizeW][newBytesPerPixel];

	// input
	readimage(filename, &ImageData[0][0][0], SizeH, SizeW, BytesPerPixel);

	double L[SizeH][SizeW];
	double a[SizeH][SizeW];
	double b[SizeH][SizeW];

	for(int i = 0; i<SizeH; i++)
	{
		for(int j = 0; j < SizeW; j++)
		{
			R[i][j] = ImageData[i][j][0];
			G[i][j] = ImageData[i][j][1];
			B[i][j] = ImageData[i][j][2];
			dImageData[i][j][0] = ((double) ImageData[i][j][0]/255.0);
			dImageData[i][j][1] = ((double) ImageData[i][j][1]/255.0);
			dImageData[i][j][2] = ((double) ImageData[i][j][2]/255.0);
			Rgb2Lab(&L[i][j], &a[i][j], &b[i][j], dImageData[i][j][0], dImageData[i][j][1], dImageData[i][j][2]);
//			printf("%d, %f = %u, %f = %u, %f = %u\n", i,dImageData[i][j][0], ImageData[i][j][0], dImageData[i][j][1],ImageData[i][j][1], dImageData[i][j][2], ImageData[i][j][2]);
//			printf("%d, %f, %f, %f\n", i,L[i][j], a[i][j],b[i][j]);
		}
	}

	// Bilateral Filter
	double newL[SizeH][SizeW];
	double newa[SizeH][SizeW];
	double newb[SizeH][SizeW];
	double newnewL[SizeH][SizeW];
	double newnewa[SizeH][SizeW];
	double newnewb[SizeH][SizeW];
	unsigned char newR[SizeH][SizeW];
	unsigned char newG[SizeH][SizeW];
	unsigned char newB[SizeH][SizeW];
	unsigned char newnewR[SizeH][SizeW];
	unsigned char newnewG[SizeH][SizeW];
	unsigned char newnewB[SizeH][SizeW];

	int FilterSize = 5;
	int sigmaC = 3;
	int sigmaC1 = 10;
	double sigmaS = 4.25;
	double sigmaS1 = 10.0;

	BilateralFilter(FilterSize, sigmaC1, sigmaS1, &R[0][0], SizeH, SizeW, &newR[0][0]);
	BilateralFilter(FilterSize, sigmaC1, sigmaS1, &G[0][0], SizeH, SizeW, &newG[0][0]);
	BilateralFilter(FilterSize, sigmaC1, sigmaS1, &B[0][0], SizeH, SizeW, &newB[0][0]);
	BFiforLab(FilterSize, sigmaC, sigmaS, &L[0][0], SizeH, SizeW, &newL[0][0]);
	BFiforLab(FilterSize, sigmaC, sigmaS, &a[0][0], SizeH, SizeW, &newa[0][0]);
	BFiforLab(FilterSize, sigmaC, sigmaS, &b[0][0], SizeH, SizeW, &newb[0][0]);

	for(int i = 0; i<SizeH; i++)
	{
		for(int j = 0; j < SizeW; j++)
		{
			Lab2Rgb(&MCImageData[i][j][0], &MCImageData[i][j][1], &MCImageData[i][j][2], newL[i][j], newa[i][j], newb[i][j]);
			CBGImageData[i][j][0] = (int) (MCImageData[i][j][0]*255);
			CBGImageData[i][j][1] = (int) (MCImageData[i][j][1]*255);
			CBGImageData[i][j][2] = (int) (MCImageData[i][j][2]*255);
		}
	}


	BilateralFilter(FilterSize, sigmaC1, sigmaS1, &newR[0][0], SizeH, SizeW, &newnewR[0][0]);
	BilateralFilter(FilterSize, sigmaC1, sigmaS1, &newG[0][0], SizeH, SizeW, &newnewG[0][0]);
	BilateralFilter(FilterSize, sigmaC1, sigmaS1, &newB[0][0], SizeH, SizeW, &newnewB[0][0]);
	BFiforLab(FilterSize, sigmaC, sigmaS, &newL[0][0], SizeH, SizeW, &newnewL[0][0]);
	BFiforLab(FilterSize, sigmaC, sigmaS, &newa[0][0], SizeH, SizeW, &newnewa[0][0]);
	BFiforLab(FilterSize, sigmaC, sigmaS, &newb[0][0], SizeH, SizeW, &newnewb[0][0]);

	BilateralFilter(FilterSize, sigmaC1, sigmaS1, &newnewR[0][0], SizeH, SizeW, &newR[0][0]);
	BilateralFilter(FilterSize, sigmaC1, sigmaS1, &newnewG[0][0], SizeH, SizeW, &newG[0][0]);
	BilateralFilter(FilterSize, sigmaC1, sigmaS1, &newnewB[0][0], SizeH, SizeW, &newB[0][0]);
	BFiforLab(FilterSize, sigmaC, sigmaS, &newnewL[0][0], SizeH, SizeW, &newL[0][0]);
	BFiforLab(FilterSize, sigmaC, sigmaS, &newnewa[0][0], SizeH, SizeW, &newa[0][0]);
	BFiforLab(FilterSize, sigmaC, sigmaS, &newnewb[0][0], SizeH, SizeW, &newb[0][0]);

//	BilateralFilter(FilterSize, sigmaC1, sigmaS1, &newR[0][0], SizeH, SizeW, &newnewR[0][0]);
//	BilateralFilter(FilterSize, sigmaC1, sigmaS1, &newG[0][0], SizeH, SizeW, &newnewG[0][0]);
//	BilateralFilter(FilterSize, sigmaC1, sigmaS1, &newB[0][0], SizeH, SizeW, &newnewB[0][0]);

	for(int i = 0; i<SizeH; i++)
	{
		for(int j = 0; j < SizeW; j++)
		{
			Lab2Rgb(&MBGImageData[i][j][0], &MBGImageData[i][j][1], &MBGImageData[i][j][2], newL[i][j], newa[i][j], newb[i][j]);
			BGImageData[i][j][0] = (int) (MBGImageData[i][j][0]*255);
			BGImageData[i][j][1] = (int) (MBGImageData[i][j][1]*255);
			BGImageData[i][j][2] = (int) (MBGImageData[i][j][2]*255);
			BGImageData1[i][j][0] = newR[i][j];
			BGImageData1[i][j][1] = newG[i][j];
			BGImageData1[i][j][2] = newB[i][j];
//			printf("%d, %f, %f, %f\n", i,newL[i][j], newa[i][j],newb[i][j]);
//			printf("%d, %u = %f, %u = %f, %u = %f\n", i,newImageData[i][j][0], MImageData[i][j][0],newImageData[i][j][1], MImageData[i][j][1], newImageData[i][j][2], MImageData[i][j][2]);
		}
	}

	writeimage(BGfilename, &BGImageData[0][0][0], newSizeH, newSizeW, newBytesPerPixel);
	writeimage(BGfilename1, &BGImageData1[0][0][0], newSizeH, newSizeW, newBytesPerPixel);

	// XDoG
	// convert to gray-scale image
	unsigned char GrayImageData[newSizeH][newSizeW];
	for(int i = 0; i<SizeH; i++)
	{
		for(int j = 0; j < SizeW; j++)
		{
			float Y = 0.21*CBGImageData[i][j][0] + 0.72*CBGImageData[i][j][1] +0.07*CBGImageData[i][j][2];
			GrayImageData[i][j] = (int) Y;
//			printf("%d %u = %f\n", i, GrayImageData[i][j], Y);
		}
	}

	unsigned char GrayImageData0[newSizeH][newSizeW];
	for(int i = 0; i<SizeH; i++)
	{
		for(int j = 0; j < SizeW; j++)
		{
			float Y = 0.21*ImageData[i][j][0] + 0.72*ImageData[i][j][1] +0.07*ImageData[i][j][2];
			GrayImageData0[i][j] = (int) Y;
		}
	}


	//compute Ex
	int windowsize = 11;
	float sigma = 1.5;
	float k = sqrt(1.6);
	float t = 0.98, e = 0.5, f = 4;
	unsigned char ExImageData[newSizeH][newSizeW];

	XDoG(windowsize, sigma, k, t, e, f, &GrayImageData[0][0], &ExImageData[0][0], SizeH, SizeW);
	writeimage(Exfilename, &ExImageData[0][0], newSizeH, newSizeW, 1);

	// Integration of Portrait Background and Contour
	for(int i=0; i<SizeH; i++)
	{
		for(int j=0; j<SizeW; j++)
		{
			newImageData[i][j][0] = (ExImageData[i][j]/255) * BGImageData[i][j][0];
			newImageData[i][j][1] = (ExImageData[i][j]/255) * BGImageData[i][j][1];
			newImageData[i][j][2] = (ExImageData[i][j]/255) * BGImageData[i][j][2];
		}
	}

	writeimage(newfilename, &newImageData[0][0][0], newSizeH, newSizeW, newBytesPerPixel);

	// DoG
	unsigned char DoGExImageData[newSizeH][newSizeW];
	unsigned char DoGImageData[newSizeH][newSizeW][newBytesPerPixel];
	DoG(windowsize, sigma, k, e, f, &GrayImageData[0][0], &DoGExImageData[0][0], SizeH, SizeW);
	writeimage("1b Scarlett_DoG_ex.raw", &DoGExImageData[0][0], newSizeH, newSizeW, 1);
	for(int i=0; i<SizeH; i++)
	{
		for(int j=0; j<SizeW; j++)
		{
			DoGImageData[i][j][0] = (DoGExImageData[i][j]/255) * BGImageData[i][j][0];
			DoGImageData[i][j][1] = (DoGExImageData[i][j]/255) * BGImageData[i][j][1];
			DoGImageData[i][j][2] = (DoGExImageData[i][j]/255) * BGImageData[i][j][2];
		}
	}
	writeimage("1b Scarlett_DoG_ans.raw", &DoGImageData[0][0][0], newSizeH, newSizeW, newBytesPerPixel);
	return 0;
}
Exemplo n.º 2
0
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
	char usageStr[] = "Usage: idxImg = SLIC_mex(image(3-Channel uint8 image), spNum(double scalar), compactness(double scalar))\n";

	//Check input
	const mxArray *pmxImg = prhs[0];
	if (nrhs != 3 || !mxIsUint8(pmxImg) || !mxIsDouble(prhs[1]) || !mxIsDouble(prhs[2]))
		mexErrMsgTxt(usageStr);

	mwSize chn = mxGetNumberOfDimensions(pmxImg);
	if (3 != chn)
		mexErrMsgTxt(usageStr);
	const mwSize *sz = mxGetDimensions(pmxImg);
	mwSize height = sz[0], width = sz[1], num_pix = height * width;
	unsigned int iPatchNum = unsigned int( mxGetScalar(prhs[1]) );
	float compactness = float( mxGetScalar(prhs[2]) );

	//Transfer matlab matrix
	ImageSimpleUChar img_r, img_g, img_b;
	img_r.Create(width, height);
	img_g.Create(width, height);
	img_b.Create(width, height);
	
	unsigned char *pImgData = (unsigned char*)mxGetData(pmxImg);
	for (int x = 0; x < width; x++)
	{
		for (int y = 0; y < height; y++)
		{
			img_r.Pixel(x,y) = pImgData[y];
			img_g.Pixel(x,y) = pImgData[y + num_pix];
			img_b.Pixel(x,y) = pImgData[y + num_pix * 2];
		}
		pImgData += height;
	}

	//Rgb --> Lab
	ImageSimpleFloat img_L, img_A, img_B;
	Rgb2Lab(img_r, img_g, img_b, img_L, img_A, img_B);

	//Do SLIC
	ImageSimpleUInt idxImg;
	idxImg.Create(width, height);
	int iSuperPixelNum = Run_SLIC_GivenPatchNum(img_L, img_A, img_B, iPatchNum, compactness, idxImg);

	//Transfer back to matlab
	plhs[0] = mxCreateDoubleMatrix(height, width, mxREAL);
	double *pdIdxImg = mxGetPr(plhs[0]);
	for (int x = 0; x < width; x++)	
	{
		for (int y = 0; y < height; y++)
		{
			unsigned int id = idxImg.Pixel(x, y);
			pdIdxImg[y] = double(id) + 1;
		}
		pdIdxImg += height;
	}

	plhs[1] = mxCreateDoubleMatrix(1, 1, mxREAL);
	*mxGetPr(plhs[1]) = double(iSuperPixelNum);

	return;
}