【发布时间】:2013-09-08 23:08:22
【问题描述】:
我有一个 C++ 二值化例程,用于以后的 OCR 操作。 但是我发现它会产生不必要的文本倾斜。 寻找替代品我发现GPUImage 很有价值,它解决了倾斜问题。
在应用 OCR 之前,我正在使用 GPUImage code like this 对输入图像进行二值化处理。
但是阈值不涵盖我得到的图像范围。 从我的输入图像中查看两个样本:
我无法同时处理具有相同阈值的两者。 低价值似乎可以稍后使用,较高的价值可以使用第一个。
第二张图像似乎特别复杂,因为无论我为阈值设置什么值,我都无法正确二值化所有字符。另一方面,我的 C++ 二值化例程似乎做对了,但我没有像 GPUImage 中的简单阈值那样对它进行实验的太多见解。
我应该如何处理?
更新:
我尝试使用默认乘数 = 1 的 GPUImageAverageLuminanceThresholdFilter。它适用于第一张图像,但第二张图像仍然存在问题。
一些更多样化的二值化输入:
更新二:
在通过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;
}
【问题讨论】:
-
您的 C++ 二值化例程是什么样的?也许这可以适应框架内的自定义过滤器。是局部自适应二值化还是全局阈值化?
-
C++ 例程所做的是灰度化 + 二值化。至于 GPUImage,我自己做灰度,然后将输出传递给 GPUImage 过滤器。我使用 stackoverflow 上提到的许多灰度技术之一。你想让我在这里提一下吗?基本上我使用 3 个不同的程序来做到这一点,但结果差别不大,所以我觉得这无关紧要。
-
这不是我所说的我的 C++ 例程,它是由其他人提供的,我不能在这里完全分享它,也无法总结它是如何工作的,因为我对它没有太多见解这个怎么运作。它相当复杂。我给你描述的都是我从里面的cmets中推导出来的。
-
我有一个商业但便宜的 iOS 二进制化代码。你能给我一个你想要二值化的硬图像样本,以便我试试吗?
-
@BradLarson 能否请您查看最终更新并建议我如何最好地使用 GPUImage?
标签: ios image-processing ocr gpuimage