【问题标题】:Qt motion (linear) blurQt 运动(线性)模糊
【发布时间】:2012-05-27 08:11:51
【问题描述】:

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

【问题讨论】:

  • Qt 本身没有运动模糊效果 AFAIK。 QGraphicsBlurEffect 是一个带半径的简单模糊。但是,您可以查看this link,如果您想要在图像平面内均匀模糊,请忽略深度部分。也许你可以创建自己的 QGraphicsEffect。

标签: qt blur motion-blur


【解决方案1】:

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 以轻松生成此类矩阵。]

【讨论】:

  • 如果我记得很清楚,这个矩阵是卷积矩阵。在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 度模糊?
  • 是的,这将是 45 度。但是,如果您的示例矩阵中的每个 x 都是相同的(常数)数字,那么它将是一个线性模糊,看起来不自然。为了获得更好的质量,您应该对方形模糊使用线性函数 (wolframalpha.com/input/?i=1-abs%28x%29+for+-1%3Cx%3C1)。我不知道指数模糊背后的数学原理,但我期望指数函数;)但我认为平方模糊的线性函数就足够了。
  • 啊,我忘了说:要生成一个矩阵,你可以骗一点:让Qt在一个黑色的小图像中画一条白线((2r+1)*(2r+1)像素)。当然,您应该启用抗锯齿。对于线性函数,您可以在之后应用径向渐变图案(外部为深色,内部为透明)。这为您提供了我之前评论中描述的矩阵(像素的灰度值)。 ;)
猜你喜欢
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 2015-03-24
相关资源
最近更新 更多