我希望使用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标准化多个图像的模糊大小。
答案 0 :(得分:1)
您在高blurSize
设置中看到的那些类似于盒子的工件是在GPUImage中处理高斯模糊的方式的副产品。为了确保最佳性能,在我使用的高斯模糊内核中使用固定数量的样本(9)。模糊被分为水平和垂直通道,仅使用18个纹理读取在81像素区域上操作。
blurSize
参数调整样本间间距。在1.0时,它是一个像素/纹素,但是随着模糊半径的扩大,更高的值开始导致像素被跳过。超过1.5左右,由于模糊内核跳过较大的像素块,因此上面看到的伪像开始出现。
出于性能原因,我已经硬编码了9个样本,其权重和位置在顶点着色器中计算。向片段着色器提供预先计算的值可避免依赖纹理读取,并可使iOS设备上的着色器性能提高十倍以上。添加一个带有可变数量的高斯样本的for循环会进一步降低速度。
尽管如此,可能还有一种方法可以推广模糊,以便为一些较小的模糊使用可变数量的预先计算的高斯样本,然后对于较大的模糊大小,使用更昂贵的for循环。