Разница между функциями opencv BGR2GRAY и Pillow convert

Я пытаюсь распознать изображение, которое включает в себя как цифры, так и символы, используя библиотеку Tesseract с opencv и c ++. Перед вызовом библиотеки tesseract я использовал шкалу серого изображения с помощью opencv

cvtColor(roiImg,roiImg,CV_BGR2GRAY);

Это Серое изображение, которое я получил с питоном

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

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

gray = image.convert('L')

Это Серое изображение, которое я получил с библиотекой подушек

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

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

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

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

4

Решение

подушка может читать только 3×8-битные пиксели для цветного изображения.

Вот быстрый тест, чтобы увидеть, как обе библиотеки будут округлять значения:

  • Код 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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]