opencv BGR2GRAY和Pillow转换函数之间的区别

时间:2017-02-02 07:42:15

标签: c++ opencv image-processing pillow

我试图使用带有opencv和c ++的Tesseract库来OCR包含数字和字符的图像。在调用tesseract库之前,我曾经用opencv

对图像进行灰度调整
cvtColor(roiImg,roiImg,CV_BGR2GRAY);

这是Gray scale image i received with python

此图片的OCR结果并非100%准确。

然后使用带有python的枕头库测试相同的图像。使用以下方法对原始图像进行灰度缩放。

gray = image.convert('L')

这是Gray Scale image i received with pillow library

后者提到的灰度图像给出了100%准确的结果。

一旦我通过互联网搜索,就提到opencv BGR2Gray和枕头img.convert方法都使用相同的亮度变换算法。

两种不同OCR结果的原因是什么?

先谢谢

1 个答案:

答案 0 :(得分:1)

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