|
1 load(libdir + "util.js"); |
|
2 |
|
3 var SobelX = [[-1.0, 0.0, 1.0], |
|
4 [-2.0, 0.0, 2.0], |
|
5 [-1.0, 0.0, 1.0]]; |
|
6 var SobelY = [[ 1.0, 2.0, 1.0], |
|
7 [ 0.0, 0.0, 0.0], |
|
8 [-1.0, -2.0, -1.0]]; |
|
9 |
|
10 function stripedImage(w, h) { |
|
11 var resultArray = new Array(w * h); |
|
12 for (var y = 0; y < h; y++) { |
|
13 for (var x = 0; x < w; x++) { |
|
14 resultArray[y*w + x] = (Math.abs(x%100-y%100) < 10) ? 32 : 0; |
|
15 } |
|
16 } |
|
17 return resultArray; |
|
18 } |
|
19 |
|
20 function edgesSequentially(data, width, height) { |
|
21 var data1 = new Array(width * height); |
|
22 for (var y = 0; y < height; y++) { |
|
23 for (var x = 0; x < width; x++) { |
|
24 var total = compute(x, y); |
|
25 data1[y*width + x] = total | 0; |
|
26 } |
|
27 } |
|
28 return data1; |
|
29 |
|
30 function compute(x, y) { |
|
31 var totalX = 0; |
|
32 var totalY = 0; |
|
33 |
|
34 var offYMin = (y == 0 ? 0 : -1); |
|
35 var offYMax = (y == height - 1 ? 0 : 1); |
|
36 var offXMin = (x == 0 ? 0 : -1); |
|
37 var offXMax = (x == width - 1 ? 0 : 1); |
|
38 |
|
39 for (var offY = offYMin; offY <= offYMax; offY++) { |
|
40 for (var offX = offXMin; offX <= offXMax; offX++) { |
|
41 var e = data[(y + offY) * width + x + offX]; |
|
42 totalX += e * SobelX[offY + 1][offX + 1]; |
|
43 totalY += e * SobelY[offY + 1][offX + 1]; |
|
44 } |
|
45 } |
|
46 |
|
47 return (Math.abs(totalX) + Math.abs(totalY))/8.0 | 0; |
|
48 } |
|
49 } |
|
50 |
|
51 function edgesParallel(data) { |
|
52 var pa = new ParallelArray([Height, Width], function (y, x) { |
|
53 var totalX = 0; |
|
54 var totalY = 0; |
|
55 |
|
56 var offYMin = (y == 0 ? 0 : -1); |
|
57 var offYMax = (y == Height - 1 ? 0 : 1); |
|
58 var offXMin = (x == 0 ? 0 : -1); |
|
59 var offXMax = (x == Width - 1 ? 0 : 1); |
|
60 |
|
61 for (var offY = offYMin; offY <= offYMax; offY++) { |
|
62 for (var offX = offXMin; offX <= offXMax; offX++) { |
|
63 var e = data.get(y + offY, x + offX); |
|
64 totalX += e * SobelX[offY + 1][offX + 1]; |
|
65 totalY += e * SobelY[offY + 1][offX + 1]; |
|
66 } |
|
67 } |
|
68 |
|
69 return (Math.abs(totalX) + Math.abs(totalY))/8.0 | 0; |
|
70 }); |
|
71 return pa.flatten(); |
|
72 } |
|
73 |
|
74 var Width = 1024; |
|
75 var Height = 768; |
|
76 var ArrInput = stripedImage(Width, Height); |
|
77 var ParArrInput2D = new ParallelArray([Height, Width], |
|
78 function (y, x) ArrInput[y*Width + x]); |
|
79 |
|
80 benchmark("EDGES", 2, DEFAULT_MEASURE * 20, |
|
81 function() edgesSequentially(ArrInput, Width, Height), |
|
82 function() edgesParallel(ParArrInput2D)); |