问题描述
我正在尝试为 OCR 准备图像,我使用 GPUImage 来做,代码工作正常,直到我裁剪图像!!裁剪后我得到了不好的结果......
作物面积:https://www.dropbox.com/s/e3mlp25sl6m55yk/IMG_0709.PNG
糟糕的结果=(https://www.dropbox.com/s/wtxw7li6paltx21/IMG_0710.PNG
+ (UIImage *) doBinarize:(UIImage *)sourceImage { //first off, try to grayscale the image using iOS core Image routine UIImage * grayScaledImg = [self grayImage:sourceImage]; GPUImagePicture *imageSource = [[GPUImagePicture alloc] initWithImage:grayScaledImg]; GPUImageAdaptiveThresholdFilter *stillImageFilter = [[GPUImageAdaptiveThresholdFilter alloc] init]; stillImageFilter.blurRadiusInPixels = 8.0; [stillImageFilter prepareForImageCapture]; [imageSource addTarget:stillImageFilter]; [imageSource processImage]; UIImage *retImage = [stillImageFilter imageFromCurrentlyProcessedOutput]; [imageSource removeAllTargets]; return retImage; } + (UIImage *) grayImage :(UIImage *)inputImage { // Create a graphic context. UIGraphicsBeginImageContextWithOptions(inputImage.size, NO, 1.0); CGRect imageRect = CGRectMake(0, 0, inputImage.size.width, inputImage.size.height); // Draw the image with the luminosity blend mode. // On top of a white background, this will give a black and white image. [inputImage drawInRect:imageRect blendMode:kCGBlendModeLuminosity alpha:1.0]; // Get the resulting image. UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return outputImage; }
更新:
<块引用>与此同时,当您裁剪图像时,请尽可能将其裁剪到最近的位置宽度为 8 像素的倍数,您应该会看到正确的结果
谢谢@Brad Larson!我将图像宽度调整为最接近 8 的倍数并得到我想要的
-(UIImage*)imageWithMultiple8ImageWidth:(UIImage*)image { float fixSize = next8(image.size.width); CGSize newSize = CGSizeMake(fixSize, image.size.height); UIGraphicsBeginImageContext( newSize ); [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } float next8(float n) { int bits = (int)n & 7; // give us the distance to the previous 8 if (bits == 0) return (float)n; return (float)n + (8-bits); }
推荐答案
在谈到这里的核心问题之前,我应该指出 GPUImageAdaptiveThresholdFilter 已经作为第一步进行了灰度转换,所以你的 -grayImage:上面的代码是不必要的,只会减慢速度.您可以删除所有这些代码,只需将输入图像直接传递给自适应阈值过滤器.
我认为这里的问题是最近对 GPUImagePicture 提取图像数据的方式进行了一系列更改.看起来不是 8 像素宽的倍数的图像在导入时最终看起来像上面那样.对此提出了一些修复建议,但如果来自存储库的最新代码(不是 CocoaPods,相对于 GitHub 存储库通常已经过时)仍在执行此操作,则可能需要做更多的工作.
同时,当您裁剪图像时,将其裁剪为最接近 8 像素宽度的倍数,您应该会看到正确的结果.