2017-02-02 5 views
4

opencvとC++でTesseractライブラリを使用して、数字と文字の両方を含む画像をOCRしようとしています。たTesseractライブラリを呼び出す前に、私は、これがこのイメージのGray scale image i received with pythonopencv BGR2GRAYとピロー変換関数の違い

OCR結果であるOpenCVのと規模に画像をグレーに

cvtColor(roiImg,roiImg,CV_BGR2GRAY); 

を使用することは100%正確ではなかったです。

次に、pythonを使用したピローライブラリで同じ画像をテストしました。原画像は、以下の方法を用いてグレースケール化された。

gray = image.convert('L') 

これは、Gray Scale image i received with pillow library

後者が100%正確な結果が得られたグレースケーリング画像が記載されています。

インターネットで検索したところ、opencv BGR2Grayとpillow img.convertメソッドの両方で同じルーマ変換アルゴリズムが使用されていると言われました。

2つの異なるOCR結果の理由は何ですか?予め

おかげ

+4

OpenCVのがデフォルトでBGRを使用するが、あなたから変換されますRGBからグレー( 'CV_RGB2GRAY')。それは 'CV_BGR2GRAY'ではないでしょうか? –

+0

@Hi私は正しいです。私はコードを編集しました。なぜこれが起こっているのか? –

+0

@Hiの後も同じ問題が発生していますが、私はFrogattoの提案ですか? – NAmorim

答えて

0

Pillowは、カラー画像のための唯一の3x8ビットピクセルを読み取ることができます。ここで

両方のライブラリが値を四捨五入する方法を参照するには、簡単なテストは:

  • OpenCVのコード:

    cv::Mat img(2, 1, CV_8UC3), img_gray; 
    img.at<cv::Vec3b>(0, 0) = cv::Vec3b(248, 249, 249); //BGR 
    img.at<cv::Vec3b>(1, 0) = cv::Vec3b(249, 248, 248); //BGR 
    
    cv::cvtColor(img, img_gray, cv::COLOR_BGR2GRAY); 
    std::cout << "img:\n" << img << std::endl; 
    std::cout << "img_gray:\n" << img_gray << std::endl; 
    
    float val1 = 249*0.299f + 249*0.587f + 248*0.114f; //RGB 
    float val2 = 248*0.299f + 248*0.587f + 249*0.114f; //RGB 
    std::cout << "val1=" << val1 << std::endl; 
    std::cout << "val2=" << val2 << std::endl; 
    

IMG:

[248、249 、249;

249、248、248]

img_gray:

[249。

248]

VAL1 = 248.886

VAL2 = 248。114

  • Pythonコード:

    rgbArray = np.zeros((2,1,3), 'uint8') 
    rgbArray[0,0,0] = 249 #R 
    rgbArray[0,0,1] = 249 #G 
    rgbArray[0,0,2] = 248 #B 
    rgbArray[1,0,0] = 248 #R 
    rgbArray[1,0,1] = 248 #G 
    rgbArray[1,0,2] = 249 #B 
    
    img = Image.fromarray(rgbArray) 
    imgGray = img.convert('L') 
    
    print("rgbArray:\n", rgbArray) 
    print("imgGray:\n", np.asarray(imgGray)) 
    print("np.asarray(imgGray).dtype: ", np.asarray(imgGray).dtype) 
    

rgbArray:

[[[249 249 248]

[248 248 249] ]

imgGray:

[248]

[248]

np.asarray(imgGray).dtype:UINT8

関連する問題