3

我想使用 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)];

小的:

小的
(来源:kevinharringtonphoto.com

大的:

大的
(来源:kevinharringtonphoto.com

大特写:

关
(来源:kevinharringtonphoto.com

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

4

1 回答 1

1

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

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

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

不过,可能有一种方法可以对模糊进行概括,以使用可变数量的预先计算的高斯样本来处理一些较小的模糊,然后对于较大的模糊尺寸使用更昂贵的循环。

于 2013-05-06T19:47:29.490 回答