java opencv实现扫描图像去底色增强文字

       现在市面上有很多小型打印机,采用用手机拍摄文档图像后,通过蓝牙连接打印机,打印出来。但是手机拍摄出来的图像往往带有灰或者黄底色,影响打印效果。如下图所示。

java opencv实现扫描图像去底色增强文字_第1张图片java opencv实现扫描图像去底色增强文字_第2张图片

经过处理后效果如下:

 

 

java opencv实现扫描图像去底色增强文字_第3张图片java opencv实现扫描图像去底色增强文字_第4张图片

 

具体代码如下:

 private void ReduceBackGround() {
        Mat src = new Mat();
        Utils.bitmapToMat(selectbp, src);
        Imgproc.cvtColor(src, src, Imgproc.COLOR_BGR2GRAY);
        src.convertTo(src, CvType.CV_32FC1, 1.0 / 255);
        Mat dst3=ReduceBackGroundAlgorithm(src,0);
        Imgproc.GaussianBlur(dst3, dst3, new Size(1, 1), 0, 0, 4); //Size(width, heigth),width,heigth参数可调,两个参数相同,默认值1,调节范围1-9(需为奇数);
            //dst3 = ColorGradation(dst3);
        Imgproc.adaptiveThreshold(dst3,dst3,255,0,0,31,30);//去除背景色后再进一步二值化,C参数可调,默认值30,调节范围1-50;   
        Utils.matToBitmap(dst3, selectbptmp);
        myImageView.setImageBitmap(selectbptmp);
    }
    private Mat ImageSharp(Mat src,int nAmount)
    {
        Mat dst= new Mat();
        double sigma = 3;
       // int threshold = 1;
        float amount = nAmount / 100.0f;
        Mat imgBlurred=new Mat();
        Imgproc.GaussianBlur(src, imgBlurred, new Size(7,7), sigma, sigma,4);
        Mat temp_sub= new Mat();
        //Mat temp_abs= new Mat();
        Core.subtract(src,imgBlurred,temp_sub);
       // Core.convertScaleAbs(temp_sub,temp_abs);
       // Mat lowContrastMask = new Mat();
        //Imgproc.threshold(temp_abs,lowContrastMask,threshold,255,1);
        //Mat temp_gen= new Mat();
        Core.addWeighted(src,1,temp_sub,amount,0,dst);
       // dst = src+temp_sub*amount;
        //src.copyTo(dst, lowContrastMask);
        return dst;
    }
    private Mat ReduceBackGroundAlgorithm(Mat src,int flag) {
        Mat gauss = new Mat();
        Mat dst2 = new Mat();
        Mat dst3 = new Mat();
        if (flag==1) {
            Imgproc.GaussianBlur(src, gauss, new Size(31, 31), 0, 0, 4);
        }
        else
            {
            Imgproc.blur(src, gauss, new Size(101,101));
        }
        Core.divide(src,gauss,dst2);
        dst2=ImageSharp(dst2, 101);
        //Imgproc.GaussianBlur(dst2, dst2, new Size(3,3), 0,0,4);//
        dst2.convertTo(dst3, CvType.CV_8UC1,255);
        return dst3;
    }

github链接:https://github.com/zhouqun92/TextEnhanceForAndroid

你可能感兴趣的:(opencv图像处理)