2017-02-02 1 views
4

opencv 및 C++와 함께 Tesseract 라이브러리를 사용하여 숫자와 문자를 모두 포함하는 이미지를 OCR하려고합니다. 정팔 포체 라이브러리를 호출하기 전에, 내가 OpenCV의이 OCR이 이미지에 대한 결과 인 Gray scale image i received with pythonopencv BGR2GRAY와 베개 변환 함수의 차이점

가 100 % 정확하다

cvtColor(roiImg,roiImg,CV_BGR2GRAY); 

와 규모를 이미지를 회색하는 데 사용됩니다.

다음 이미지는 python이있는 pillow 라이브러리로 테스트되었습니다. 원본 이미지는 다음 방법을 사용하여 회색 스케일링되었습니다.

gray = image.convert('L') 

후자 한 그레이 스케일 이미지가 100 % 정확한 결과를 준 Gray Scale image i received with pillow library

이다.

인터넷을 통해 검색 한 후에는 opencv BGR2Gray와 pillow img.convert 메소드 모두 동일한 루마 변환 알고리즘을 사용한다고 언급했습니다.

두 가지 OCR 결과가 서로 다른 이유는 무엇입니까? 사전

+4

OpenCV의 기본적으로 BGR 사용되지만으로 변환되고 RGB에서 회색 ('CV_RGB2GRAY'). 'CV_BGR2GRAY'가 아니겠습니까? –

+0

@Hi 저는 Frogatto입니다. 맞습니다. 코드를 편집했습니다. 왜 이런 일이 일어나는 지 아십니까? –

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

VAL1 = 248.886

을 val2 = 248.114

  • 파이썬 코드 :

    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