summaryrefslogtreecommitdiffstats
path: root/SD-VBS/benchmarks/texture_synthesis/src/c
diff options
context:
space:
mode:
authorLeo Chan <leochanj@live.unc.edu>2020-10-22 01:53:21 -0400
committerJoshua Bakita <jbakita@cs.unc.edu>2020-10-22 01:56:35 -0400
commitd17b33131c14864bd1eae275f49a3f148e21cf29 (patch)
tree0d8f77922e8d193cb0f6edab83018f057aad64a0 /SD-VBS/benchmarks/texture_synthesis/src/c
parent601ed25a4c5b66cb75315832c15613a727db2c26 (diff)
Squashed commit of the sb-vbs branch.
Includes the SD-VBS benchmarks modified to: - Use libextra to loop as realtime jobs - Preallocate memory before starting their main computation - Accept input via stdin instead of via argc Does not include the SD-VBS matlab code. Fixes libextra execution in LITMUS^RT.
Diffstat (limited to 'SD-VBS/benchmarks/texture_synthesis/src/c')
-rw-r--r--SD-VBS/benchmarks/texture_synthesis/src/c/script_texture_synthesis.c197
-rw-r--r--SD-VBS/benchmarks/texture_synthesis/src/c/texture.c396
-rw-r--r--SD-VBS/benchmarks/texture_synthesis/src/c/texture.h48
3 files changed, 641 insertions, 0 deletions
diff --git a/SD-VBS/benchmarks/texture_synthesis/src/c/script_texture_synthesis.c b/SD-VBS/benchmarks/texture_synthesis/src/c/script_texture_synthesis.c
new file mode 100644
index 0000000..01ddefd
--- /dev/null
+++ b/SD-VBS/benchmarks/texture_synthesis/src/c/script_texture_synthesis.c
@@ -0,0 +1,197 @@
1/********************************
2Author: Sravanthi Kota Venkata
3********************************/
4
5#include "texture.h"
6#include <malloc.h>
7#include "extra.h"
8#define TEXTURE_MEM 1<<28
9int WIDTHin,HEIGHTin;
10F2D *target, *result;
11int WIDTH,HEIGHT;
12int localx, localy,targetin=0;
13int *atlas;
14int *xloopin, *yloopin;
15int *xloopout, *yloopout;
16
17int main(int argc, char **argv)
18{
19 SET_UP
20 mallopt(M_TOP_PAD, TEXTURE_MEM);
21 mallopt(M_MMAP_MAX, 0);
22 params* data;
23 I2D *im;
24 F2D* image;
25 data = malloc(sizeof(params));
26 im = parse_flags(argc, argv);
27 image = fiDeepCopy(im);
28 init_params(data);
29
30 printf("start.\n");
31 for_each_job{
32 create_texture(image, data);
33 }
34 printf("end..\n");
35#ifdef CHECK
36{
37 int ret=0;
38#ifdef GENERATE_OUTPUT
39 fWriteMatrix(result, argv[1]);
40#endif
41 ret = fSelfCheck(result, "expected_C.txt", 1.0);
42 if(ret < 0)
43 printf("Error in Texture Synthesis\n");
44}
45#endif
46 iFreeHandle(im);
47 fFreeHandle(image);
48 free(data);
49 fFreeHandle(target);
50 fFreeHandle(result);
51 free(atlas);
52 WRITE_TO_FILE
53 return 0;
54}
55
56I2D* parse_flags(int argc, char ** argv)
57{
58 int i, tsx,tsy;
59 I2D* image;
60 char fileNm[256];
61
62 printf("Input image: ");
63 scanf("%s", fileNm);
64 image = readImage(fileNm);
65 WIDTHin = image->width;
66 HEIGHTin = image->height;
67
68 localx = 3;
69 localy = 3;
70
71#ifdef test
72 WIDTH = WIDTHin*2;
73 HEIGHT = HEIGHTin*2;
74 localx = 2;
75 localy = 2;
76#endif
77#ifdef sim_fast
78 WIDTH = WIDTHin*2;
79 HEIGHT = HEIGHTin*2;
80 localx = 3;
81 localy = 3;
82#endif
83#ifdef sim
84 WIDTH = WIDTHin*3;
85 HEIGHT = HEIGHTin*3;
86 localx = 2;
87 localy = 2;
88#endif
89#ifdef sqcif
90 WIDTH = WIDTHin*6;
91 HEIGHT = HEIGHTin*6;
92 localx = 2;
93 localy = 2;
94#endif
95#ifdef qcif
96 WIDTH = WIDTHin*10;
97 HEIGHT = HEIGHTin*10;
98 localx = 2;
99 localy = 2;
100#endif
101#ifdef cif
102 WIDTH = WIDTHin*10;
103 HEIGHT = HEIGHTin*10;
104 localx = 3;
105 localy = 3;
106#endif
107#ifdef vga
108 WIDTH = WIDTHin*20;
109 HEIGHT = HEIGHTin*20;
110 localx = 3;
111 localy = 3;
112#endif
113#ifdef fullhd
114 WIDTH = WIDTHin*20;
115 HEIGHT = HEIGHTin*20;
116 localx = 15;
117 localy = 15;
118#endif
119#ifdef wuxga
120 WIDTH = WIDTHin*20;
121 HEIGHT = HEIGHTin*20;
122 localx = 5;
123 localy = 5;
124#endif
125 printf("Input size\t\t- (%dx%d)\n", HEIGHTin, WIDTHin);
126
127// xloopin = malloc(2*WIDTHin*sizeof(int));
128// yloopin = malloc(2*HEIGHTin*sizeof(int));
129//
130// for(i=-WIDTHin/2;i<WIDTHin+WIDTHin/2;i++)
131// {
132// arrayref(xloopin,i+WIDTHin/2) = (WIDTHin+i)%WIDTHin;
133// }
134//
135// for(i=-HEIGHTin/2;i<HEIGHTin+HEIGHTin/2;i++)
136// {
137// arrayref(yloopin,i+HEIGHTin/2) = (HEIGHTin+i)%HEIGHTin;
138// }
139// xloopin += WIDTHin/2; yloopin += HEIGHTin/2;
140
141 result = fMallocHandle(1,HEIGHT*WIDTH);
142 target = fMallocHandle(1, WIDTH*HEIGHT);
143
144 atlas = malloc(2*WIDTH*HEIGHT*sizeof(int));
145 xloopout = malloc(2*WIDTH*sizeof(int));
146 yloopout = malloc(2*HEIGHT*sizeof(int));
147
148 for(i=-WIDTH/2;i<WIDTH+WIDTH/2;i++)
149 {
150 arrayref(xloopout,i+WIDTH/2) = (WIDTH+i)%WIDTH;
151 }
152 for(i=-HEIGHT/2;i<HEIGHT+HEIGHT/2;i++)
153 {
154 arrayref(yloopout,i+HEIGHT/2) = (HEIGHT+i)%HEIGHT;
155 }
156 xloopout += WIDTH/2; yloopout += HEIGHT/2;
157
158 if (result == NULL)
159 {
160 printf("Can't allocate %dx%d image. Exiting.\n",WIDTH,HEIGHT);
161 exit(1);
162 }
163
164 return image;
165}
166
167void init_params(params *data)
168{
169 int i,j;
170 data->localx = localx; data->localy = localy;
171 data->widthin = WIDTHin; data->widthout = WIDTH;
172 data->heightin = HEIGHTin; data->heightout = HEIGHT;
173
174
175 if(!targetin)
176 {
177 for(i=0;i<data->heightout;i++)
178 {
179 for(j=0;j<data->widthout;j++)
180 {
181 asubsref(target,a(j,i,data->widthout)+R) = 1.0;
182// asubsref(target,a(j,i,data->widthout)+G) = 1.0;
183// asubsref(target,a(j,i,data->widthout)+B) = 1.0;
184 }
185 }
186 }
187
188 for(i=0;i<data->heightout;i++)
189 {
190 for(j=0;j<data->widthout;j++)
191 {
192 asubsref(result,a(j,i,data->widthout)+R) = 1.0;
193// asubsref(result,a(j,i,data->widthout)+G) = 1.0;
194// asubsref(result,a(j,i,data->widthout)+B) = 1.0;
195 }
196 }
197}
diff --git a/SD-VBS/benchmarks/texture_synthesis/src/c/texture.c b/SD-VBS/benchmarks/texture_synthesis/src/c/texture.c
new file mode 100644
index 0000000..fb0f1ae
--- /dev/null
+++ b/SD-VBS/benchmarks/texture_synthesis/src/c/texture.c
@@ -0,0 +1,396 @@
1/********************************
2Author: Sravanthi Kota Venkata
3********************************/
4
5#include "texture.h"
6#include <math.h>
7
8int vrstartx, vrfinishx, vrstarty, vrfinishy;
9extern params data;
10int* candlistx, *candlisty;
11int *atlas;
12int anotherpass=0,maxcand = 40;
13F2D *target, *result;
14int *xloopout, *yloopout;
15int *xloopin, *yloopin;
16
17double compare_rest(F2D *image,int x, int y, F2D *tar,int x1, int y1, params* data);
18
19/*********************************
20This is the main texture synthesis function. Called just once
21from main to generate image from 'image' into 'result'.
22Synthesis parameters (image and neighborhood sizes) are in global
23'data-> structure.
24*********************************/
25
26//void create_texture(F2D *image, F2D *result, params *data)
27void create_texture(F2D *image, params *data)
28{
29
30 int i,j,k, ncand, bestx,besty;
31 double diff,curdiff;
32 int tsx,tsy;
33 srand48(1);
34 candlistx = (int*)malloc(sizeof(int)*(data->localx*(data->localy+1)+1));
35 candlisty = (int*)malloc(sizeof(int)*(data->localx*(data->localy+1)+1));
36// if(!anotherpass) init(result, image,data);
37 if(!anotherpass) init(image,data);
38
39 for(i=0;i<data->heightout-data->localy/2;i++)
40 {
41 for(j=0;j<data->widthout;j++)
42 {
43 // First, create a list of candidates for particular pixel.
44 if(anotherpass) ncand = create_all_candidates(j,i, data);
45 else ncand = create_candidates(j,i, data);
46
47 // If there are multiple candidates, choose the best based on L_2 norm
48
49 if(ncand > 1)
50 {
51 diff = 1e10;
52 for(k=0;k<ncand;k++)
53 {
54 curdiff = compare_neighb(image, arrayref(candlistx,k),arrayref(candlisty,k),result,j,i, data);
55 curdiff += compare_rest(image,arrayref(candlistx,k),arrayref(candlisty,k),target,j,i,data);
56 if(curdiff < diff)
57 {
58 diff = curdiff;
59 bestx = arrayref(candlistx,k);
60 besty = arrayref(candlisty,k);
61 }
62 }
63 }
64 else
65 {
66 bestx = arrayref(candlistx,0);
67 besty = arrayref(candlisty,0);
68 }
69
70 // Copy the best candidate to the output image and record its position
71 // in the atlas (atlas is used to create candidates)
72
73 asubsref(result,a(j,i,data->widthout)+R) = asubsref(image,a(bestx,besty,data->widthin)+R);
74// asubsref(result,a(j,i,data->widthout)+G) = asubsref(image,a(bestx,besty,data->widthin)+G);
75// asubsref(result,a(j,i,data->widthout)+B) = asubsref(image,a(bestx,besty,data->widthin)+B);
76 arrayref(atlas,aa(j,i)) = bestx;
77 arrayref(atlas,aa(j,i)+1) = besty;
78 }
79 }
80
81 // Use full neighborhoods for the last few rows. This is a small
82 // fraction of total area - can be ignored for optimization purposes.
83
84 for(;i<data->heightout;i++)
85 {
86 for(j=0;j<data->widthout;j++)
87 {
88 ncand = create_all_candidates(j,i,data);
89 if(ncand > 1)
90 {
91 diff = 1e10;
92 for(k=0;k<ncand;k++)
93 {
94 curdiff = compare_full_neighb(image, arrayref(candlistx,k),arrayref(candlisty,k),result,j,i, data);
95 if(curdiff < diff)
96 {
97 diff = curdiff;
98 bestx = arrayref(candlistx,k);
99 besty = arrayref(candlisty,k);
100 }
101 }
102 }
103 else
104 {
105 bestx = arrayref(candlistx,0);
106 besty = arrayref(candlisty,0);
107 }
108
109 asubsref(result,a(j,i,data->widthout)+R) = asubsref(image,a(bestx,besty,data->widthin)+R);
110// asubsref(result,a(j,i,data->widthout)+G) = asubsref(image,a(bestx,besty,data->widthin)+G);
111// asubsref(result,a(j,i,data->widthout)+B) = asubsref(image,a(bestx,besty,data->widthin)+B);
112 arrayref(atlas,aa(j,i)) = bestx;
113 arrayref(atlas,aa(j,i)+1) = besty;
114 }
115 }
116
117 /*********************************
118 End of main texture synthesis loop
119 *********************************/
120
121 for(i=0;i<data->localy/2;i++)
122 {
123 for(j=0;j<data->widthout;j++)
124 {
125 ncand = create_all_candidates(j,i,data);
126 if(ncand > 1)
127 {
128 diff = 1e10;
129 for(k=0;k<ncand;k++)
130 {
131 curdiff = compare_full_neighb(image,arrayref(candlistx,k),arrayref(candlisty,k),result,j,i, data);
132 if(curdiff < diff)
133 {
134 diff = curdiff;
135 bestx = arrayref(candlistx,k);
136 besty = arrayref(candlisty,k);
137 }
138 }
139 }
140 else
141 {
142 bestx = arrayref(candlistx,0);
143 besty = arrayref(candlisty,0);
144 }
145
146 asubsref(result,a(j,i,data->widthout)+R) = asubsref(image,a(bestx,besty,data->widthin)+R);
147// asubsref(result,a(j,i,data->widthout)+G) = asubsref(image,a(bestx,besty,data->widthin)+G);
148// asubsref(result,a(j,i,data->widthout)+B) = asubsref(image,a(bestx,besty,data->widthin)+B);
149 arrayref(atlas,aa(j,i)) = bestx;
150 arrayref(atlas,aa(j,i)+1) = besty;
151 }
152 }
153}
154
155// Creates a list of valid candidates for given pixel using only L-shaped causal area
156
157int create_candidates(int x,int y, params* data)
158{
159 int address,i,j,k,n = 0;
160 for(i=0;i<=data->localy/2;i++)
161 {
162 for(j=-data->localx/2;j<=data->localx/2;j++)
163 {
164 if(i==0 && j>=0)
165 continue;
166 address = aa( arrayref(xloopout,x+j), arrayref(yloopout,y-i) );
167 arrayref(candlistx,n) = arrayref(atlas,address) - j;
168 arrayref(candlisty,n) = arrayref(atlas,address+1) + i;
169
170 if( arrayref(candlistx,n) >= vrfinishx || arrayref(candlistx,n) < vrstartx)
171 {
172 arrayref(candlistx,n) = vrstartx + (int)(drand48()*(vrfinishx-vrstartx));
173 arrayref(candlisty,n) = vrstarty + (int)(drand48()*(vrfinishy-vrstarty));
174 n++;
175 continue;
176 }
177
178 if( arrayref(candlisty,n) >= vrfinishy )
179 {
180 arrayref(candlisty,n) = vrstarty + (int)(drand48()*(vrfinishy-vrstarty));
181 arrayref(candlistx,n) = vrstartx + (int)(drand48()*(vrfinishx-vrstartx));
182 n++;
183 continue;
184 }
185
186 for(k=0;k<n;k++)
187 {
188 if( arrayref(candlistx,n) == arrayref(candlistx,k) && arrayref(candlisty,n) == arrayref(candlisty,k))
189 {
190 n--;
191 break;
192 }
193 }
194 n++;
195 }
196 }
197
198 return n;
199}
200
201// Created a list of candidates using the complete square around the pixel
202
203int create_all_candidates(int x,int y, params* data)
204{
205 int address,i,j,k,n = 0;
206 for(i=-data->localy/2;i<=data->localy/2;i++)
207 {
208 for(j=-data->localx/2;j<=data->localx/2;j++)
209 {
210 if(i==0 && j>=0)
211 continue;
212// printf("Entering = (%d,%d)\n", i,j);
213 address = aa( arrayref(xloopout,x+j), arrayref(yloopout,y-i) );
214 arrayref(candlistx,n) = arrayref(atlas,address)-j;
215 arrayref(candlisty,n) = arrayref(atlas,address+1)+i;
216
217 if( arrayref(candlistx,n) >= vrfinishx || arrayref(candlistx,n) < vrstartx)
218 {
219 arrayref(candlistx,n) = vrstartx + (int)(drand48()*(vrfinishx-vrstartx));
220 arrayref(candlisty,n) = vrstarty + (int)(drand48()*(vrfinishy-vrstarty));
221 n++;
222// printf("1: (%d,%d)\t%d\n", i,j,n);
223 continue;
224 }
225
226 if( arrayref(candlisty,n) >= vrfinishy || arrayref(candlisty,n) < vrstarty)
227 {
228 arrayref(candlisty,n) = vrstarty + (int)(drand48()*(vrfinishy-vrstarty));
229 arrayref(candlistx,n) = vrstartx + (int)(drand48()*(vrfinishx-vrstartx));
230 n++;
231// printf("2: (%d,%d)\t%d\n", i,j,n);
232 continue;
233 }
234
235 for(k=0;k<n;k++)
236 {
237 if( arrayref(candlistx,n) == arrayref(candlistx,k) && arrayref(candlisty,n) == arrayref(candlisty,k) )
238 {
239 n--;
240// printf("3: (%d,%d)\t%d\n", i,j,n);
241 break;
242 }
243 }
244 n++;
245// printf("4: (%d,%d)\t%d\n", i,j,n);
246 }
247 }
248
249 return n;
250}
251
252// Initializes the output image and atlases to a random collection of pixels
253
254//void init(F2D *result, F2D *image, params* data)
255void init(F2D *image, params* data)
256{
257 int i,j,tmpx,tmpy;
258 vrstartx = data->localx/2; vrstarty = data->localy/2;
259 vrfinishx = data->widthin-data->localx/2;
260 vrfinishy = data->heightin-data->localy/2;
261 for(i=0;i<data->heightout;i++)
262 {
263 for(j=0;j<data->widthout;j++)
264 {
265 if(
266 asubsref(target,a(j,i,data->widthout)+R) == 1.0
267// && asubsref(target,a(j,i,data->widthout)+G) == 1.0
268// && asubsref(target,a(j,i,data->widthout)+B) == 1.0
269 )
270 {
271 tmpx = vrstartx + (int)(drand48()*(vrfinishx-vrstartx));
272 tmpy = vrstarty + (int)(drand48()*(vrfinishy-vrstarty));
273 if(!anotherpass)
274 {
275 arrayref(atlas,aa(j,i)) = tmpx;
276 arrayref(atlas,aa(j,i)+1) = tmpy;
277 asubsref(result,a(j,i,data->widthout)+R) = asubsref(image,a(tmpx,tmpy,data->widthin)+R);
278// asubsref(result,a(j,i,data->widthout)+G) = asubsref(image,a(tmpx,tmpy,data->widthin)+G);
279// asubsref(result,a(j,i,data->widthout)+B) = asubsref(image,a(tmpx,tmpy,data->widthin)+B);
280 }
281 }
282 }
283 }
284
285 return;
286}
287
288
289// Compares two square neighborhoods, returns L_2 difference
290
291double compare_full_neighb(F2D *image,int x, int y, F2D *image1,int x1, int y1, params* data)
292{
293 double tmp,res = 0;
294 int i,j,addr,addr1;
295 for(i=-(data->localy/2);i<=data->localy/2;i++)
296 {
297 for(j=-(data->localx/2);j<=data->localx/2;j++)
298 {
299 if( !( i > 0 && y1 > data->localy && y1+i < data->heightout) )
300 {
301 addr = a(x+j,y+i,data->widthin);
302 addr1 = a( arrayref(xloopout,x1+j), arrayref(yloopout,y1+i), data->widthout);
303
304 tmp = asubsref(image,addr+R) - asubsref(image1,addr1+R);
305 res += tmp*tmp;
306// tmp = asubsref(image,addr+G) - asubsref(image1,addr1+G);
307// res += tmp*tmp;
308// tmp = asubsref(image,addr+B) - asubsref(image1,addr1+B);
309// res += tmp*tmp;
310 }
311 }
312 }
313
314 return res;
315}
316
317// Compares two L-shaped neighborhoods, returns L_2 difference
318
319double compare_neighb(F2D *image,int x, int y, F2D *image1,int x1, int y1, params* data)
320{
321 double tmp,res = 0;
322 int i,j,addr1,addr;
323 for(i=-(data->localy/2);i<0;i++)
324 {
325 for(j=-(data->localx/2);j<=data->localx/2;j++)
326 {
327 addr = a(x+j,y+i,data->widthin);
328 addr1 = a( arrayref(xloopout,x1+j), arrayref(yloopout,y1+i), data->widthout);
329
330 tmp = asubsref(image,addr+R) - asubsref(image1,addr1+R);
331 res += tmp*tmp;
332// tmp = asubsref(image,addr+G) - asubsref(image1,addr1+G);
333// res += tmp*tmp;
334// tmp = asubsref(image,addr+B) - asubsref(image1,addr1+B);
335// res += tmp*tmp;
336 }
337 }
338
339 for(j=-(data->localx/2);j<0;j++)
340 {
341 addr = a(x+j,y,data->widthin);
342 addr1 = a( arrayref(xloopout,x1+j), y1, data->widthout);
343
344 tmp = asubsref(image,addr+R) - asubsref(image1,addr1+R);
345 res += tmp*tmp;
346// tmp = asubsref(image,addr+G) - asubsref(image1,addr1+G);
347// res += tmp*tmp;
348// tmp = asubsref(image,addr+B) - asubsref(image1,addr1+B);
349// res += tmp*tmp;
350 }
351
352 return res;
353}
354
355double compare_rest(F2D *image,int x, int y, F2D *tar,int x1, int y1, params* data)
356{
357 double tmp,res = 0;
358 int i,j,addr,addr1;
359
360 for(i=(data->localy/2);i>0;i--)
361 {
362 for(j=-(data->localx/2);j<=data->localx/2;j++)
363 {
364 addr = a(x+j,y+i,data->widthin);
365 addr1 = a( arrayref(xloopout,x1+j), arrayref(yloopout,y1+i), data->widthout);
366
367 if( asubsref(tar,addr1+R) != 1.0) //KVS?
368 {
369 tmp = asubsref(image,addr+R) - asubsref(tar,addr1+R);
370 res += tmp*tmp;
371// tmp = asubsref(image,addr+G) - asubsref(tar,addr1+G);
372// res += tmp*tmp;
373// tmp = asubsref(image,addr+B) - asubsref(tar,addr1+B);
374// res += tmp*tmp;
375 }
376 }
377 }
378
379 for(j=(data->localx/2);j>0;j--)
380 {
381 addr = a(x+j,y,data->widthin);
382 addr1 = a( arrayref(xloopout,x1+j), y1, data->widthout);
383 if( asubsref(tar,addr1+R) != 1.0) // KVS?
384 {
385 tmp = asubsref(image,addr+R) - asubsref(tar,addr1+R);
386 res += tmp*tmp;
387// tmp = asubsref(image,addr+G) - asubsref(tar,addr1+G);
388// res += tmp*tmp;
389// tmp = asubsref(image,addr+B) - asubsref(tar,addr1+B);
390// res += tmp*tmp;
391 }
392 }
393
394 return res;
395}
396
diff --git a/SD-VBS/benchmarks/texture_synthesis/src/c/texture.h b/SD-VBS/benchmarks/texture_synthesis/src/c/texture.h
new file mode 100644
index 0000000..9819c03
--- /dev/null
+++ b/SD-VBS/benchmarks/texture_synthesis/src/c/texture.h
@@ -0,0 +1,48 @@
1/********************************
2Author: Sravanthi Kota Venkata
3********************************/
4
5#ifndef _TEXTURE_
6#define _TEXTURE_
7
8#include "sdvbs_common.h"
9
10#define R 0
11#define G 1
12#define B 2
13#define a(x,y,W) (1*((y)*(W)+(x)))
14#define aa(x,y) (2*((y)*data->widthout+(x)))
15
16typedef float pixelvalue;
17
18typedef struct
19{
20 double sign, diff;
21 int x,y;
22 int secondx, secondy;
23}signature;
24
25typedef struct{
26 int localx, localy, localz;
27 int widthin, widthout;
28 int heightin, heightout;
29 int nfin, nfout;
30}params;
31
32void *SIGNATURES;
33
34//void create_texture(F2D *image, F2D *result, params *data);
35void create_texture(F2D *image, params *data);
36I2D* parse_flags(int argc, char ** argv);
37void init_params(params *data);
38//void init(F2D *result, F2D *image, params* data);
39void init(F2D *image, params* data);
40double compare_full_neighb(F2D *image,int x, int y, F2D *image1,int x1, int y1, params* data);
41double compare_neighb(F2D *image,int x, int y, F2D *image1,int x1, int y1, params* data);
42int create_candidates(int x,int y, params* data);
43int create_all_candidates(int x,int y, params* data);
44
45#endif
46
47
48