[racket] Kernel size for flomap-gaussian-blur
On 05/11/2013 01:56 PM, Dmitry.Cherkassov.dcherkassov at gmail.com wrote:
> Hi. Can't find convolution kernel dimensions in the docs, neither they can be
> specified via arguments.
>
> Any ideas what they are?
A kernel centered at x with standard deviation σ has its minimum at
floor(x-3*σ) and its maximum at ceiling(x+3*σ). (Same for y and its
standard deviation.) So the width (resp. height) is
1 + ceiling(3*σ) - floor(-3*σ)
This can be simplified, but I took it directly from the code and didn't
want to risk getting it wrong. It's in "images/private/flomap-blur.rkt"
if you want to look it up.
If you want more control over convolution, you should use `array-fft'
from `math/array'. To get good performance from that, you'll want to use
Typed Racket, at least for writing image processing functions. Here's a
function that converts arrays to flomaps:
(: array->flomap ((Array Real) -> flomap))
(define (array->flomap arr)
(let ([arr (array->flarray arr)])
(define ds (array-shape arr))
(match ds
[(vector h w) (flomap (flarray-data arr) 1 w h)]
[(vector h w c) (flomap (flarray-data arr) c w h)]
[_ (error
'array->flomap
"expected array with 2 or 3 dimensions; given shape ~e"
ds)])))
The other direction is similarly simple, because `FlArray' and `flomap'
both store data in row-major order.
Neil ⊥