OpenCV Adaptive Threshold OCR

前端 未结 3 549
北荒
北荒 2020-11-27 03:40

I am using OpenCV to prepare images for OCR from an iPhone camera, and I have been having trouble getting the results I need for an accurate OCR scan. Here is the code I am

3条回答
  •  执笔经年
    2020-11-27 04:28

    JAVA CODE: A long time has passed since this question was made, but I've rewritten this code from C++ to Java in case someone will need it (I needed to use it for developing an app on android studio).

    public Bitmap Thresholding(Bitmap bitmap)
    {
        Mat imgMat = new Mat();
        Utils.bitmapToMat(bitmap, imgMat);
        imgMat.convertTo(imgMat, CvType.CV_32FC1, 1.0 / 255.0);
    
        Mat res = CalcBlockMeanVariance(imgMat, 21);
        Core.subtract(new MatOfDouble(1.0), res, res);
        Imgproc.cvtColor( imgMat, imgMat, Imgproc.COLOR_BGRA2BGR);
        Core.add(imgMat, res, res);
    
        Imgproc.threshold(res, res, 0.85, 1, Imgproc.THRESH_BINARY);
    
        res.convertTo(res, CvType.CV_8UC1, 255.0);
        Utils.matToBitmap(res, bitmap);
    
        return bitmap;
    }
    
    public Mat CalcBlockMeanVariance (Mat Img, int blockSide)
    {
        Mat I = new Mat();
        Mat ResMat;
        Mat inpaintmask = new Mat();
        Mat patch;
        Mat smallImg = new Mat();
        MatOfDouble mean = new MatOfDouble();
        MatOfDouble stddev = new MatOfDouble();
    
        Img.convertTo(I, CvType.CV_32FC1);
        ResMat = Mat.zeros(Img.rows() / blockSide, Img.cols() / blockSide, CvType.CV_32FC1);
    
        for (int i = 0; i < Img.rows() - blockSide; i += blockSide)
        {
            for (int j = 0; j < Img.cols() - blockSide; j += blockSide)
            {
                patch = new Mat(I,new Rect(j,i, blockSide, blockSide));
                Core.meanStdDev(patch, mean, stddev);
    
                if (stddev.get(0,0)[0] > 0.01)
                    ResMat.put(i / blockSide, j / blockSide, mean.get(0,0)[0]);
                else
                    ResMat.put(i / blockSide, j / blockSide, 0);
            }
        }
    
        Imgproc.resize(I, smallImg, ResMat.size());
        Imgproc.threshold(ResMat, inpaintmask, 0.02, 1.0, Imgproc.THRESH_BINARY);
    
        Mat inpainted = new Mat();
        Imgproc.cvtColor(smallImg, smallImg, Imgproc.COLOR_RGBA2BGR);
        smallImg.convertTo(smallImg, CvType.CV_8UC1, 255.0);
    
        inpaintmask.convertTo(inpaintmask, CvType.CV_8UC1);
        Photo.inpaint(smallImg, inpaintmask, inpainted, 5, Photo.INPAINT_TELEA);
    
        Imgproc.resize(inpainted, ResMat, Img.size());
        ResMat.convertTo(ResMat, CvType.CV_32FC1, 1.0 / 255.0);
    
        return ResMat;
    }
    

提交回复
热议问题