GPUImage:在多个图像大小上规范化GPUImageGaussianSelectiveBlurFilter的模糊大小

时间:2013-05-03 19:13:25

标签: ios opengl-es gpuimage

我希望使用Brad Larson的GPUImage的GPUImageGaussianSelectiveBlurFilter在不同分辨率的图像上保持相对恒定的模糊大小。

假设我有两个尺寸为1000x1000和2000x2000的图像,我希望2000x2000的模糊显示与1000x1000相同的尺寸。所以我在1000x1000上将模糊大小设置为1.0,在2000x2000上将模糊大小设置为2.0。我希望的模糊通常要求较大图像上的模糊大小远远高于1.0。

((GPUImageGaussianSelectiveBlurFilter *)self._selectiveFocusFilterSmall).blurSize = 1.0;
((GPUImageGaussianSelectiveBlurFilter *)self._selectiveFocusFilterLarge).blurSize = 2.0;

然后我强制处理大小。如果没有这个,模糊将不会被标准化:

[self._selectiveFocusFilterSmall forceProcessingAtSize:CGSizeMake(1000, 1000)];
[self._selectiveFocusFilterLarge forceProcessingAtSize:CGSizeMake(2000, 2000)];

小:

small http://www.kevinharringtonphoto.com/photos/i-WM76ghx/0/M/i-WM76ghx-M.png

large http://www.kevinharringtonphoto.com/photos/i-qWfcCxm/0/M/i-qWfcCxm-M.png

近距离接近:

close http://www.kevinharringtonphoto.com/photos/i-w98SCLn/0/M/i-w98SCLn-M.png

如何在保持模糊大小的同时摆脱较大模糊图像中的拳击?我很想知道是否有更好的方法来使用GPUImage标准化多个图像的模糊大小。

1 个答案:

答案 0 :(得分:1)

您在高blurSize设置中看到的那些类似于盒子的工件是在GPUImage中处理高斯模糊的方式的副产品。为了确保最佳性能,在我使用的高斯模糊内核中使用固定数量的样本(9)。模糊被分为水平和垂直通道,仅使用18个纹理读取在81像素区域上操作。

blurSize参数调整样本间间距。在1.0时,它是一个像素/纹素,但是随着模糊半径的扩大,更高的值开始导致像素被跳过。超过1.5左右,由于模糊内核跳过较大的像素块,因此上面看到的伪像开始出现。

出于性能原因,我已经硬编码了9个样本,其权重和位置在顶点着色器中计算。向片段着色器提供预先计算的值可避免依赖纹理读取,并可使iOS设备上的着色器性能提高十倍以上。添加一个带有可变数量的高斯样本的for循环会进一步降低速度。

尽管如此,可能还有一种方法可以推广模糊,以便为一些较小的模糊使用可变数量的预先计算的高斯样本,然后对于较大的模糊大小,使用更昂贵的for循环。