首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于VCL的德尔菲模糊效应

基于VCL的德尔菲模糊效应
EN

Stack Overflow用户
提问于 2017-09-14 11:29:10
回答 1查看 2.2K关注 0票数 0

我正在实施一个自定义面板模糊效果。我想模拟玻璃效果。我在搜索中找到了以下代码

代码语言:javascript
复制
function blur(source:TBitmap):TBitmap;
var
  x, y, x3:integer;
  tline, mline, bline:PByteArray;

begin

  for y := 1 to source.Height - 2 do
  begin
      tline := source.ScanLine[y-1];
      mline := source.ScanLine[y];
      bline := source.ScanLine[y+1];
      for x := 1 to source.Width - 2 do
      begin
        x3 := x*3;

          mline^[x3] :=
            (mline^[x3 - 3] + mline^[x3 + 3] +
             tline^[x3 - 3] + tline^[x3 + 3] + tline^[x3] +
             mline^[x3 - 3] + mline^[x3 + 3] + mline^[x3]) div 8;

          mline^[x3 + 1] :=
            (mline^[x3 - 2] + mline^[x*3 + 4] +
             tline^[x3 - 2] + tline^[x*3 + 4] + tline^[x3+1] +
             mline^[x3 - 2] + mline^[x*3 + 4] + mline^[x3+1]) div 8;

          mline^[x3 + 2] :=
            (mline^[x3 - 1] + mline^[x3 + 5] +
            tline^[x3 - 1] + tline^[x3 + 5] + tline^[x3+2] +
            mline^[x3 - 1] + mline^[x3 + 5] + mline^[x3+2]) div 8;
      end;
  end;
  result := source;
end;

上面的函数工作得很好,但由于我不是作者,也不了解任何关于图像处理的知识,我会在这个函数中增加设置模糊级别的可能性。

我还找到了以下代码,它可以工作,并且是可配置的,但是,它的应用非常慢。

我找到了一个临时解决方案来“配置”模糊,就是根据您想要的模糊级别调整函数以递归地运行自己。请参阅下面的代码片段:

代码语言:javascript
复制
function blur(source:TBitmap; nTimes: Integer = 1): TBitmap;
var
  x, y, x3, I : integer;
  tline, mline, bline: PByteArray;
begin
  if nTimes = 0 then Exit(source);

  for I := 0 to nTimes do...

的问题是:如何使一个可配置和有效的模糊效果,或谁能帮助我改进上面的功能?

EN

回答 1

Stack Overflow用户

发布于 2017-09-14 16:03:24

此功能不能正确工作,可能是由于复制粘贴中的错误。

模糊是一种卷积。要获得模糊图像中像素的值,必须计算源像素在某些附近的加权和。

代码语言:javascript
复制
Dest[y,x] = Sum(dy=-size/2..size/2, dx=-size/2..size/2) (Src[y+dy, x+dx] * Weight[dy, dx])

在您的情况下,系数(权重)是

代码语言:javascript
复制
  1/8  1/8  1/8      
  1/8  0    1/8   or 1/8 * (1,1,1,1,0,1,1,1,1)
  1/8  1/8  1/8

这不是高斯模糊- 3x3核的系数是1/16 * (1, 2, 1, 2, 4, 2, 1, 2, 1)。注意,中心像素与最大系数有关。

此外,代码不会利用较低的扫描线--每和第三行都应该使用bline

通常,您可以计算和使用任意大小的高斯核(公式依赖于sigma,到处都有描述),但是直接使用大型滤波器的速度很慢。将小高斯滤波器多次应用于同一幅图像,就相当于应用一些较大的滤波器。

对于较大的核大小,有快速(但更复杂)的方法-通过FFT (快速傅里叶变换)快速卷积。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46217910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档