0

我有这个图像在此处输入图像描述。我正在尝试对这张图片中的字母进行 OCR。对于字母“9”和“R”,我没有得到想要的结果。首先,我裁剪了这些字母,在此处输入图像描述&在此处输入图像描述并执行以下命令。

tesseract 9.png stdout -psm 8
.

它只是返回“。”

所有其他字母的 OCR 都可以正常工作,但对于这两个字母则不行(不过,我认为它们的图像质量还不错)。任何建议/帮助表示赞赏。

4

2 回答 2

2

https://www.newocr.com/根据谷歌的结果,我自己没有使用 tesseract 的经验,但是复制角色并添加一些在内部使用 tesseract 的背景作品。

所以我用这个作为输入:

在此处输入图像描述

这在该 web-app: 上给出了正确的结果99999999,而单个字符不起作用。也许您可以通过您的 tesseract 实现来验证这一点,也许它可以帮助您调整孤立的提取字符以使用 tesseract。例如,尝试将提取的轮廓的多个副本彼此相邻缝合以改善 tesseract 输出 - 因为您知道将轮廓彼此相邻缝合的频率,您就会知道如果它经常识别相同的字符,输出可能是正确的次..

同样适用于

在此处输入图像描述

边框看起来很重要,没有足够的边框它会识别P。一般来说,afaik 你应该尝试用纯黑色和纯白色替换背景和前景!不确定网络应用程序使用什么样的预处理......

此代码可用于使用 C++ 和 OpenCV 重复图像,但不会在周围添加边框。为此,您的工作将非常相似,但需要一些额外的步骤,并且您必须为边框分配一些颜色。

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

这段代码非常简单,应该与 java、python 等中的 opencv 非常相似。

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;
}

给出这个结果:

在此处输入图像描述

于 2015-12-09T13:49:37.317 回答
2

我比你成功了一点点......我做了一个“连接组件分析”来提取单个字母,然后在每个提取的字母周围加上一个边框,并将它们全部附加到一条水平线上,这给了我这个:

在此处输入图像描述

如果我然后运行,tesseract我会得到:

VQQTRF
于 2015-12-09T15:13:26.260 回答