首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OCR :没有达到预期的结果

OCR :没有达到预期的结果
EN

Stack Overflow用户
提问于 2015-12-09 10:31:04
回答 2查看 380关注 0票数 0

我有这张照片

。我正在试着把这张图片中的字母进行OCR。对于字母'9‘和'R’,我没有得到想要的结果。我先剪了这些信,

&

并执行以下命令。

代码语言:javascript
复制
tesseract 9.png stdout -psm 8
.

它正在回归“。

所有其他信件的OCR工作正常,但这两封信的效果不佳(不过,我认为它们的图像质量并没有那么差)。如有任何建议/帮助,我们将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-09 13:49:37

我本人对tesseract没有经验,但根据google的结果,我在https://www.newocr.com/上复制了这个角色并添加了一些背景作品,后者在内部使用tesseract。

所以我用这个作为输入:

这在web应用程序上给出了正确的结果:99999999,而单个字符不起作用。也许您可以使用tesseract实现来验证这一点,也许它可以帮助您调整孤立的提取字符以使用tesseract。例如,尝试在彼此之间缝合多个提取的轮廓,以提高输出--因为你知道彼此之间缝轮廓的频率是多少,你就会知道如果它识别出相同的字符,那么输出可能是正确的。

同样的作品

边界看起来很重要,如果没有足够的边界,它就会识别P。一般来说,afaik你应该尝试用纯黑和纯白取代背景和前景!不知道网络应用程序使用的是什么预处理.

此代码可用于使用C++和OpenCV重复图像,但不会在周围添加边框。要做到这一点,您将工作非常类似,但通过一些额外的步骤,您将不得不分配一些颜色的边框。

编辑:我已经更新了代码,在每个方向使用4个像素的边框(您可以调整变量)和黑色背景色。

这段代码非常简单,对于java、python等中的opencv来说应该是非常相似的。

代码语言:javascript
复制
int main(int argc, char * argv[])
{
    //cv::Mat input = cv::imread("../inputData/ocrR.png");

    if(argc != 3)
    {
        std::cout << "usage: .exe filename #Repetitions" << std::endl;
        return 0;
    }

    std::string filename = argv[1];
    int nRepetitions = atoi(argv[2]);

    cv::Mat inputImage = cv::imread(filename);
    if(inputImage.empty())
    {
        std::cout << "image file " << filename << " could not be loaded" << std::endl;
        return 0;
    }

    // you instead should try to extract the background color from the image (e.g. from the image border)
    cv::Scalar backgroundColor(0,0,0);

    // size of the border in each direction
    int border = 4;

    cv::Mat repeatedImage = cv::Mat(inputImage.rows + 2*border, nRepetitions*inputImage.cols + 2*border, inputImage.type() , backgroundColor);

    cv::Rect roi = cv::Rect(border,border,inputImage.cols, inputImage.rows);

    for(int i=0; i<nRepetitions; ++i)
    {
        // copy original image to subimage of repeated image
        inputImage.copyTo(repeatedImage(roi));

        // update roi position
        roi.x += roi.width;
    }

    // now here you could send your repeated image to tesseract library and test whether nRepetitions times a letter was found.

    cv::imwrite("repeatedImage.png", repeatedImage);
    cv::imshow("repeated image" , repeatedImage);
    cv::waitKey(0);
    return 0;
}

给出这一结果:

票数 2
EN

Stack Overflow用户

发布于 2015-12-09 15:13:26

我比你成功多了一点。我做了一个“连接组件分析”来提取单个字母,然后在每个提取的字母周围放置一个边框,并将它们全部附加到一条横线中,这给了我这样的感觉:

如果我运行tesseract,就会得到:

代码语言:javascript
复制
VQQTRF
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34176517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档