用于 OCR 的 iOS UIImage 二值化 - 处理具有不同亮度的图像

标签 ios image-processing ocr gpuimage

我有一个 C++ 二进制化例程,用于以后的 OCR 操作。 但是我发现它产生了不必要的文本倾斜。 搜索我找到的替代品 GPUImage非常有值(value),它解决了倾斜问题。

我正在使用 GPUImage code like this在应用 OCR 之前对我的输入图像进行二值化。

但是阈值不包括我得到的图像范围。 查看我的输入图像中的两个样本:

enter image description here

enter image description here

我无法处理具有相同阈值的两者。 较低的值(value)似乎适合后来,较高的值(value)适合第一个。

第二张图片似乎特别复杂,因为无论我为阈值设置什么值,我都无法正确地将所有字符二值化。另一方面,我的 C++ 二值化例程似乎做对了,但我没有太多的见解来试验它,就像 GPUImage 中的简单阈值一样。

我该如何处理?

更新:

我尝试使用默认乘数 = 1 的 GPUImageAverageLuminanceThresholdFilter。它适用于第一张图片,但第二张图片仍然存在问题。

一些更多样化的二值化输入:

enter image description here

enter image description here

更新二:

经过this answer by Brad之后, 尝试了 GPUImageAdaptiveThresholdFilter (也合并了 GPUImagePicture 因为之前我只在 UIImage 上应用它)。

有了这个,我得到了第二张完美二值化的图像。然而,当我将模糊大小设置为 3.0 时,第一个在二值化后似乎有很多噪音。 OCR 会导致添加额外的字符。使用较低的模糊大小值,第二张图像会失去精度。

这里是:

+(UIImage *)binarize : (UIImage *) sourceImage
{
    UIImage * grayScaledImg = [self toGrayscale:sourceImage];
    GPUImagePicture *imageSource = [[GPUImagePicture alloc] initWithImage:grayScaledImg];
    GPUImageAdaptiveThresholdFilter *stillImageFilter = [[GPUImageAdaptiveThresholdFilter alloc] init];
    stillImageFilter.blurSize = 3.0;    

    [imageSource addTarget:stillImageFilter];   
    [imageSource processImage];        

    UIImage *imageWithAppliedThreshold = [stillImageFilter imageFromCurrentlyProcessedOutput];
  //  UIImage *destImage = [thresholdFilter imageByFilteringImage:grayScaledImg];
    return imageWithAppliedThreshold;
}

最佳答案

对于预处理步骤,您需要 adaptive thresholding在这里。

我使用 opencv 得到了这些结果灰度和自适应阈值方法。也许加上低通噪声过滤(高斯或中值)它应该像魅力一样工作。

luminance

diverse

我用了provisia (它是一个帮助您快速处理图像的用户界面)以获得我需要的 block 大小:43 用于您在此处提供的图像。如果您从更近或更远的地方拍照, block 大小可能会改变。如果你想要一个通用算法,你需要开发一个应该搜索最佳大小的算法(搜索直到检测到数字)

编辑: 我刚看到最后一张图片。它小得无法治疗。即使您应用最好的预处理算法,您也不会检测到这些数字。采样不是解决方案,因为周围会出现噪音。

关于用于 OCR 的 iOS UIImage 二值化 - 处理具有不同亮度的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18630842/

相关文章:

ios - Swift 如何在 UIViewController 和 UITableViewController 之间创建类似于 UIPageViewController 的效果

ios - 如何在 Core Data 中保存有关系的实体

c++ - openCV 错误 : undefined reference to `cvLoadImage' Ubuntu

c# - 如何读取扫描支票的支票号码和银行路由号码

java - 从 java 中使用 Tesseract

ios - 我是否误解了NSUserDefaults initWithUser?

ios - 如何通过iOS中的jabbered在群聊中接收离线消息?

c++ - 将 alpha channel 添加到 opencv Mat

python - 图像 X 轴导数的中位数

image-processing - 图像处理以提高 tesseract OCR 准确性