天天看點

iOS實作圖像指定區域模糊

  在大多圖像進行中,我們會應用到高斯模糊處理圖像,通常用它來減少圖像噪聲以及降低細節層次。在此文中介紹了高斯模糊的實作和可選區域的模糊【美圖秀秀-背景虛化】

  高斯模糊的原理中,它是根據高斯曲線調節像素色值,它是有選擇地模糊圖像。說得直白一點,就是高斯模糊能夠把某一點周圍的像素色值按高斯曲線統計起來,采用數學上權重平均的計算方法得到這條曲線的色值,最後能夠留下人物的輪廓,即曲線.是指當 Adobe Photoshop 将權重平均應用于像素時生成的鐘形曲線。在PS中間,你應該知道所有的顔色不過都是數字,各種模糊不過都是算法。把要模糊的像素色值統計,用數學上權重平均的計算方法(高斯函數)得到色值,對範圍、半徑等進行模糊,大緻就是高斯模糊。

  高斯模糊算法公式[使用正态分布]

iOS實作圖像指定區域模糊
iOS實作圖像指定區域模糊

          二維圖形表示形式

OpenGL ES 算法實作

1.0 / sqrt(2.0 * M_PI * pow(sigma, 2.0))) * exp(-pow(currentGaussianWeightIndex, 2.0) / (2.0 * pow(sigma, 2.0))      

附:GLSL内置指數函數說明圖

iOS實作圖像指定區域模糊

 在GPUImage中我們可以使用GPUImageGaussianBlurFilter來實作高斯模糊。(GPUImageGaussianBlurFilter僅可以全圖模糊,而不能部分模糊)

texelSpacingMultiplier是模糊的強度,數值越大,模糊效果越明顯

blurRadiusInPixels是像素範圍,用于計算平均值。

高斯模糊應用

1 + (UIImage *)applyGaussianBlur:(UIImage *)image
 2 {
 3     GPUImageGaussianBlurFilter *filter = [[GPUImageGaussianBlurFilter alloc] init];
 4 //    filter.texelSpacingMultiplier = 5.0;
 5     filter.blurRadiusInPixels = 1.0;
 6     [filter forceProcessingAtSize:image.size];
 7     GPUImagePicture *pic = [[GPUImagePicture alloc] initWithImage:image];
 8     [pic addTarget:filter];
 9     [pic processImage];
10     [filter useNextFrameForImageCapture];
11     return [filter imageFromCurrentFramebuffer];
12 }      
iOS實作圖像指定區域模糊

  

iOS實作圖像指定區域模糊

GPUImageGaussianSelectiveBlurFilter可以部分模糊,也就是選區外模糊 

excludeCircleRadius用來調整模糊區域

+ (UIImage *)applyGaussianSelectiveBlur:(UIImage *)image

{

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

    //    filter.texelSpacingMultiplier = 5.0;

    filter.excludeCircleRadius = 120 / 320.0;

    [filter forceProcessingAtSize:image.size];

    GPUImagePicture *pic = [[GPUImagePicture alloc] initWithImage:image];

    [pic addTarget:filter];

    [pic processImage];

    [filter useNextFrameForImageCapture];

    return [filter imageFromCurrentFramebuffer];

}

iOS實作圖像指定區域模糊