2012-05-20 50 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