我正在实施一个自定义面板模糊效果。我想模拟玻璃效果。我在搜索中找到了以下代码:
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;上面的函数工作得很好,但由于我不是作者,也不了解任何关于图像处理的知识,我会在这个函数中增加设置模糊级别的可能性。
我还找到了以下代码,它可以工作,并且是可配置的,但是,它的应用非常慢。
我找到了一个临时解决方案来“配置”模糊,就是根据您想要的模糊级别调整函数以递归地运行自己。请参阅下面的代码片段:
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...的问题是:如何使一个可配置和有效的模糊效果,或谁能帮助我改进上面的功能?
发布于 2017-09-14 16:03:24
此功能不能正确工作,可能是由于复制粘贴中的错误。
模糊是一种卷积。要获得模糊图像中像素的值,必须计算源像素在某些附近的加权和。
Dest[y,x] = Sum(dy=-size/2..size/2, dx=-size/2..size/2) (Src[y+dy, x+dx] * Weight[dy, dx])在您的情况下,系数(权重)是
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 (快速傅里叶变换)快速卷积。
https://stackoverflow.com/questions/46217910
复制相似问题