我正在创建一个将图像转换为二进制图像的应用程序.为此,我使用GPUimage框架.首先,它会将其转换为灰度而不是变化,而不是将其转换为二值化图像.
当我使用灰度和对比度滤镜时,它会产生内存警告,如果我尝试在一个一个应用程序崩溃时转换多个图像(比方说10),会产生一些时间.
这是我的代码:
- (UIImage *) doBinarize:(UIImage *)sourceImage
{
UIImage * grayScaledImg = [self grayImage:sourceImage];
grayScaledImg = [self contrastImage:grayScaledImg];
GPUImagePicture *imageSource = [[GPUImagePicture alloc] initWithImage:grayScaledImg];
GPUImageAdaptiveThresholdFilter *stillImageFilter = [[GPUImageAdaptiveThresholdFilter alloc] init];
stillImageFilter.blurRadiusInPixels = 8.0;
[imageSource addTarget:stillImageFilter];
[imageSource processImage];
UIImage *retImage = [stillImageFilter imageByFilteringImage:grayScaledImg];
UIImage * aretImage = [self sharpenImage:retImage];
[imageSource removeAllTargets];
return aretImage;
}
- (UIImage *) grayImage :(UIImage *)inputImage
{
GPUImageGrayscaleFilter *selectedFilter = [[GPUImageGrayscaleFilter alloc] init];
UIImage *filteredImage = [selectedFilter imageByFilteringImage:inputImage];
return filteredImage;
}
- (UIImage *) sharpenImage :(UIImage *)inputImage
{
GPUImageSharpenFilter *sharpenFilter = [[GPUImageSharpenFilter alloc] init];
[sharpenFilter setSharpness:10];
UIImage *quickFilteredImage = [sharpenFilter imageByFilteringImage: inputImage];
return quickFilteredImage;
}
- (UIImage *) contrastImage :(UIImage *)inputImage
{
GPUImageContrastFilter *contrastfilter =[[GPUImageContrastFilter alloc]init];
[contrastfilter setContrast:3];
UIImage *ima= [contrastfilter imageByFilteringImage:inputImage];
return ima;
}
Run Code Online (Sandbox Code Playgroud)
如果我关闭灰色和对比度内存警告的代码已经消失,那么问题就在于该代码.
首先,你在那里做了很多不必要的工作.自适应阈值滤波器(以及所有其他边缘检测或阈值滤波器)自动将其输入转换为灰度,因此不需要.
您不应该转换到UIImages和从UIImages转换,因为每次通过UIImages需要在CPU上进行昂贵的Core Graphics访问.此外,你将在内存中构建大量的临时UIImage,这可能是你的内存相关崩溃的原因,如果它们在循环中累积.
相反,将您的输入图像一次性通过各种过滤器链接:
GPUImagePicture *imageSource = [[GPUImagePicture alloc] initWithImage:sourceImage];
GPUImageContrastFilter *contrastfilter =[[GPUImageContrastFilter alloc]init];
[contrastfilter setContrast:3];
GPUImageAdaptiveThresholdFilter *stillImageFilter = [[GPUImageAdaptiveThresholdFilter alloc] init];
stillImageFilter.blurRadiusInPixels = 8.0;
GPUImageSharpenFilter *sharpenFilter = [[GPUImageSharpenFilter alloc] init];
[sharpenFilter setSharpness:10];
[imageSource addTarget:contrastFilter];
[contrastFilter addTarget:stillImageFilter];
[stillImageFilter addTarget:sharpenFilter];
[sharpenFilter useNextFrameForImageCapture];
[imageSource processImage];
UIImage *outputImage = [sharpenFilter imageFromCurrentFramebuffer];
Run Code Online (Sandbox Code Playgroud)
这将导致您的映像保留在GPU上直到最后一步,并且在框架中使用新的帧缓冲缓存机制,它将限制此处理的内存使用.
| 归档时间: |
|
| 查看次数: |
1486 次 |
| 最近记录: |