【问题标题】:Difference between opencv BGR2GRAY and Pillow convert functionsopencv BGR2GRAY 和 Pillow 转换函数之间的区别
【发布时间】:2019-01-14 17:37:27
【问题描述】:

我正在尝试使用带有 opencv 和 c++ 的 Tesseract 库对包含数字和字符的图像进行 OCR。在调用 tesseract 库之前,我习惯用 opencv 对图像进行灰度化

cvtColor(roiImg,roiImg,CV_BGR2GRAY);

这是

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

然后用 python 的枕头库测试了相同的图像。使用以下方法对原始图像进行灰度处理。

gray = image.convert('L')

这是

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

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

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

提前致谢

【问题讨论】:

  • OpenCV 默认使用 BGR,但您正在从 RGB 转换为灰色 (CV_RGB2GRAY)。不应该是CV_BGR2GRAY吗?
  • @嗨,我是 Frogatto,你说得对。我编辑了代码。知道为什么会这样吗?
  • 在@Hi I'm Frogatto 建议后仍然遇到同样的问题?
  • 看起来这两个库使用相同的公式将颜色转换为 RGB:docs.opencv.org/3.2.0/de/d25/…pillow.readthedocs.io/en/4.0.x/reference/… 差异可能是由于舍入误差。您可以通过使用值从 0 到 255 的 16x16 图像来检查并比较结果。
  • @NAmorim 是的。还是和上面提到的一样。

标签: c++ opencv image-processing pillow


【解决方案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;
    

图片:

[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

【讨论】:

    猜你喜欢
    • 2011-05-19
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 2015-11-26
    • 2013-02-09
    相关资源
    最近更新 更多