Qt运动(线性)模糊

是否有简单的解决方案在Qt中为图像添加运动模糊?没有找到任何关于模糊的好教程.我需要一些非常简单的东西,我能理解,如果我能改变模糊角度,我会非常好. 最佳答案 Qt没有运动模糊滤镜.我查看了QGraphicsBlurEffect的代码;它使用QPixmapBlurEffect,它本身使用一个名为expblur的内部辅助方法(指数模糊).

expblur本身使用一维模糊效果(X方向的运动模糊,方法qt_blurrow)两次.它将两个模糊之间的图像旋转90度,然后将其旋转回来.

实际上,Qt具有运动模糊效果,但这只是内部效果.所以你需要写自己的效果.为此,请查看qt_blurrrow的代码,您可以在src / gui / qpixmapfilter.cpp的Qt源代码中找到它.这将为滤镜提供良好的质量,因为它是指数模糊滤镜而不是线性滤镜.

如果您不想深入了解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,以便轻松生成此类矩阵.]

点赞