read_lbed_file(filename,imagename) /* read in linked bar-edgel file */ char *filename, *imagename; { int fd; float test; struct stat statbuf; float sigma_t, sigma_l, sd_noise; int dim0, dim1, edge_type; int i; int min_length, number_of_edgel; int total_edge_number, total_edgel_number; int edge_index, edge_length, n, k, EK_vector_number; float xi, yi, theta, strength; if (stat(filename,&statbuf) != 0) /* get the file information */ { perror(filename); exit(1); }; if ((fd = open(filename,O_RDONLY)) < 0) { perror(filename); exit(1); }; INPUT_BUFFER = (unsigned char *) calloc(statbuf.st_size,sizeof(char)); if (read(fd,INPUT_BUFFER,statbuf.st_size) != statbuf.st_size) { /* read in the whole file and save it in INPUT_BUFFER perror(filename); exit(1); }; INPUT_BUFFER_POINTER = INPUT_BUFFER; edge_type = read_1byte_integer(); /* edge_type = 0 (Canny operator) or 1 (Wang-Binford operator) */ sigma_t = read_single_float(); /* the sigma of the mask along the transverse direction */ sigma_l = read_single_float(); /* the sigma of the mask along the longitudinal direction */ sd_noise = read_single_float(); /* the standard deviation of pixel noise */ dim0 = read_2byte_integer(); /* number of columns */ dim1 = read_2byte_integer(); /* number of rows */ min_length = read_1byte_integer(); /* edge length >= min_length */ for(i = 0; i < 110; ++i) /* header */ read_1byte_integer(); total_edge_number = read_4byte_integer(); /* total number of edges */ total_edgel_number = read_4byte_integer(); /* total number of edgels */ for(edge_index = 1; edge_index <= total_edge_number; ++edge_index) { number_of_edgel = read_3byte_integer(); /* number of edgels in this edge */ for(n = 1; n <= number_of_edgel; ++n) { strength = read_single_float(); theta = read_2byte_integer() * 0.0000958738; /* 9.58738e-5 = 2*pi/65536 */ if( dim0 > 512) /* decode the position information */ xi = 0.0078125 * read_3byte_integer(); else xi = 0.0078125 * read_2byte_integer(); if( dim1 > 512) yi = 0.0078125 * read_3byte_integer(); else yi = 0.0078125 * read_2byte_integer(); }; }; } read_4byte_integer() { int data_1, data_2, data_3, data_4; data_1 = *INPUT_BUFFER_POINTER; /* INPUT_BUFFER is an I/O buffer and INPUT_BUFFER_POINTER is the pointer */ INPUT_BUFFER_POINTER += 1; data_2 = (*INPUT_BUFFER_POINTER << 8); INPUT_BUFFER_POINTER += 1; data_3 = (*INPUT_BUFFER_POINTER << 16); INPUT_BUFFER_POINTER += 1; data_4 = (*INPUT_BUFFER_POINTER << 24); INPUT_BUFFER_POINTER += 1; return(data_1 + data_2 + data_3 + data_4); } read_3byte_integer() { int data_1, data_2, data_3; data_1 = *INPUT_BUFFER_POINTER; INPUT_BUFFER_POINTER += 1; data_2 = (*INPUT_BUFFER_POINTER << 8); INPUT_BUFFER_POINTER += 1; data_3 = (*INPUT_BUFFER_POINTER << 16); INPUT_BUFFER_POINTER += 1; return(data_1 + data_2 + data_3); } read_2byte_integer() { int data_1, data_2; data_1 = *INPUT_BUFFER_POINTER; INPUT_BUFFER_POINTER += 1; data_2 = (*INPUT_BUFFER_POINTER << 8); INPUT_BUFFER_POINTER += 1; return(data_1 + data_2); } read_1byte_integer() { int data_1; data_1 = *INPUT_BUFFER_POINTER; INPUT_BUFFER_POINTER += 1; return(data_1); } float read_single_float() { /* Use IEEE standard to represent a single-precision number */ int code, ff, ee, ss; code = read_4byte_integer(INPUT_BUFFER_POINTER); ff = (code & 037777777); ee = ((code >> 23) & 0377); ss = ((code >> 31) & 01); if (ss == 1) return(-1.0 * powf(2.0,(float)(ee-127)) * (1.0+ff*1.1920929e-7)); else return(powf(2.0,(float)(ee-127)) * (1.0+ff*1.1920929e-7)); }