2013-05-03 41 views
3

我想要使用Brad Larson的GPUImage的GPUImageGaussianSelectiveBlurFilter在不同分辨率的圖像上保持相對恆定的模糊大小。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

我認爲你在做什麼應該如何工作(至少如果你是在線性RGB處理)。我就是這麼解決這個問題的。你看到的方便性很奇怪。我會做一些分析,看看從模糊中出來的內核對於大圖像是否真的是高斯的,或者如果其他事情正在發生。您應該能夠通過一個全黑的圖像,並獲取一個白色像素,然後獲取該程序使用的確切內核。這可能是因爲這個軟件包使用了一個大尺寸不太好的近似值,或者有一些錯誤。 – user1118321 2013-05-03 21:06:46

+0

是啊@ user1118321我明白你的意思,請參閱下面Brad的答案。我不確定如何在GPUImage中實現它,但我發現問題在推動模糊大小。和想法? – kev 2013-05-06 22:20:02

+0

另一種可能性是使用Core圖像[CIGaussianBlur](https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CoreImageFilterReference/Reference/reference.html#//apple_ref/doc/filter/而不是ci/CIGaussianBlur)過濾器。我從來沒有使用GPUImage,所以我不知道自己實現可分離的1D內核有多難,但聽起來並不難。你的模糊有多大?如果半徑不會太大,我們不會感到驚訝,如果他們在你的情況下足夠快地運行。 – user1118321 2013-05-07 01:17:20

回答

1

您在高blurSize設置中看到的那些盒狀僞影是在GPUImage中處理高斯模糊的方式的副產品。爲了確保最佳性能,在我使用的高斯模糊內核中使用固定數量的樣本(9)。模糊分爲水平和垂直通道,僅使用18個紋理讀取操作81個像素區域。

blurSize參數調整樣本間間距。在1.0時,它是一個像素/像素,但更高的值開始導致像素在模糊半徑擴大時被跳過。超過1.5左右,由於模糊內核會跳過較大的像素塊,因此會出現如上所示的僞像。

出於性能原因,我硬編碼了9個樣本,其頂點着色器中的權重和位置已經計算出來。向片段着色器提供預先計算的值可以避免依賴紋理讀取,並且可以使iOS設備的着色器性能提高十倍以上。用可變數量的高斯樣本添加一個for循環可以進一步減緩這種情況。

儘管如此,可能有一種方法可以將模糊概化爲對於一些較小的模糊使用可變數量的預先計算的高斯樣本,然後對於較大的模糊尺寸來說更昂貴的循環。

+0

我理解你在理論上的含義,但是我將如何/在哪裏爲變量樣本實現循環? – kev 2013-05-06 22:18:48

+0

@KevinHarrington - 在片段着色器中。您需要創建一個高斯模糊濾鏡的自定義變體,該濾鏡使用片段着色器來計算可變半徑模糊的高斯權重,然後將這些權重應用於在距中心像素距離增加時讀取的紋理顏色。 – 2013-05-06 23:03:30