Example #1
0
void 
mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {

	// check for proper number and size of arguments
	//errCheck(nrhs == 1,"Arguments:  filePath");
	//errCheck(nlhs == 1,"Outputs:  skew");
    std::string inDir = mxArrayToString(prhs[0]);
	std::string filePath = mxArrayToString(prhs[1]);
	std::string dirPath = mxArrayToString(prhs[2]);
	double slant = mxGetScalar(prhs[3]);
	
	bool VIZ=false;
	/*if (filePath.compare("wordimg_9")==0 || 
        filePath.compare("wordimg_78")==0 )
       VIZ=true;
	*/
	//DImage img(("tmp/"+filePath+".tif").c_str(),DImage::DFileFormat_tiff);
	Mat mat = imread(inDir+filePath, CV_LOAD_IMAGE_GRAYSCALE);
	//cout << "read image" <<endl;
	//TODO clean
	Mat initBin = Binarization::otsuBinarization(mat);
    if (VIZ)
        {Binarization::imshowB("otsu",initBin,255,0); waitKey();}
        
    Mat dilated = Binarization::dilate(initBin,3);//dilate the fg, shrinking the bg
    //cout << "dilated" <<endl;
    
    
    Mat dilatedFlip = dilated.clone();
    for (int r=0; r<dilatedFlip.rows; r++)
        for (int c=0; c<dilatedFlip.cols; c++)
        {
            if (dilatedFlip.at<unsigned char>(r,c)==1)
                dilatedFlip.at<unsigned char>(r,c)=0;
            else
                dilatedFlip.at<unsigned char>(r,c)=1;
        }
    
    Mat prime;
    Mat bg_estimation = Binarization::inpainting(mat,dilatedFlip,&prime);
    //cout << "inpainted" <<endl;
    if (VIZ)
        {imshow("bg_estimation",bg_estimation); waitKey();}
    double average, std;
    Binarization::extract_feat(prime, NULL, &average, &std);
    bg_estimation = Binarization::inpainting(mat,dilatedFlip,NULL,&average,&std);
    //cout << "found avg" <<endl;
    
	
	DImage img;
	convertMatToDImage(mat,&img);
	//cout << "converted" <<endl;
	int pad=255;
	img = img.shearedH(slant,pad,true);//fill corners with black
	//cout << "sheared" <<endl;
	
	
	convertDImageToMat(img,&mat);
	//cout << "converted back" <<endl;
    if (VIZ)
	    {imshow("sheared",mat); waitKey();}
    
    //fill corners
	Mat fillMaskFlipped(mat.rows,mat.cols,CV_8U,Scalar(1));
	for (int r=fillMaskFlipped.rows-1; r>=0; r--)
        for (int c=0; c<fillMaskFlipped.cols; c++)
        {
            int flag = (abs(mat.at<unsigned char>(r,c)-pad)<3 || 
                        abs(mat.at<unsigned char>(r+1,c-1)-pad)<3 ||
                        abs(mat.at<unsigned char>(r-1,c+1)-pad)<3)?0:1;
            fillMaskFlipped.at<unsigned char>(r,c)=flag;
            
        }
	
	
	/*
	int space=1;
	//for (int r=fillMaskFlipped.rows-1; r>fillMaskFlipped.rows-1-space; r--)
    //    for (int c=0; c<space; c++)
    //    {
    //        int flag = (abs(mat.at<unsigned char>(r,c)-pad)<3)?0:1;
    //        fillMaskFlipped.at<unsigned char>(r,c)=flag;
    //    }
        
    for (int r=fillMaskFlipped.rows-1; r>=0; r--)
        for (int c=0; c<space; c++)
        {
            int flag = (abs(mat.at<unsigned char>(r,c)-pad)<3)?0:1;
            fillMaskFlipped.at<unsigned char>(r,c)=flag;
        }
	
	for (int c=0; c<fillMaskFlipped.cols; c++)
	    for (int r=fillMaskFlipped.rows-1; r>fillMaskFlipped.rows-1-space; r--)
        {
            int flag = (abs(mat.at<unsigned char>(r,c)-pad)<3)?0:1;
            fillMaskFlipped.at<unsigned char>(r,c)=flag;
        }
        
    for (int c=0; c<fillMaskFlipped.cols-space; c++)
    {
        bool cont=false;
        for (int r=fillMaskFlipped.rows-1; r>=space; r--)
        {
            int flag = (abs(mat.at<unsigned char>(r,c)-pad)<3)?0:1;
            if (flag==0 && !cont)
                cont=true;
            fillMaskFlipped.at<unsigned char>(r-space,c+space)=flag;
            //if (r==fillMaskFlipped.rows-1 && flag==0)
            //{
            //    for (int rf=r-space-1; rf<=fillMaskFlipped.rows-1; rf++)
            //        fillMaskFlipped.at<unsigned char>(rf,c+space)=flag;
            //}
            //if (c==0 && flag==0)
            //{
            //    for (int cf=c+space-1; cf>=0; cf--)
            //        fillMaskFlipped.at<unsigned char>(r-space,cf)=flag;
            //}
        
        }
        if (!cont)
            break;
    }
    
    //for (int c=fillMaskFlipped.cols-1; c>fillMaskFlipped.cols-1-space; c--)
    //    for (int r=0; r<space; r++)
    //    {
    //        int flag = (abs(mat.at<unsigned char>(r,c)-pad)<3)?0:1;
    //        fillMaskFlipped.at<unsigned char>(r,c)=flag;
    //    }
    for (int c=fillMaskFlipped.cols-1; c>=0; c--)
        for (int r=0; r<space; r++)
        {
            int flag = (abs(mat.at<unsigned char>(r,c)-pad)<3)?0:1;
            fillMaskFlipped.at<unsigned char>(r,c)=flag;
        }
    for (int r=0; r<fillMaskFlipped.rows; r++)
        for (int c=fillMaskFlipped.cols-1; c>fillMaskFlipped.cols-1-space; c--)
        {
            int flag = (abs(mat.at<unsigned char>(r,c)-pad)<3)?0:1;
            fillMaskFlipped.at<unsigned char>(r,c)=flag;
        }
    
    for (int c=fillMaskFlipped.cols-1; c>=space; c--)
    {
        bool cont=false;
        for (int r=0; r<fillMaskFlipped.rows-space; r++)
        {
            int flag = (abs(mat.at<unsigned char>(r,c)-pad)<3)?0:1;
            if (flag==0 && !cont)
                cont=true;
            fillMaskFlipped.at<unsigned char>(r+space,c-space)=flag;
            //if (c==fillMaskFlipped.cols-1 && flag==0)
            //{
           //   for (int cf=c-space-1; cf<=fillMaskFlipped.cols-1; cf++)
           //         fillMaskFlipped.at<unsigned char>(r+space,cf)=flag;
            //}
            //if (r==0 && flag==0)
            //{
            //    for (int rf=r+space-1; rf>=0; rf--)
            //        fillMaskFlipped.at<unsigned char>(rf,c-space)=flag;
            //}
        
        }
        if (!cont)
            break;
    }*/
    if (VIZ)
    {   Binarization::imshowB("fillamsk",fillMaskFlipped,255,0); waitKey();
        Mat showMask = mat.clone();
        Mat showUnmask = mat.clone();
        for (int r=fillMaskFlipped.rows-1; r>=0; r--)
            for (int c=0; c<fillMaskFlipped.cols; c++)
            {
                if (fillMaskFlipped.at<unsigned char>(r,c) == 0)
                    showUnmask.at<unsigned char>(r,c)=255;
                else if (fillMaskFlipped.at<unsigned char>(r,c) == 1)
                    showMask.at<unsigned char>(r,c)=255;
            }
        imshow("masked",showMask); waitKey();
        imshow("unmasked",showUnmask); waitKey();
    }
	mat = Binarization::inpainting(mat,fillMaskFlipped,NULL,&average,&std,VIZ);
	//cout << "filled" <<endl;
	/*for (int r=0; r<mat.rows; r++)
	    for (int c=0; c<mat.cols; c++)
	    {
	        if (fillMaskFlipped.at<unsigned char>(r,c)==0 && fabs(mat.at<unsigned char>(r,c)-average)>std)
	            mat.at<unsigned char>(r,c)=average;
	    }*/
	if (VIZ)
	    {imshow("filled",mat); waitKey();}
	//img.save((dirPath+"/"+filePath+".png").c_str(), DImage::DFileFormat_png);
	imwrite(dirPath+"/"+filePath,mat);
	//cout << "write "<<dirPath<<"/"<<filePath<<".png"<<endl;
}