2014-01-13 24 views
2

我想为OCR准备图像,我用GPUImage做到这一点,代码做工精细,直到我的裁剪图像裁剪!我得到了坏结果之后......ios 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; 
} 

UPDATE:

在此期间,当可以裁剪图像,这样做最近 多的宽度为8个像素,你应该看到正确的结果

感谢ü@Brad拉尔森!我调整图像的宽度与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); 
} 

回答

2

之前,我甚至去的核心问题在这里,我要指出的是,GPUImageAdaptiveThresholdFilter已经做了转换为灰度作为第一步,所以上面的代码-grayImage:是不必要的,只会减慢速度。您可以删除所有代码,并将您的输入图像直接传递给自适应阈值过滤器。

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

与此同时,当您裁剪图像时,请按8个像素的最接近倍数宽度进行裁剪,然后您应看到正确的结果。

+0

thanx快速重播!我使用CocoaPods的代码,我将检查最后的gitHub版本并留下反馈! '-grayImage:'这是我的不好,已经删除它=)) – 3a4oT

+0

我使用的是最新版本 - 0.1.2!谢谢你!我更新我的帖子! – 3a4oT

+0

@ 3a4oT - 是的,看起来它仍然需要修复。我会研究这个。 –