opencv binarize images with text

前端 未结 1 1576
Happy的楠姐
Happy的楠姐 2021-01-14 18:04

I need to binarize images with text.. It works very well but in some cases the output is empty (white image)

code

/*
 *  Compile
 *  # g++ txtbin.cpp         


        
相关标签:
1条回答
  • 2021-01-14 18:37

    Ok :) Set blockSide smaller (7 for instance) it will give you result image as shown below. It depends on font size, smaller fonts need smaller block size, else text will be filtered out and you get empty image.

    #include <iostream>
    #include <vector>
    #include <stdio.h>
    #include <stdarg.h>
    #include "/usr/include/opencv2/opencv.hpp"
    #include "fstream"
    #include "iostream"
    using namespace std;
    using namespace cv;
    
    void CalcBlockMeanVariance(Mat& Img,Mat& Res,float blockSide=9) // blockSide - the parameter (set greater for larger font on image)
    {
        Mat I;
        Img.convertTo(I,CV_32FC1);
        Res=Mat::zeros(Img.rows/blockSide,Img.cols/blockSide,CV_32FC1);
        Mat inpaintmask;
        Mat patch;
        Mat smallImg;
        Scalar m,s;
    
        for(int i=0;i<Img.rows-blockSide;i+=blockSide)
        {       
            for (int j=0;j<Img.cols-blockSide;j+=blockSide)
            {
                patch=I(Range(i,i+blockSide+1),Range(j,j+blockSide+1));
                cv::meanStdDev(patch,m,s);
                if(s[0]>0.01) // Thresholding parameter (set smaller for lower contrast image)
                {
                    Res.at<float>(i/blockSide,j/blockSide)=m[0];
                }else
                {
                    Res.at<float>(i/blockSide,j/blockSide)=0;
                }           
            }
        }
    
        cv::resize(I,smallImg,Res.size());
    
        cv::threshold(Res,inpaintmask,0.02,1.0,cv::THRESH_BINARY);
    
        Mat inpainted;
        smallImg.convertTo(smallImg,CV_8UC1,255);
    
        inpaintmask.convertTo(inpaintmask,CV_8UC1);
        inpaint(smallImg, inpaintmask, inpainted, 5, INPAINT_TELEA);
    
        cv::resize(inpainted,Res,Img.size());
        Res.convertTo(Res,CV_32FC1,1.0/255.0);
    
    }
    
    int main( int argc, char** argv )
    {
        namedWindow("Img");
        namedWindow("Edges");
        //Mat Img=imread("D:\\ImagesForTest\\BookPage.JPG",0);
        Mat Img=imread("test2.jpg",0);
        Mat res;
        Img.convertTo(Img,CV_32FC1,1.0/255.0);
        CalcBlockMeanVariance(Img,res); 
        res=1.0-res;
        res=Img+res;
        imshow("Img",Img);
        cv::threshold(res,res,0.85,1,cv::THRESH_BINARY);
        cv::resize(res,res,cv::Size(res.cols/2,res.rows/2));
        imwrite("result.jpg",res*255);
        imshow("Edges",res);
        waitKey(0);
    
        return 0;
    }
    

    0 讨论(0)
提交回复
热议问题