Commit bb29dc49fb1bc39e0ef2ef2721143c76a9665852
Merge branch 'master' of git.stim.ee.uh.edu:codebase/stimlib
Showing
7 changed files
with
104 additions
and
18 deletions
Show diff stats
1 | +function images2ENVI( image_struct, filename ) | |
2 | +%HSIWRITE : This function generates a hyperspectral binary image and header | |
3 | +% based on multi-dimention image | |
4 | +% | |
5 | +% | |
6 | +% This function accepts a srutcture which contains several channels. | |
7 | +% It creates a 'bsq' interleaved image and a ENVI header filer correspoing | |
8 | +% to the information of the image | |
9 | + | |
10 | +fields = fieldnames(image_struct); | |
11 | + | |
12 | +% check all images to have the same size | |
13 | +for i = 1 : size (fields, 1) | |
14 | + for j = 1 : size (fields, 1) | |
15 | + if size(image_struct.(fields{i}))~= size(image_struct.(fields{i})) | |
16 | + fprintf ('Dimension of input images do not Match !'); | |
17 | + exit; | |
18 | + end | |
19 | + end | |
20 | +end | |
21 | + | |
22 | + | |
23 | + | |
24 | + | |
25 | + | |
26 | +% Extracting the needed information | |
27 | +base_image = image_struct.(fields{1}); | |
28 | + | |
29 | +rows = size(base_image, 1); | |
30 | +columns = size(base_image, 2); | |
31 | +bands = size(fields,1); | |
32 | +multiDimImage = base_image'; % Matlab stores column major, transposing make it row major to be saved on memory | |
33 | + | |
34 | +% Create multi-dimentional image | |
35 | +for j = 1 : size(fields,1) | |
36 | + multiDimImage(:,:,j) = (image_struct.(fields{j})'); % Matlab stores column major, transposing make it row major to be saved on memory | |
37 | +end | |
38 | + | |
39 | +% create the binary image | |
40 | +HSImage = reshape (multiDimImage, [rows*columns*bands, 1]); | |
41 | +if (~isfloat(HSImage)) | |
42 | + HSImage_float = single(HSImage); % casting to float | |
43 | +end | |
44 | +multibandwrite(HSImage_float,filename,'bsq'); | |
45 | + | |
46 | + | |
47 | +% create the header file | |
48 | +info.samples = columns; | |
49 | +info.lines = rows; | |
50 | +info.bands = bands; | |
51 | +info.header_offset = 0; | |
52 | +info.file_type = 'ENVI Standard'; | |
53 | +info.data_type = 4; | |
54 | +info.interleave = 'bsq'; | |
55 | + | |
56 | + | |
57 | + | |
58 | + | |
59 | +fid = fopen(strcat(filename, '.hdr'),'w'); % open a file to write the header file | |
60 | +fprintf(fid,'%s\n','ENVI'); % first line of the header file showing it is an ENVI file | |
61 | + | |
62 | +info_fields=fieldnames(info); | |
63 | +for i = 1:length(info_fields) | |
64 | + parameter = info_fields{i}; % get the parameter of each line | |
65 | + value = info.(info_fields{i}); % get the corresponding value of the parameter | |
66 | + parameter(strfind(parameter,'_')) = ' '; % change '_' to ' ' | |
67 | + line=[parameter,' = ',num2str(value)]; % create the line of the hdr file | |
68 | + fprintf(fid,'%s\n',line); % write it to the hdr file | |
69 | +end | |
70 | + | |
71 | +fclose(fid); % clode the header file | |
72 | + | |
73 | +end | |
74 | + | ... | ... |
stim/envi/binary.h
... | ... | @@ -15,7 +15,7 @@ |
15 | 15 | #include <unistd.h> |
16 | 16 | #endif |
17 | 17 | |
18 | -#ifdef CUDA_FOUND | |
18 | +#ifdef USE_CUDA | |
19 | 19 | //CUDA externs |
20 | 20 | void gpu_permute(char* dest, char* src, size_t sx, size_t sy, size_t sz, size_t d0, size_t d1, size_t d2, size_t typesize); |
21 | 21 | #include <stim/cuda/cudatools/error.h> |
... | ... | @@ -647,7 +647,7 @@ public: |
647 | 647 | std::chrono::high_resolution_clock::time_point t0, t1; |
648 | 648 | t0 = std::chrono::high_resolution_clock::now(); |
649 | 649 | |
650 | -#ifdef CUDA_FOUND | |
650 | +#ifdef USE_CUDA | |
651 | 651 | T* gpu_src; |
652 | 652 | HANDLE_ERROR( cudaMalloc(&gpu_src, sx*sy*sz*sizeof(T)) ); |
653 | 653 | HANDLE_ERROR( cudaMemcpy(gpu_src, src, sx*sy*sz*sizeof(T), cudaMemcpyHostToDevice) ); | ... | ... |
stim/envi/envi.h
... | ... | @@ -359,11 +359,23 @@ public: |
359 | 359 | |
360 | 360 | fseek(f, 9, SEEK_SET); //seek to the number of bands |
361 | 361 | short b; //allocate space for the number of bands |
362 | - fread(&b, sizeof(short), 1, f); //read the number of bands | |
362 | + size_t nread = fread(&b, sizeof(short), 1, f); //read the number of bands | |
363 | + if(nread != 1){ | |
364 | + std::cout<<"Error reading band number from Agilent file."<<std::endl; | |
365 | + exit(1); | |
366 | + } | |
363 | 367 | fseek(f, 13, SEEK_CUR); //skip the the x and y dimensions |
364 | 368 | short x, y; |
365 | - fread(&x, sizeof(short), 1, f); //read the image x and y size | |
366 | - fread(&y, sizeof(short), 1, f); | |
369 | + nread = fread(&x, sizeof(short), 1, f); //read the image x and y size | |
370 | + if(nread != 1){ | |
371 | + std::cout<<"Error reading X dimension from Agilent file."<<std::endl; | |
372 | + exit(1); | |
373 | + } | |
374 | + nread = fread(&y, sizeof(short), 1, f); | |
375 | + if(nread != 1){ | |
376 | + std::cout<<"Error reading Y dimension from Agilent file."<<std::endl; | |
377 | + exit(1); | |
378 | + } | |
367 | 379 | fclose(f); //close the file |
368 | 380 | |
369 | 381 | //store the information from the Agilent header in the ENVI header | ... | ... |
stim/image/image.h
... | ... | @@ -141,7 +141,7 @@ public: |
141 | 141 | |
142 | 142 | //save a Netpbm file |
143 | 143 | void load_netpbm(std::string filename) { |
144 | - std::ifstream infile(filename, std::ios::in | std::ios::binary); //open an output file | |
144 | + std::ifstream infile(filename.c_str(), std::ios::in | std::ios::binary); //open an output file | |
145 | 145 | if (!infile) { |
146 | 146 | std::cout << "Error opening input file in image::load_netpbm()" << std::endl; |
147 | 147 | exit(1); |
... | ... | @@ -244,7 +244,7 @@ public: |
244 | 244 | |
245 | 245 | //save a Netpbm file |
246 | 246 | void save_netpbm(std::string filename) { |
247 | - std::ofstream outfile(filename, std::ios::out | std::ios::binary); //open an output file | |
247 | + std::ofstream outfile(filename.c_str(), std::ios::out | std::ios::binary); //open an output file | |
248 | 248 | if(!outfile) { |
249 | 249 | std::cout << "Error generating output file in image::save_netpbm()" << std::endl; |
250 | 250 | exit(1); |
... | ... | @@ -356,8 +356,8 @@ public: |
356 | 356 | } |
357 | 357 | |
358 | 358 | /// Returns an std::vector containing each channel as a separate image |
359 | - std::vector<image<T>> split() const { | |
360 | - std::vector<image<T>> r; //create an image array | |
359 | + std::vector< image<T> > split() const { | |
360 | + std::vector< image<T> > r; //create an image array | |
361 | 361 | r.resize(C()); //create images for each channel |
362 | 362 | |
363 | 363 | for (size_t c = 0; c < C(); c++) { //for each channel |
... | ... | @@ -367,7 +367,7 @@ public: |
367 | 367 | } |
368 | 368 | |
369 | 369 | /// Merge a series of single-channel images into a multi-channel image |
370 | - void merge(std::vector<image<T>>& list) { | |
370 | + void merge(std::vector< image<T> >& list) { | |
371 | 371 | size_t x = list[0].width(); //calculate the size of the image |
372 | 372 | size_t y = list[0].height(); |
373 | 373 | allocate(x, y, list.size()); //re-allocate the image | ... | ... |
stim/math/filters/conv2.h
... | ... | @@ -10,7 +10,7 @@ |
10 | 10 | namespace stim { |
11 | 11 | #ifdef __CUDACC__ |
12 | 12 | //Kernel function that performs the 2D convolution. |
13 | - template<typename T, typename K = T> | |
13 | + template<typename T, typename K> | |
14 | 14 | __global__ void kernel_conv2(T* out, T* in, K* kernel, size_t sx, size_t sy, size_t kx, size_t ky) { |
15 | 15 | extern __shared__ T s[]; //declare a shared memory array |
16 | 16 | size_t xi = blockIdx.x * blockDim.x + threadIdx.x; //threads correspond to indices into the output image |
... | ... | @@ -52,7 +52,7 @@ namespace stim { |
52 | 52 | //@param sy is the size of the input image along Y |
53 | 53 | //@param kx is the size of the kernel along X |
54 | 54 | //@param ky is the size of the kernel along Y |
55 | - template<typename T, typename K = T> | |
55 | + template<typename T, typename K> | |
56 | 56 | void gpu_conv2(T* out, T* in, K* kernel, size_t sx, size_t sy, size_t kx, size_t ky) { |
57 | 57 | cudaDeviceProp p; |
58 | 58 | HANDLE_ERROR(cudaGetDeviceProperties(&p, 0)); |
... | ... | @@ -77,7 +77,7 @@ namespace stim { |
77 | 77 | //@param sy is the size of the input image along Y |
78 | 78 | //@param kx is the size of the kernel along X |
79 | 79 | //@param ky is the size of the kernel along Y |
80 | - template<typename T, typename K = T> | |
80 | + template<typename T, typename K> | |
81 | 81 | void cpu_conv2(T* out, T* in, K* kernel, size_t sx, size_t sy, size_t kx, size_t ky) { |
82 | 82 | size_t X = sx - kx + 1; //x size of the output image |
83 | 83 | size_t Y = sy - ky + 1; //y size of the output image | ... | ... |
stim/math/filters/gauss2.h
... | ... | @@ -16,7 +16,7 @@ namespace stim { |
16 | 16 | ///@param stdx is the standard deviation (in pixels) along the x axis |
17 | 17 | ///@param stdy is the standard deviation (in pixels) along the y axis |
18 | 18 | ///@param nstds specifies the number of standard deviations of the Gaussian that will be kept in the kernel |
19 | - template<typename T, typename K = T> | |
19 | + template<typename T, typename K> | |
20 | 20 | stim::image<T> cpu_gauss2(const stim::image<T>& in, K stdx, K stdy, size_t nstds = 3) { |
21 | 21 | size_t kx = stdx * nstds * 2; //calculate the kernel sizes |
22 | 22 | size_t ky = stdy * nstds * 2; |
... | ... | @@ -33,8 +33,8 @@ namespace stim { |
33 | 33 | for (size_t yi = 0; yi < ky; yi++) |
34 | 34 | gy[yi] = gauss1d((K)yi, muy, stdy); |
35 | 35 | |
36 | - std::vector<stim::image<T>> IN = in.split(); //split the input image into channels | |
37 | - std::vector<stim::image<T>> R = r.split(); //split the output image into channels | |
36 | + std::vector< stim::image<T> > IN = in.split(); //split the input image into channels | |
37 | + std::vector< stim::image<T> > R = r.split(); //split the output image into channels | |
38 | 38 | for (size_t c = 0; c < in.channels(); c++) //for each channel |
39 | 39 | cpu_sepconv2(R[c].data(), IN[c].data(), gx, gy, IN[c].width(), IN[c].height(), kx, ky); |
40 | 40 | ... | ... |
stim/math/filters/sepconv2.h
... | ... | @@ -15,7 +15,7 @@ namespace stim { |
15 | 15 | //@param sy is the size of the input image along Y |
16 | 16 | //@param kx is the size of the kernel along X |
17 | 17 | //@param ky is the size of the kernel along Y |
18 | - template<typename T, typename K = T> | |
18 | + template<typename T, typename K> | |
19 | 19 | void gpu_sepconv2(T* out, T* in, K* k0, K* k1, size_t sx, size_t sy, size_t kx, size_t ky) { |
20 | 20 | cudaDeviceProp p; |
21 | 21 | HANDLE_ERROR(cudaGetDeviceProperties(&p, 0)); |
... | ... | @@ -54,7 +54,7 @@ namespace stim { |
54 | 54 | //@param sy is the size of the input image along Y |
55 | 55 | //@param kx is the size of the kernel along X |
56 | 56 | //@param ky is the size of the kernel along Y |
57 | - template<typename T, typename K = T> | |
57 | + template<typename T, typename K> | |
58 | 58 | void cpu_sepconv2(T* out, T* in, K* k0, K* k1, size_t sx, size_t sy, size_t kx, size_t ky) { |
59 | 59 | size_t X = sx - kx + 1; //x size of the output image |
60 | 60 | size_t Y = sy - ky + 1; | ... | ... |