2017-02-02 2 views
4

Я пытаюсь OCR изображение, которое включает в себя как числа, так и символы, используя библиотеку Tesseract с opencv и C++. Перед вызова Тессеракта библиотеки, я использовал серую шкалу изображение с OpenCVРазница между opencv функциями преобразования BGR2GRAY и Pillow

cvtColor(roiImg,roiImg,CV_BGR2GRAY); 

Это Gray scale image i received with python

результатов распознавания для этого изображения было не 100% точным.

Тогда же изображение было протестировано с помощью библиотеки подушек с питоном. Исходное изображение было серого масштабирования, используя следующий метод.

gray = image.convert('L') 

Это Gray Scale image i received with pillow library

Последнее упомянуто серое изображение масштабируется дали 100% точные результаты.

Как только я просмотрел через Интернет, было упомянуто, что оба метода opencv BGR2Gray и pillg img.convert используют один и тот же алгоритм преобразования яркости.

В чем причина двух разных результатов распознавания текста?

Заранее спасибо

+4

OpenCV использует BGR по умолчанию, но вы конвертируете из RGB - серый ('CV_RGB2GRAY'). Разве это не должно быть 'CV_BGR2GRAY'? –

+0

@Hi Я Frogatto u правильно. Я редактировал код. Любая идея, почему это происходит? –

+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]

знач1 = 248,886

знач2 = 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