Qt运动(线性)模糊

4

在Qt中,是否有简单的解决方案来为图像添加运动模糊?我没有找到任何关于模糊的好教程。我需要一些非常简单的东西,以便我可以理解,并且如果我能改变模糊角度就更好了。


据我所知,Qt本身没有运动模糊效果。QGraphicsBlurEffect只是一个简单的带有半径的模糊效果。但是,您可以查看此链接(http://http.developer.nvidia.com/GPUGems3/gpugems3_ch27.html),如果您想要图像平面内的均匀模糊,则可以忽略深度部分。也许您可以创建自己的QGraphicsEffect。 - Bart
1个回答

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,否则您必须将颜色除以矩阵条目的总和。
当您想允许α的任意角度(不仅限于90度步骤)时,为给定半径r和角度α构建此矩阵是困难的。[编辑:请参见评论3以轻松生成这样的矩阵。]

如果我没记错的话,这个矩阵是卷积矩阵。我在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度模糊? - Julius Degutis
是的,这将是45度。但是,如果您示例矩阵中的每个x都是相同的(常量)数字,则会产生线性模糊,看起来不自然。为了获得更好的质量,您应该在方形模糊中使用线性函数(http://www.wolframalpha.com/input/?i=1-abs%28x%29+for+-1%3Cx%3C1)。我不知道指数模糊背后的数学原理,但我期望有一个指数函数;)但我认为用于方形模糊的线性函数已经足够了。 - leemes
啊,我忘了说:要生成一个矩阵,你可以稍微作弊一下:只需让Qt在一个小的黑色图像中绘制一条白线((2r+1)*(2r+1)像素)。当然,你应该启用抗锯齿。对于线性函数的事情,你可以之后应用径向渐变模式(外部暗,内部透明)。这会给你完全符合我之前评论中描述的矩阵(像素的灰度值)。;) - leemes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接