Blame view

stim/grids/image_stack.h 4.04 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.
1d08c377   David Mayerich   added grids subdi...
13
  template<typename T>
ad4a30c5   David Mayerich   changed grid_data...
14
  class image_stack : public virtual stim::grid<T, 4>{
8b7be670   David Mayerich   implemented savin...
15
16
17
18
  
  	enum image_type {stimAuto, stimMono, stimRGB, stimRGBA};
  
  protected:
385d2447   Pavel Govyadinov   Checkpoint: Conve...
19
  	using stim::grid<T, 4>::S;
ad4a30c5   David Mayerich   changed grid_data...
20
21
22
  	using stim::grid<T, 4>::R;
  	using stim::grid<T, 4>::ptr;
  	using stim::grid<T, 4>::samples;
945ee13c   Laila Saadatifard   the get_list func...
23
  	using stim::grid<T, 4>::read;
1d08c377   David Mayerich   added grids subdi...
24
  
8157c392   David Mayerich   added parser and ...
25
  public:
983b730b   David Mayerich   texture updates
26
27
  	//default constructor
  	image_stack() : grid<T, 4>() {
8157c392   David Mayerich   added parser and ...
28
  
983b730b   David Mayerich   texture updates
29
  	}
ae407376   David Mayerich   added support for...
30
  
983b730b   David Mayerich   texture updates
31
  	///Load an image stack based on a file mask. Images are loaded in alphanumeric order
ae407376   David Mayerich   added support for...
32
  	/// @param file_mask is the mask describing images to be loaded
8b7be670   David Mayerich   implemented savin...
33
34
35
36
  	void load_images(std::string file_mask){
  
  		stim::filename file_path(file_mask);
  
8b7be670   David Mayerich   implemented savin...
37
  		//get the list of files
445d9db7   David Mayerich   fixed directory e...
38
  		std::vector<stim::filename> file_list = file_path.get_list();
5cda84ab   David Mayerich   putting pranathi ...
39
40
41
42
43
44
  
  		//if there are no matching files, exit
  		if(file_list.size() == 0){
  			std::cout<<"STIM ERROR (image_stack): No matching files for loading a stack."<<std::endl;
  			exit(1);
  		}
6422f96a   Pavel Govyadinov   minor bug fixes a...
45
46
  		for(int i = 0; i < file_list.size(); i++)
  			std::cout << file_list[i].str() << std::endl;
8b7be670   David Mayerich   implemented savin...
47
48
  
  		//load the first image and set all of the image_stack properties
8b7be670   David Mayerich   implemented savin...
49
50
51
  		stim::image<T> I(file_list[0].str());
  
  		//set the image resolution and number of channels
5eeaf941   Pavel Govyadinov   changer to the ba...
52
53
54
55
  		R.push(I.channels());
  		R.push(I.width());
  		R.push(I.height());
  		R.push(file_list.size());
8b7be670   David Mayerich   implemented savin...
56
57
58
59
60
  
  		//allocate storage space
  		ptr = (T*)malloc(sizeof(T) * samples());
  
  		//load and copy each image into the grid
983b730b   David Mayerich   texture updates
61
62
63
  		for(unsigned int i = 0; i<R[3]; i++){			
  			stim::image<T> I(file_list[i].str());					//load the image			
  			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...
64
65
66
  		}
  	}
  
ae05c3e4   Pavel Govyadinov   Found an error wi...
67
68
69
  	///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
70
  	void insert_image(stim::image<T> I, int i){
ae05c3e4   Pavel Govyadinov   Found an error wi...
71
72
  		I.get_interleaved_rgb(&ptr[i *R[0] *R[1] *R[2] ]);
  	}
ae407376   David Mayerich   added support for...
73
  
ae05c3e4   Pavel Govyadinov   Found an error wi...
74
  	///Saves a single page to an image file
ae407376   David Mayerich   added support for...
75
76
  	/// @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
77
78
79
  	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 ...
80
81
  		I.save(file_name);
  	}
ae05c3e4   Pavel Govyadinov   Found an error wi...
82
  
385d2447   Pavel Govyadinov   Checkpoint: Conve...
83
84
85
86
87
88
89
90
91
92
93
94
95
  	///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)
  	{
  		S[0] = 1;
  		S[1] = x;
  		S[2] = y;
  		S[3] = z;
  	}
ae407376   David Mayerich   added support for...
96
  
ae05c3e4   Pavel Govyadinov   Found an error wi...
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
  	///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...
114
  	/// @param file_mask is the mask describing how the file names will be saved (ex. image????.bmp)
8b7be670   David Mayerich   implemented savin...
115
116
117
118
  	void save_images(std::string file_mask){
  
  		stim::filename file_path(file_mask);
  
8b7be670   David Mayerich   implemented savin...
119
120
121
  		//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 ...
122
123
124
  		for(int i=0; i<R[3]; i++)
  			save_image(file_list[i], i);
  	}
8b7be670   David Mayerich   implemented savin...
125
  
945ee13c   Laila Saadatifard   the get_list func...
126
127
128
129
130
131
132
133
134
135
136
137
138
  	/// 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...
139
140
141
142
143
  };
  
  
  }
  
8b7be670   David Mayerich   implemented savin...
144
  #endif