使用tesseract转换UIImage black'n白色而不是灰度

时间:2012-04-03 11:11:31

标签: iphone image filter uiimage tesseract

我在iPhone应用程序中使用tesseract。

我在我的图像上尝试了几个滤镜,用于将其转换为灰度图像,但是我希望得到一个阈值设置的结果,以便图像内部的唯一像素为黑色或白色。

我成功地使用了苹果灰度过滤器,它提供了适当的结果。然而,它仍然是一个16位图像(如果我错了,请纠正我)。我目前使用的过滤如下:

- (UIImage *) grayishImage:(UIImage *)i {

    // Create a graphic context.
    UIGraphicsBeginImageContextWithOptions(i.size, YES, 1.0);
    CGRect imageRect = CGRectMake(0, 0, i.size.width, i.size.height);
// Draw the image with the luminosity blend mode.
[i drawInRect:imageRect blendMode:kCGBlendModeLuminosity alpha:1.0];
    // Get the resulting image.
    UIImage *filteredImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return filteredImage;
}

任何人都可以使用滤镜来获得纯黑白像素而不是灰度图像吗?

1 个答案:

答案 0 :(得分:12)

执行此操作的最快方法可能是使用OpenGL ES 2.0着色器将阈值应用于图像。我的GPUImage框架对此进行了封装,因此您无需担心幕后更多的技术问题。

使用GPUImage,您可以使用GPUImageLuminanceThresholdFilter获取UIImage的阈值版本,代码如下:

GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage];
GPUImageLuminanceThresholdFilter *stillImageFilter = [[GPUImageLuminanceThresholdFilter alloc] init];
stillImageFilter.threshold = 0.5;
[stillImageSource addTarget:stillImageFilter];
[stillImageFilter useNextFrameForImageCapture];
[stillImageSource processImage];

UIImage *imageWithAppliedThreshold = [stillImageFilter imageFromCurrentFramebuffer];

您可以将彩色图像传递给此图像,因为这会自动从每个像素中提取亮度并将阈值应用于此。高于阈值的任何像素变为白色,并且下面的任何像素变为黑色。您可以调整阈值以满足您的特定条件。

然而,对于你要传递给Tesseract的东西,更好的选择是我的GPUImageAdaptiveThresholdFilter,它可以与GPUImageLuminanceThresholdFilter一样使用,只是没有阈值。自适应阈值处理基于当前像素周围的9像素区域进行阈值处理操作,调整局部照明条件。这是专门为帮助OCR应用程序而设计的,所以它可能是这里的方式。

可以在this answer中找到两种类型过滤器的示例图片。

请注意,通过UIImage的往返比处理原始数据要慢,因此这些过滤器在直接视频或电影源上运行时要快得多,并且可以实时运行这些输入。我还有一个原始像素数据输出,使用Tesseract可能会更快。