2015-12-10 61 views
0

我已經發現一個程序,它可以二值化的圖像,並且使圖像單色雙穩態圖像爲TIF

OpenCV Adaptive Threshold OCR

我複製/粘貼的代碼

#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=21) // 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; 
} 

編譯

g++ binarize.cpp `pkg-config opencv --cflags --libs` 

運行

./a.out 

錯誤

(Img:27277): Gtk-WARNING **: cannot open display: 

更新

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.tif",res*255); 
    imshow("Edges",res); 
    waitKey(0); 

    return 0; 
} 

enter image description here

回答

0

只是建立在Ubuntu的驗證碼14.03 64,使用相同的命令行,你用,沒有任何消息,運行良好。

我認爲警告與您的系統環境有關。

+0

我通過運行'xvfb-run。/ txtbin'發現了一個解決方案:)但是我最後還是有一件事..如果輸出文件是'tif',圖像中的顏色就像倒置一樣..黑色是白色和白色是黑色..有沒有一種簡單的方法,使代碼與'tif'輸出,而不是'jpg'輸出工作? – clarkk

+0

res = 1-res;或res = 255-res;取決於規模。 –

+0

已經更新了這個問題..如果'res = 255-res'並且輸出結果是tif圖像全是黑色的..已經上傳了一個具有'res = 1-res'的圖像並輸出tif – clarkk