ios GPUImage,用小尺寸的图像进行图像处理的效果不好?[英] ios GPUImage,bad result of image processing with small-size images?

本文是小编为大家收集整理的关于ios GPUImage,用小尺寸的图像进行图像处理的效果不好?的处理方法,想解了ios GPUImage,用小尺寸的图像进行图像处理的效果不好?的问题怎么解决?ios GPUImage,用小尺寸的图像进行图像处理的效果不好?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在尝试为 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 像素宽度的倍数,您应该会看到正确的结果.

本文地址:https://www.itbaoku.cn/post/924480.html