1 public class Convolution extends Thread {
5 public Convolution(Image img, int x0, int x1, int y0, int y1) {
17 double[][] kernel = new double[kernelHeight][kernelWidth];
20 double tempinput[][] = img.inputImage;
21 double tempout[][] = img.outputImage;
23 double tinput1[] = tempinput[x0];
24 double tinput2[] = tempinput[x0+1];
25 double tinput3[] = tempinput[x0+2];
26 double tinput4[] = tempinput[x0+3];
27 double tinput5[] = tempinput[x0+4];
28 double tinput6[] = tempinput[x0+5];
29 double tinput7[] = tempinput[x0+6];
30 double tinput8[] = tempinput[x0+7];
31 double tinput9[] = tempinput[x0+8];
32 double tinput10[] = tempinput[x0+9];
33 double tinput0[] = tinput1;
36 for(int i=x0;i<x1;i++,l++){
37 double tout[] = tempout[i];
38 tinput0 = tinput1; tinput1=tinput2; tinput2=tinput3; tinput3=tinput4; tinput4=tinput5;
39 tinput5 = tinput6; tinput6=tinput7; tinput7=tinput8; tinput8=tinput9; tinput9=tinput10; tinput10=tempinput[l];
40 for(int j=y0;j<y1;++j){
42 for(int b=0;b<kernelHeight;++b) {
43 s+=(tinput0[j+b] * kernel[0][b] + tinput1[j+b] * kernel[1][b] + tinput2[j+b]*kernel[2][b] +
44 tinput3[j+b]*kernel[3][b] + tinput4[j+b]*kernel[4][b] + tinput5[j+b]*kernel[5][b]+
45 tinput6[j+b]*kernel[6][b] + tinput7[j+b]*kernel[7][b] + tinput8[j+b]*kernel[8][b]+
46 tinput9[j+b]*kernel[9][b] + tinput10[j+b]*kernel[10][b]);
53 public static void main(String[] args) {
56 int kernelHeight=11, kernelWidth=11;
59 NUM_THREADS = Integer.parseInt(args[0]);
61 SIZE = Integer.parseInt(args[1]);
69 img = new Image(SIZE,SIZE,kernelHeight,kernelWidth);
71 conv = new Convolution[NUM_THREADS];
72 int increment=SIZE/NUM_THREADS;
74 for(int i = 0; i<NUM_THREADS; i++) {
75 if((i+1)==NUM_THREADS)
76 conv[i] = new Convolution(img, base, SIZE, 0, SIZE);
78 conv[i] = new Convolution(img, base, base+increment, 0, SIZE);
83 System.printString("img.outputImage[10][20] = " +(int) img.outputImage[10][20] + "\n");
84 System.printString("img.outputImage[256][890] = " +(int) img.outputImage[256][890] + "\n");
87 System.printString("Convolution: Size=");
88 System.printInt(SIZE);
89 System.printString("\n");
91 for(int i = 0; i <NUM_THREADS; i++) {
97 System.printString("img.outputImage[10][20] = " +(int) img.outputImage[10][20] + "\n");
98 System.printString("img.outputImage[256][890] = " +(int) img.outputImage[256][890] + "\n");
100 System.printString("2DConv Done!\n");
103 //define 11X11 Gaussian kernel
104 public static void initKernel11(double[][] kernel) {
105 kernel[0][0] = 1/256.0;
106 kernel[0][1] = 4/256.0;
107 kernel[0][2] = 6/256.0;
108 kernel[0][3] = 8/256.0;
109 kernel[0][4] = 10/256.0;
110 kernel[0][5] = 12/256.0;
111 kernel[0][6] = 10/256.0;
112 kernel[0][7] = 8/256.0;
113 kernel[0][8] = 6/256.0;
114 kernel[0][9] = 4/256.0;
115 kernel[0][10] = 1/256.0;
117 kernel[1][0] = 4/256.0;
118 kernel[1][1] = 16/256.0;
119 kernel[1][2] = 24/256.0;
120 kernel[1][3] = 32/256.0;
121 kernel[1][4] = 40/256.0;
122 kernel[1][5] = 48/256.0;
123 kernel[1][6] = 40/256.0;
124 kernel[1][7] = 32/256.0;
125 kernel[1][8] = 24/256.0;
126 kernel[1][9] = 8/256.0;
127 kernel[1][10] = 4/256.0;
129 kernel[2][0] = 6/256.0;
130 kernel[2][1] = 24/256.0;
131 kernel[2][2] = 36/256.0;
132 kernel[2][3] = 48/256.0;
133 kernel[2][4] = 60/256.0;
134 kernel[2][5] = 72/256.0;
135 kernel[2][6] = 60/256.0;
136 kernel[2][7] = 48/256.0;
137 kernel[2][8] = 36/256.0;
138 kernel[2][9] = 24/256.0;
139 kernel[2][10] = 6/256.0;
141 kernel[3][0] = 8/256.0;
142 kernel[3][1] = 32/256.0;
143 kernel[3][2] = 48/256.0;
144 kernel[3][3] = 64/256.0;
145 kernel[3][4] = 80/256.0;
146 kernel[3][5] = 96/256.0;
147 kernel[3][6] = 80/256.0;
148 kernel[3][7] = 64/256.0;
149 kernel[3][8] = 48/256.0;
150 kernel[3][9] = 32/256.0;
151 kernel[3][10] = 8/256.0;
153 kernel[4][0] = 10/256.0;
154 kernel[4][1] = 40/256.0;
155 kernel[4][2] = 60/256.0;
156 kernel[4][3] = 80/256.0;
157 kernel[4][4] = 100/256.0;
158 kernel[4][5] = 120/256.0;
159 kernel[4][6] = 100/256.0;
160 kernel[4][7] = 80/256.0;
161 kernel[4][8] = 60/256.0;
162 kernel[4][9] = 40/256.0;
163 kernel[4][10] = 10/256.0;
165 kernel[5][0] = 12/256.0;
166 kernel[5][1] = 48/256.0;
167 kernel[5][2] = 72/256.0;
168 kernel[5][3] = 96/256.0;
169 kernel[5][4] = 120/256.0;
170 kernel[5][5] = 144/256.0;
171 kernel[5][6] = 120/256.0;
172 kernel[5][7] = 96/256.0;
173 kernel[5][8] = 72/256.0;
174 kernel[5][9] = 48/256.0;
175 kernel[5][10] = 12/256.0;
177 kernel[6][0] = 10/256.0;
178 kernel[6][1] = 40/256.0;
179 kernel[6][2] = 60/256.0;
180 kernel[6][3] = 80/256.0;
181 kernel[6][4] = 100/256.0;
182 kernel[6][5] = 120/256.0;
183 kernel[6][6] = 100/256.0;
184 kernel[6][7] = 80/256.0;
185 kernel[6][8] = 60/256.0;
186 kernel[6][9] = 40/256.0;
187 kernel[6][10] = 10/256.0;
189 kernel[7][0] = 8/256.0;
190 kernel[7][1] = 32/256.0;
191 kernel[7][2] = 48/256.0;
192 kernel[7][3] = 64/256.0;
193 kernel[7][4] = 80/256.0;
194 kernel[7][5] = 96/256.0;
195 kernel[7][6] = 80/256.0;
196 kernel[7][7] = 64/256.0;
197 kernel[7][8] = 48/256.0;
198 kernel[7][9] = 32/256.0;
199 kernel[7][10] = 8/256.0;
201 kernel[8][0] = 6/256.0;
202 kernel[8][1] = 24/256.0;
203 kernel[8][2] = 36/256.0;
204 kernel[8][3] = 48/256.0;
205 kernel[8][4] = 60/256.0;
206 kernel[8][5] = 72/256.0;
207 kernel[8][6] = 60/256.0;
208 kernel[8][7] = 48/256.0;
209 kernel[8][8] = 36/256.0;
210 kernel[8][9] = 24/256.0;
211 kernel[8][10] = 6/256.0;
213 kernel[9][0] = 4/256.0;
214 kernel[9][1] = 8/256.0;
215 kernel[9][2] = 24/256.0;
216 kernel[9][3] = 32/256.0;
217 kernel[9][4] = 40/256.0;
218 kernel[9][5] = 48/256.0;
219 kernel[9][6] = 40/256.0;
220 kernel[9][7] = 32/256.0;
221 kernel[9][8] = 24/256.0;
222 kernel[9][9] = 8/256.0;
223 kernel[9][10] = 4/256.0;
225 kernel[10][0] = 1/256.0;
226 kernel[10][1] = 4/256.0;
227 kernel[10][2] = 6/256.0;
228 kernel[10][3] = 8/256.0;
229 kernel[10][4] = 10/256.0;
230 kernel[10][5] = 12/256.0;
231 kernel[10][6] = 10/256.0;
232 kernel[10][7] = 8/256.0;
233 kernel[10][8] = 6/256.0;
234 kernel[10][9] = 4/256.0;
235 kernel[10][10] = 1/256.0;
241 int kernelWidth, kernelHeight;
242 double[][] inputImage;
243 double[][] outputImage;
245 public Image(int width, int height, int kernelWidth, int kernelHeight) {
247 this.height = height;
248 this.kernelWidth = kernelWidth;
249 this.kernelHeight = kernelHeight;
250 inputImage = new double[height+kernelHeight-1][width+kernelWidth-1];
251 outputImage = new double[height][width];
254 /* Create a valid image */
255 public void setValues() {
256 for (int i = 0; i < (height+kernelHeight - 1); i++) {
257 double ainput[] = inputImage[i];
258 for(int j = 0; j < (width+kernelWidth - 1); j++) {
263 for (int i = 0; i < height; i++){
264 double aout[] = outputImage[i];
265 for(int j = 0; j < width; j++) {