Blame view

stim/grids/image_stack.h 5.73 KB
1d08c377   David Mayerich   added grids subdi...
1
2
3
  #ifndef STIM_IMAGE_STACK_H
  #define STIM_IMAGE_STACK_H
  
ae05c3e4   Pavel Govyadinov   Found an error wi...
4
5
6
7
  #include <stim/parser/wildcards.h>
  #include <stim/parser/filename.h>
  #include <stim/grids/grid.h>
  #include <stim/image/image.h>
1d08c377   David Mayerich   added grids subdi...
8
9
10
  
  namespace stim{
  
983b730b   David Mayerich   texture updates
11
12
  ///This class is used to load 3D grid data from stacks of images
  //	The class uses a 4D grid object, where the first dimension is a color value.
26da82c8   David Mayerich   finalized stim::g...
13
14
  template<typename T, typename F = float>
  class image_stack : public virtual stim::grid<T, 4, F>{
8b7be670   David Mayerich   implemented savin...
15
16
17
18
  
  	enum image_type {stimAuto, stimMono, stimRGB, stimRGBA};
  
  protected:
26da82c8   David Mayerich   finalized stim::g...
19
  	//using stim::grid<T, 4>::S;
ad4a30c5   David Mayerich   changed grid_data...
20
21
  	using stim::grid<T, 4>::R;
  	using stim::grid<T, 4>::ptr;
945ee13c   Laila Saadatifard   the get_list func...
22
  	using stim::grid<T, 4>::read;
1d08c377   David Mayerich   added grids subdi...
23
  
8157c392   David Mayerich   added parser and ...
24
  public:
983b730b   David Mayerich   texture updates
25
26
  	//default constructor
  	image_stack() : grid<T, 4>() {
8157c392   David Mayerich   added parser and ...
27
  
983b730b   David Mayerich   texture updates
28
  	}
ae407376   David Mayerich   added support for...
29
  
26da82c8   David Mayerich   finalized stim::g...
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
  	/// Overloads grid::samples() to return the number of samples associated with a given spatial dimension
  	///		this is necessary because R[0] stores the color
  	size_t samples(size_t d){
  		return grid<T, 4, F>::samples(d + 1);
  	}
  
  	size_t samples(){
  		return R[1] * R[2] * R[3];						//return the number of spatial samples
  	}
  
  	/// Returns the number of color channels
  	size_t channels(){
  		return R[0];
  	}
  
  	/// Overloads grid::size() to return the size of the grid associated with a given spatial dimension
  	F size(size_t d){
  		return grid<T, 4, F>::size(d + 1);
  	}
  
  	/// Sets the spacing between samples in the image stack
  	void spacing(F sx, F sy, F sz){
  		grid<T, 4, F>::S[1] = sx;			//set the sample spacing for the appropriate spatial dimension
  		grid<T, 4, F>::S[2] = sy;
  		grid<T, 4, F>::S[3] = sz;
  	}
  
  	F spacing(size_t d){
  		return grid<T, 4, F>::spacing(d + 1);
  	}
  
  	/// Overloads the spacing parameter to set the size of the grid associated with a given spatial dimension
  	//void spacing(F sx, F sy = 1.0f, F sz = 1.0f){
  	//	grid<T, 4, F>::spacing((F)1.0, sx, sy, sz);
  	//}
  
23dbe234   david   fixed linux compi...
66
67
68
  	/// Load all of the images specified by a list of strings
  	/// @param string_list is a list of file names specifying images
  	void load_images(std::vector<std::string> string_list){
5cda84ab   David Mayerich   putting pranathi ...
69
70
  
  		//if there are no matching files, exit
23dbe234   david   fixed linux compi...
71
  		if(string_list.size() == 0){
5cda84ab   David Mayerich   putting pranathi ...
72
73
74
  			std::cout<<"STIM ERROR (image_stack): No matching files for loading a stack."<<std::endl;
  			exit(1);
  		}
8b7be670   David Mayerich   implemented savin...
75
  
23dbe234   david   fixed linux compi...
76
  		stim::image<T> I(string_list[0]);		//load the first image and set all of the image_stack proparties
8b7be670   David Mayerich   implemented savin...
77
  
23dbe234   david   fixed linux compi...
78
79
  		R[0] = I.channels();				//set the number of color channels
  		R[1] = I.width();				//set the stack height and width based on the image size
26da82c8   David Mayerich   finalized stim::g...
80
  		R[2] = I.height();
23dbe234   david   fixed linux compi...
81
  		R[3] = string_list.size();			//set the stack z-resolution based on the number of images
8b7be670   David Mayerich   implemented savin...
82
  
7b20b4e5   david   fixed image stack...
83
  		ptr = (T*)malloc(grid<T, 4, F>::bytes());	//allocate storage space
8b7be670   David Mayerich   implemented savin...
84
85
  
  		//load and copy each image into the grid
23dbe234   david   fixed linux compi...
86
87
  		for(unsigned int i = 0; i<R[3]; i++){				//for each image in the list			
  			stim::image<T> I(string_list[i]);			//load the image			
983b730b   David Mayerich   texture updates
88
  			I.get_interleaved_rgb(&ptr[ i * R[0] * R[1] * R[2] ]);	//retrieve the interlaced data from the image - store it in the grid			
8b7be670   David Mayerich   implemented savin...
89
90
91
  		}
  	}
  
23dbe234   david   fixed linux compi...
92
93
94
95
96
97
98
99
100
101
102
103
  	/// Load a stack of images based on a file mask. Images are loaded in alphanumeric order
  	/// @param file_mask is the mask describing the images to be loaded
  	void load_images(std::string file_mask){
  		stim::filename file_path(file_mask);				//get the path for the images
  		std::vector<stim::filename> file_list = file_path.get_list();	//get the list of files
  		std::vector<std::string> string_list(file_list.size());		//allocate space for an array of strings
  		for(size_t f = 0; f < file_list.size(); f++){			//for each file name in the list
  			string_list[f] = file_list[f].str();			//convert the file name to a string
  		}
  		load_images(string_list);					//load all of the images in the list
  	}
  
ae05c3e4   Pavel Govyadinov   Found an error wi...
104
105
106
  	///Inserts image I into slot i.
  	/// @param stim::image<T> I; image to insert.
  	/// @int I, where to place the image.
983b730b   David Mayerich   texture updates
107
  	void insert_image(stim::image<T> I, int i){
ae05c3e4   Pavel Govyadinov   Found an error wi...
108
109
  		I.get_interleaved_rgb(&ptr[i *R[0] *R[1] *R[2] ]);
  	}
ae407376   David Mayerich   added support for...
110
  
ae05c3e4   Pavel Govyadinov   Found an error wi...
111
  	///Saves a single page to an image file
ae407376   David Mayerich   added support for...
112
113
  	/// @param file_name is the name of the image file to be created
  	/// @param i is the page to be saved
983b730b   David Mayerich   texture updates
114
115
116
  	void save_image(std::string file_name, unsigned int i){		
  		stim::image<T> I;											//create an image		
  		I.set_interleaved_rgb(&ptr[ i * R[0] * R[1] * R[2] ], R[1], R[2], R[0]);	//retrieve the interlaced data from the image - store it in the grid
6156690f   David Mayerich   added ability to ...
117
118
  		I.save(file_name);
  	}
ae05c3e4   Pavel Govyadinov   Found an error wi...
119
  
385d2447   Pavel Govyadinov   Checkpoint: Conve...
120
121
122
123
124
125
126
127
  	///Sets the dimensions of the image in each direction
  	///Voxel-size.
  	/// @param x size in the x direction
  	/// @param y size in the y direction
  	/// @param z size in the z direction
  	void
  	set_dim(float x, float y, float z)
  	{
256b431c   david   fixed Linux compi...
128
129
130
131
  		grid<T, 4, F>::S[0] = 1;
  		grid<T, 4, F>::S[1] = x;
  		grid<T, 4, F>::S[2] = y;
  		grid<T, 4, F>::S[3] = z;
385d2447   Pavel Govyadinov   Checkpoint: Conve...
132
  	}
ae407376   David Mayerich   added support for...
133
  
ae05c3e4   Pavel Govyadinov   Found an error wi...
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
  	///set dimensions of the grid.
  	/// @param channels, number of channels in each image.
  	/// @param width,  number of pixels in width each image.
  	/// @param height, number of pixels in height.
  	/// @param depth,  number of pixels in depth.
  	void init(int channels, int width, int height, int depth)
  	{
  		R.resize(4);
  		R[0] = channels;
  		R[1] = width;
  		R[2] = height;
  		R[3] = depth;
  
  		ptr = (T*)malloc(sizeof(T) * samples());
  	}
  
  	///Saves the entire stack to a set of images
ae407376   David Mayerich   added support for...
151
  	/// @param file_mask is the mask describing how the file names will be saved (ex. image????.bmp)
8b7be670   David Mayerich   implemented savin...
152
153
154
155
  	void save_images(std::string file_mask){
  
  		stim::filename file_path(file_mask);
  
8b7be670   David Mayerich   implemented savin...
156
157
158
  		//create a list of file names
  		std::vector<std::string> file_list = stim::wildcards::increment(file_path.str(), 0, R[3]-1, 1);
  
6156690f   David Mayerich   added ability to ...
159
160
161
  		for(int i=0; i<R[3]; i++)
  			save_image(file_list[i], i);
  	}
8b7be670   David Mayerich   implemented savin...
162
  
945ee13c   Laila Saadatifard   the get_list func...
163
164
165
166
167
168
169
170
171
172
173
174
175
  	/// Returns the pixel at the specified point
  	T get(unsigned int x, unsigned int y, unsigned int z, unsigned int c = 0){
  		return ptr[z * R[0] * R[1] * R[2] + y * R[0] * R[1] + x * R[0] + c];
  	}
  
  	void read(std::string file, unsigned int X, unsigned int Y, unsigned int Z, unsigned int C = 1, unsigned int header = 0){
  		read(file, stim::vec<unsigned long>(C, X, Y, Z), header);
  	}
  
  	T* data(){
  		return ptr;
  	}
  
1d08c377   David Mayerich   added grids subdi...
176
177
178
179
180
  };
  
  
  }
  
8b7be670   David Mayerich   implemented savin...
181
  #endif