1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 package org.openimaj.image.processing.edges;
31
32 import org.openimaj.image.FImage;
33 import org.openimaj.image.combiner.ImageCombiner;
34
35
36
37
38
39
40 public class NonMaximumSuppressionTangent implements ImageCombiner<FImage, FImage, FImage> {
41
42
43
44
45
46
47
48
49
50
51 public static FImage computeSuppressed(FImage dxImage, FImage dyImage) {
52 return computeSuppressed(dxImage, dyImage, null);
53 }
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 public static FImage computeSuppressed(FImage dxImage, FImage dyImage, FImage magsOut) {
69 final float[][] diffx = dxImage.pixels;
70 final float[][] diffy = dyImage.pixels;
71 final int width = dxImage.width;
72 final int height = dxImage.height;
73
74 final float[][] mag = magsOut == null ? new float[height][width] : magsOut.pixels;
75
76 for (int y = 0; y < height; y++)
77 for (int x = 0; x < width; x++)
78 mag[y][x] = (float) Math.sqrt(diffx[y][x] * diffx[y][x] + diffy[y][x] * diffy[y][x]);
79
80 final FImage outimg = new FImage(width, height);
81 final float[][] output = outimg.pixels;
82
83 for (int y = 1; y < height - 1; y++) {
84 for (int x = 1; x < width - 1; x++) {
85 int dx, dy;
86
87 if (diffx[y][x] > 0)
88 dx = 1;
89 else
90 dx = -1;
91
92 if (diffy[y][x] > 0)
93 dy = -1;
94 else
95 dy = 1;
96
97 float a1, a2, b1, b2, A, B, point, val;
98 if (Math.abs(diffx[y][x]) > Math.abs(diffy[y][x]))
99 {
100 a1 = mag[y][x + dx];
101 a2 = mag[y - dy][x + dx];
102 b1 = mag[y][x - dx];
103 b2 = mag[y + dy][x - dx];
104 A = (Math.abs(diffx[y][x]) - Math.abs(diffy[y][x])) * a1 + Math.abs(diffy[y][x]) * a2;
105 B = (Math.abs(diffx[y][x]) - Math.abs(diffy[y][x])) * b1 + Math.abs(diffy[y][x]) * b2;
106 point = mag[y][x] * Math.abs(diffx[y][x]);
107 if (point >= A && point > B) {
108 val = Math.abs(diffx[y][x]);
109 output[y][x] = val;
110 }
111 else {
112 val = 0;
113 output[y][x] = val;
114 }
115 }
116 else
117 {
118 a1 = mag[y - dy][x];
119 a2 = mag[y - dy][x + dx];
120 b1 = mag[y + dy][x];
121 b2 = mag[y + dy][x - dx];
122 A = (Math.abs(diffy[y][x]) - Math.abs(diffx[y][x])) * a1 + Math.abs(diffx[y][x]) * a2;
123 B = (Math.abs(diffy[y][x]) - Math.abs(diffx[y][x])) * b1 + Math.abs(diffx[y][x]) * b2;
124 point = mag[y][x] * Math.abs(diffy[y][x]);
125 if (point >= A && point > B) {
126 val = Math.abs(diffy[y][x]);
127 output[y][x] = val;
128 }
129 else {
130 val = 0;
131 output[y][x] = val;
132 }
133 }
134 }
135 }
136
137 return outimg;
138 }
139
140
141
142
143
144
145
146
147
148
149
150
151
152 @Override
153 public FImage combine(FImage dxImage, FImage dyImage) {
154 return computeSuppressed(dxImage, dyImage);
155 }
156 }