2017-02-24 11 views
1

GPUImageフレームワークを使用して鉛筆スケッチフィルタを実装しました。しかし、私はフィルターが出力を生成するにはあまりにも複雑だと思う。GPUImage鉛筆スケッチフィルタ最適化

鉛筆フィルタ機能

- (void)pencilSketch 
{ 
    //UIImage *inputImage = [UIImage imageNamed:@"portrait.jpg"]; 
    UIImage *inputImage = [UIImage imageNamed:@"selfie4.jpg"]; 


    GPUImageGrayscaleFilter *grayFilter = [[GPUImageGrayscaleFilter alloc] init]; 
    GPUImageColorInvertFilter *edgeFilter = [[GPUImageColorInvertFilter alloc] init]; 
    GPUImageGaussianBlurFilter *blurr = [[GPUImageGaussianBlurFilter alloc] init]; 
    blurr.blurRadiusInPixels = 8.0;   // Edge Sensitivity 
    blurr.texelSpacingMultiplier = 8.0;  // Edge Strength 

    GPUImageLinearBurnBlendFilter *filter = [[GPUImageLinearBurnBlendFilter alloc] init]; 

    UIImage *invImg = [edgeFilter imageByFilteringImage: inputImage];  // Color Invert 
    UIImage *blurrImg = [blurr imageByFilteringImage: inputImage];   // Gaussian Blurr 

    // Linear Burn Blend 
    GPUImagePicture *mainPicture = [[GPUImagePicture alloc] initWithImage: invImg]; 
    GPUImagePicture *topPicture = [[GPUImagePicture alloc] initWithImage: blurrImg]; 

    [mainPicture addTarget: filter]; 
    [topPicture addTarget: filter]; 

    [filter useNextFrameForImageCapture]; 
    [mainPicture processImage]; 
    [topPicture processImage]; 

    UIImage *resultedimage = [filter imageFromCurrentFramebuffer]; 
    resultedimage = [UIImage imageWithCGImage:[resultedimage CGImage] scale:1.0 orientation: invImg.imageOrientation]; 

    GPUImageColorInvertFilter *bf = [[GPUImageColorInvertFilter alloc] init]; 
    resultedimage = [bf imageByFilteringImage: resultedimage];  // Color Invert 
    resultedimage = [grayFilter imageByFilteringImage: resultedimage]; // Gray scale 

    UIImage *grainImage = [UIImage imageNamed:@"stroke2.jpg"]; 
    GPUImageGaussianBlurFilter *gBlurr = [[GPUImageGaussianBlurFilter alloc] init]; 
    gBlurr.blurRadiusInPixels = 5.0; 
    UIImage *blurrGrainImg = [gBlurr imageByFilteringImage: grainImage]; 
    GPUImagePicture *blurrPic = [[GPUImagePicture alloc] initWithImage: resultedimage]; 
    GPUImagePicture *topPic = [[GPUImagePicture alloc] initWithImage: blurrGrainImg]; 

    GPUImageSoftLightBlendFilter *maskedFilter = [[GPUImageSoftLightBlendFilter alloc] init]; 
    [blurrPic addTarget: maskedFilter]; 
    [topPic addTarget: maskedFilter]; 
    [maskedFilter useNextFrameForImageCapture]; 
    [blurrPic processImage]; 
    [topPic processImage]; 

    resultedimage = [maskedFilter imageFromCurrentFramebuffer]; 
    resultedimage = [UIImage imageWithCGImage:[resultedimage CGImage] scale:1.0 orientation: inputImage.imageOrientation]; 

    GPUImageColorBurnFilter *bFilter = [[GPUImageColorBurnFilter alloc] init]; 
    bFilter.brightness = 5.0;   // Edge Darkness 
    resultedimage = [bFilter imageByFilteringImage: resultedimage]; 

    baseImage.image = resultedimage; 
} 

出力画像フィルタ

enter image description here

の結果のために誰もが、このフィルタを最適化する方法を私に提案してください? 誰かが私にこのことのためのシェーダープログラムを書くように案内したいと思います。私は、カスタムGPUImageFilterを作成し、同じもの用のシェーダープログラムを書くことができます。

答えて

2
UIImage *imgCropped=image; 
stillImageSource = [[GPUImagePicture alloc] initWithImage:imgCropped]; 
saturationFilter=[[GPUImageSaturationFilter alloc]init]; 
[saturationFilter setSaturation:0]; 
[stillImageSource addTarget:saturationFilter]; 
[stillImageSource processImage]; 
[saturationFilter useNextFrameForImageCapture]; 
UIImage *copyImage=[saturationFilter imageFromCurrentFramebuffer]; 
stillImageSource=[[GPUImagePicture alloc] initWithImage:copyImage]; 
copyGPUimage=[[GPUImagePicture alloc] initWithImage:copyImage]; 

invertFilter=[[GPUImageColorInvertFilter alloc]init]; 
    [ copyGPUimage addTarget:invertFilter]; 
[ copyGPUimage processImage]; 
[invertFilter useNextFrameForImageCapture]; 
UIImage *imgTempr=[invertFilter imageFromCurrentFramebuffer]; 
copyGPUimage= [[GPUImagePicture alloc]initWithImage:imgTempr]; 


gaussianBlur=[[GPUImageGaussianBlurFilter alloc]init]; 
[gaussianBlur setBlurRadiusInPixels:val]; 
[copyGPUimage addTarget:gaussianBlur]; 
[ copyGPUimage processImage]; 
[gaussianBlur useNextFrameForImageCapture]; 

UIImage *imgTempa=[gaussianBlur imageFromCurrentFramebuffer]; 
    copyGPUimage= [[GPUImagePicture alloc]initWithImage:imgTempa]; 

colorDodge = [[GPUImageColorDodgeBlendFilter alloc] init];ここ

[stillImageSource addTarget:colorDodge]; 
[ copyGPUimage addTarget:colorDodge]; 
[stillImageSource processImage]; 
[ copyGPUimage processImage]; 
[colorDodge useNextFrameForImageCapture]; 
imageWithAppliedThreshold=[colorDodge imageFromCurrentFramebuffer]; 

//あなたは今、あなたが

stillImageSource = [[GPUImagePicture alloc] initWithImage:imageWithAppliedThreshold]; 
monochromeFilter=[[GPUImageMonochromeFilter alloc]init]; 
[monochromeFilter setIntensity:intenVal]; 
[monochromeFilter setColorRed:0.0 green:0.0 blue:0.0]; 
[monochromeFilter setBackgroundColorRed:1.0 green:1.0 blue:1.0 alpha:1.0]; 
[stillImageSource addTarget: monochromeFilter]; 
[stillImageSource processImage]; 
[monochromeFilter useNextFrameForImageCapture]; 
imageWithAppliedThreshold=[monochromeFilter imageFromCurrentFramebuffer]; 
その闇を設定することができ、あなたのスケッチを持っています