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; }
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; }