2012-05-20 44 views
4

是否有簡單的解決方案將運動模糊添加到Qt中的圖像?還沒有找到任何有關模糊的好教程。我需要一些非常簡單的東西,我可以理解,並且如果我能夠改變模糊角度,那將會非常好。Qt運動(線性)模糊

+0

Qt本身沒有運動模糊效果AFAIK。 QGraphicsBlurEffect是一個簡單的半徑模糊。然而,你可以看看[這個鏈接](http://http.developer.nvidia.com/GPUGems3/gpugems3_ch27.html),如果你想要在圖像平面內均勻模糊,忽略深度部分。也許你可以創建自己的QGraphicsEffect。 – Bart

回答

2

Qt沒有運動模糊濾鏡。我看了一下QGraphicsBlurEffect的代碼;它使用QPixmapBlurEffect,它本身使用稱爲expblur(指數模糊)的內部幫助器方法。

expblur本身使用一次模糊效果(X方向上的運動模糊,方法qt_blurrow)兩次。它將兩個模糊之間的圖像旋轉90度,然後將其旋轉回來。

所以實際上,Qt 運動模糊效果,但這只是內部的。所以你需要寫出自己的效果。爲此,請查看qt_blurrrow的代碼,您可以在Qt源文件中找到src/gui/qpixmapfilter.cpp。這會爲濾鏡提供很好的質量,因爲它是一個指數模糊濾鏡,而不是線性模糊濾鏡。

如果你不想去,從而深入到了Qt源代碼,藉此僞代碼作爲開始:

foreach pixel (x, y) in image { 
    for dx = -r to r with x+dx within image { 
     for dy = -r to r with y+dy within image { 
      Add pixel (x+dx, y+dy) of the source image with ↩ 
      factor (matrix[dx, dy]) to the target image. 
     } 
    } 
} 

其中矩陣可以這樣來定義(用於水平運動模糊半徑2):

0 0 0 0 0 
0 0 0 0 0 
0.1 0.2 0.4 0.2 0.1 
0 0 0 0 0 
0 0 0 0 0 

注意,所有條目的總和必須是1,或者具有由矩陣條目的總和來劃分顏色。

對於給定的半徑r和角度α,建立這個矩陣當你想允許任意角度α(不僅是90度步長)時很困難。 [編輯:請參閱評論3爲這種矩陣的簡單生成。]

+0

如果我還記得,這個矩陣是一個卷積矩陣。在java上使用它,然後我需要所有角度的模糊,然後我拒絕它作爲一種可能性。但找不到更好的東西。 但是,這個矩陣我可以得到比90步更多的角度。例如,使45個步驟的角度,只是差異矩陣成員將不是零?例如 'x 0 0 0 0 0 x 0 0 0 0 0 x 0 0 0 0 0 x 0 0 0 0 0 x' 我是對嗎? 45度模糊? –

+0

是的,這將是45度。但是,如果您的示例矩陣中的每個x都是相同(常數)的數字,則它將是線性模糊,看起來不自然。爲了獲得更好的質量,您應該對方形模糊使用線性函數(http://www.wolframalpha.com/input/?i=1-abs%28x%29+for+-1%3Cx%3C1)。我不知道指數模糊背後的數學問題,但我期待指數函數;)但我認爲方形模糊的線性函數就足夠了。 – leemes

+0

嗯,我忘了說:爲了生成一個矩陣,你可以作弊一點:讓Qt在一個小的黑色圖像((2r + 1)*(2r + 1)像素)中畫一條白線。當然,你應該啓用抗鋸齒。對於線性函數,您可以在之後應用徑向漸變模式(外部爲黑色,內部爲透明)。這就給了你我之前評論中描述的矩陣(像素的灰度值)。 ;) – leemes