我试图使用带有opencv和c ++的Tesseract库来OCR包含数字和字符的图像。在调用tesseract库之前,我曾经用opencv
对图像进行灰度调整cvtColor(roiImg,roiImg,CV_BGR2GRAY);
这是
此图片的OCR结果并非100%准确。
然后使用带有python的枕头库测试相同的图像。使用以下方法对原始图像进行灰度缩放。
gray = image.convert('L')
这是
后者提到的灰度图像给出了100%准确的结果。
一旦我通过互联网搜索,就提到opencv BGR2Gray和枕头img.convert方法都使用相同的亮度变换算法。
两种不同OCR结果的原因是什么?
先谢谢
答案 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