Code archives/Graphics/Gaussian Blur
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Yoda. | |||||
;GAUSSIAN BLUR FUNCTION ;by elias_t ;---------------------- ;example Graphics 640,480,32,2 image=LoadImage("frame.png");your image here image=gaussian_blur(image,5,5);[3,5,7,9] DrawImage image,0,0 Flip WaitKey() End ;needed arrays Dim maskData#(0) Dim texel#(0,0,0) Dim result#(0,0,0) ;ww and hh values ;should always be uneven numbers, [3,5,7,9] Function gaussian_blur(input_image,ww,hh) Width=ImageWidth(input_image) Height=ImageHeight(input_image) Dim texel#(Width,Height,2) Dim result#(Width,Height,2) SetBuffer ImageBuffer (input_image) LockBuffer ImageBuffer (input_image) For x=0 To Width-1 For y=0 To Height-1 rgb=ReadPixelFast (x,y,ImageBuffer(input_image)) texel#(x,y,0)=(rgb Shr 16) And $ff; texel#(x,y,1)=(rgb Shr 8) And $ff; texel#(x,y,2)=rgb And $ff; Next Next maskWidth# = ww; maskHeight# = hh; Dim maskData#(maskWidth#*maskHeight#); mult# = 0.0; For ym# = 0 To maskHeight#-1 For xm# = 0 To maskWidth#-1 cx# = xm# - (maskWidth# - 1) / 2.0; cy# = ym# - (maskHeight# - 1) / 2.0; rt# = cx# * cx# + cy# * cy#; mult# =mult#+ Exp(-0.35 * rt#); Next Next mult# = 1.0 / mult#; For ym# = 0 To maskHeight#-1 For xm# = 0 To maskWidth#-1 cx# = xm# - (maskWidth# - 1) / 2.0; cy# = ym# - (maskHeight# - 1) / 2.0; rt# = cx# * cx# + cy# * cy#; maskData#(ym# * maskWidth# + xm#) = mult# * Exp(-0.35 * rt#); Next Next Dim result#(Width,Height,3) For ym# = 0 To Height-1 For xm# = 0 To Width-1 rr#=0.0; gg#=0.0; bb#=0.0; For yy = 0 To maskHeight# -1 For xx = 0 To maskWidth#-1 If (xm + xx - Floor(maskWidth# / 2.0)<0) Or (ym + yy - Floor(maskHeight# / 2)<0) Or (xm + xx - Floor(maskWidth# / 2.0)>Width) Or (ym + yy - Floor(maskHeight# / 2)>Height) rl#=0; gl#=0; bl#=0; Else rl#=texel#(xm + xx - Floor(maskWidth# / 2.0), ym + yy - Floor(maskHeight# / 2),0) gl#=texel#(xm + xx - Floor(maskWidth# / 2.0), ym + yy - Floor(maskHeight# / 2),1) bl#=texel#(xm + xx - Floor(maskWidth# / 2.0), ym + yy - Floor(maskHeight# / 2),2) EndIf rr# =rr#+rl# * maskData#(xx + yy * maskWidth#); gg# =gg#+gl# * maskData#(xx + yy * maskWidth#); bb# =bb#+bl# * maskData#(xx + yy * maskWidth#); Next Next result#(xm#,ym#,0)=rr#; result#(xm#,ym#,1)=gg#; result#(xm#,ym#,2)=bb#; Next Next For x=0 To Width-1 For y=0 To Height-1 WritePixelFast ( x,y,((result#(x,y,0) Shl 16)+(result#(x,y,1) Shl 8)+result#(x,y,2)),ImageBuffer(input_image) ) Next Next UnlockBuffer ImageBuffer(input_image) SetBuffer BackBuffer() Dim maskData#(0) Dim texel#(0,0,0) Dim result#(0,0,0) Return input_image End Function |
Comments
| ||
I don't know if anyone has tried this, but I found it to be extremely slow. More than 16 seconds to perform the blur when not in Debug mode on a 1024x768 image. After looking at the code, I found that some portions (inner loops) were good places to optimize. After the optimizations it only takes about 1 second (1024x768 image) to perform the blur. Included is a default demo screen to see the Gaussian blur in action. To use your own image set the 'blitzVersion' variable to 1 or 2 for BlitzPlus or Blitz3D respectively, otherwise the default image will be displayed. |
| ||
Wow, it was extremely slow before -- nice speedup! |
| ||
I don't remember the exact number but the number of extraneous calculations in the inner loop was in the millions. Yes, it made a big difference in speed. |
Code Archives Forum