|
6 | 6 | */ |
7 | 7 | tracking.Image = {}; |
8 | 8 |
|
| 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 | + |
9 | 44 | /** |
10 | 45 | * Computes the integral image for summed, squared, rotated and sobel pixels. |
11 | 46 | * @param {array} pixels The pixels in a linear [r,g,b,a,...] array to loop |
|
0 commit comments