Skip to content

Commit 4acafe2

Browse files
Adds gaussian blur utility
1 parent 92320fd commit 4acafe2

1 file changed

Lines changed: 35 additions & 0 deletions

File tree

src/utils/Image.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,41 @@
66
*/
77
tracking.Image = {};
88

9+
/**
10+
* Computes gaussian blur. Adpated from
11+
* https://github.com/kig/canvasfilters.
12+
* @param {pixels} pixels The pixels in a linear [r,g,b,a,...] array.
13+
* @param {number} width The image width.
14+
* @param {number} height The image height.
15+
* @param {number} diameter Gaussian blur diameter, must be greater than 1.
16+
* @return {array} The edge pixels in a linear [r,g,b,a,...] array.
17+
*/
18+
tracking.Image.blur = function(pixels, width, height, diameter) {
19+
diameter = Math.abs(diameter);
20+
if (diameter <= 1) {
21+
throw new Error('Diameter should be greater than 1.');
22+
}
23+
var radius = diameter / 2;
24+
var len = Math.ceil(diameter) + (1 - (Math.ceil(diameter) % 2));
25+
var weights = new Float32Array(len);
26+
var rho = (radius + 0.5) / 3;
27+
var rhoSq = rho * rho;
28+
var gaussianFactor = 1 / Math.sqrt(2 * Math.PI * rhoSq);
29+
var rhoFactor = -1 / (2 * rho * rho);
30+
var wsum = 0;
31+
var middle = Math.floor(len / 2);
32+
for (var i = 0; i < len; i++) {
33+
var x = i - middle;
34+
var gx = gaussianFactor * Math.exp(x * x * rhoFactor);
35+
weights[i] = gx;
36+
wsum += gx;
37+
}
38+
for (var j = 0; j < weights.length; j++) {
39+
weights[j] /= wsum;
40+
}
41+
return this.separableConvolve(pixels, width, height, weights, weights, false);
42+
};
43+
944
/**
1045
* Computes the integral image for summed, squared, rotated and sobel pixels.
1146
* @param {array} pixels The pixels in a linear [r,g,b,a,...] array to loop

0 commit comments

Comments
 (0)