Commit c5da629063f64c2f67ca26e8a87758c2d582997a

Authored by David Mayerich
2 parents 904614c3 fba6e7e3

Merge branch 'master' of git.stim.ee.uh.edu:codebase/stimlib

stim/gl/gl_spider.h
@@ -140,7 +140,7 @@ class gl_spider : public virtual gl_texture<T> @@ -140,7 +140,7 @@ class gl_spider : public virtual gl_texture<T>
140 setMatrix(); //create the transformation matrix. 140 setMatrix(); //create the transformation matrix.
141 glCallList(dList+1); //move the templates to p, d, m. 141 glCallList(dList+1); //move the templates to p, d, m.
142 int best = getCost(ptexbufferID, numSamplesPos); //find min cost. 142 int best = getCost(ptexbufferID, numSamplesPos); //find min cost.
143 - std::cerr << best << std::endl; 143 +// std::cerr << best << std::endl;
144 stim::vec<float> next( //find next position. 144 stim::vec<float> next( //find next position.
145 pV[best][0], 145 pV[best][0],
146 pV[best][1], 146 pV[best][1],
stim/grids/image_stack.h
1 #ifndef STIM_IMAGE_STACK_H 1 #ifndef STIM_IMAGE_STACK_H
2 #define STIM_IMAGE_STACK_H 2 #define STIM_IMAGE_STACK_H
3 3
4 -#include "../parser/wildcards.h"  
5 -#include "../parser/filename.h"  
6 -#include "../grids/grid.h"  
7 -#include "../image/image.h" 4 +#include <stim/parser/wildcards.h>
  5 +#include <stim/parser/filename.h>
  6 +#include <stim/grids/grid.h>
  7 +#include <stim/image/image.h>
8 8
9 namespace stim{ 9 namespace stim{
10 10
@@ -48,7 +48,7 @@ public: @@ -48,7 +48,7 @@ public:
48 } 48 }
49 49
50 //load the first image and set all of the image_stack properties 50 //load the first image and set all of the image_stack properties
51 - std::cout<<"File to Load: "<<file_list[0].str()<<std::endl; 51 +// std::cout<<"File to Load: "<<file_list[0].str()<<std::endl;
52 stim::image<T> I(file_list[0].str()); 52 stim::image<T> I(file_list[0].str());
53 53
54 //set the image resolution and number of channels 54 //set the image resolution and number of channels
@@ -63,7 +63,7 @@ public: @@ -63,7 +63,7 @@ public:
63 //load and copy each image into the grid 63 //load and copy each image into the grid
64 for(unsigned int i = 0; i<R[3]; i++){ 64 for(unsigned int i = 0; i<R[3]; i++){
65 65
66 - std::cout<<"File to Load: "<<file_list[i].str()<<std::endl; 66 +// std::cout<<"File to Load: "<<file_list[i].str()<<std::endl;
67 //load the image 67 //load the image
68 stim::image<T> I(file_list[i].str()); 68 stim::image<T> I(file_list[i].str());
69 69
@@ -73,8 +73,15 @@ public: @@ -73,8 +73,15 @@ public:
73 } 73 }
74 } 74 }
75 75
76 - ///Saves a single page to an image file 76 + ///Inserts image I into slot i.
  77 + /// @param stim::image<T> I; image to insert.
  78 + /// @int I, where to place the image.
  79 + void insert_image(stim::image<T> I, int i)
  80 + {
  81 + I.get_interleaved_rgb(&ptr[i *R[0] *R[1] *R[2] ]);
  82 + }
77 83
  84 + ///Saves a single page to an image file
78 /// @param file_name is the name of the image file to be created 85 /// @param file_name is the name of the image file to be created
79 /// @param i is the page to be saved 86 /// @param i is the page to be saved
80 void save_image(std::string file_name, unsigned int i){ 87 void save_image(std::string file_name, unsigned int i){
@@ -83,10 +90,11 @@ public: @@ -83,10 +90,11 @@ public:
83 stim::image<T> I; 90 stim::image<T> I;
84 91
85 //retrieve the interlaced data from the image - store it in the grid 92 //retrieve the interlaced data from the image - store it in the grid
86 - I.set_interleaved(&ptr[ i * R[0] * R[1] * R[2] ], R[1], R[2], R[0]); 93 + I.set_interleaved_rgb(&ptr[ i * R[0] * R[1] * R[2] ], R[1], R[2], R[0]);
87 94
88 I.save(file_name); 95 I.save(file_name);
89 } 96 }
  97 +
90 ///Sets the dimensions of the image in each direction 98 ///Sets the dimensions of the image in each direction
91 ///Voxel-size. 99 ///Voxel-size.
92 /// @param x size in the x direction 100 /// @param x size in the x direction
@@ -100,8 +108,24 @@ public: @@ -100,8 +108,24 @@ public:
100 S[2] = y; 108 S[2] = y;
101 S[3] = z; 109 S[3] = z;
102 } 110 }
103 - ///Saves the entire stack to a set of images  
104 111
  112 + ///set dimensions of the grid.
  113 + /// @param channels, number of channels in each image.
  114 + /// @param width, number of pixels in width each image.
  115 + /// @param height, number of pixels in height.
  116 + /// @param depth, number of pixels in depth.
  117 + void init(int channels, int width, int height, int depth)
  118 + {
  119 + R.resize(4);
  120 + R[0] = channels;
  121 + R[1] = width;
  122 + R[2] = height;
  123 + R[3] = depth;
  124 +
  125 + ptr = (T*)malloc(sizeof(T) * samples());
  126 + }
  127 +
  128 + ///Saves the entire stack to a set of images
105 /// @param file_mask is the mask describing how the file names will be saved (ex. image????.bmp) 129 /// @param file_mask is the mask describing how the file names will be saved (ex. image????.bmp)
106 void save_images(std::string file_mask){ 130 void save_images(std::string file_mask){
107 131
stim/image/image.h
@@ -24,6 +24,8 @@ class image{ @@ -24,6 +24,8 @@ class image{
24 size_t Y() const { return R[2]; } 24 size_t Y() const { return R[2]; }
25 size_t C() const { return R[0]; } 25 size_t C() const { return R[0]; }
26 26
  27 + size_t bytes(){ return size() * sizeof(T); }
  28 +
27 void init(){ //initializes all variables, assumes no memory is allocated 29 void init(){ //initializes all variables, assumes no memory is allocated
28 memset(R, 0, sizeof(size_t) * 3); //set the resolution and number of channels to zero 30 memset(R, 0, sizeof(size_t) * 3); //set the resolution and number of channels to zero
29 img = NULL; 31 img = NULL;
@@ -31,6 +33,8 @@ class image{ @@ -31,6 +33,8 @@ class image{
31 33
32 void unalloc(){ //frees any resources associated with the image 34 void unalloc(){ //frees any resources associated with the image
33 if(img) free(img); //if memory has been allocated, free it 35 if(img) free(img); //if memory has been allocated, free it
  36 + img=NULL;
  37 +
34 } 38 }
35 39
36 40
@@ -40,15 +44,17 @@ class image{ @@ -40,15 +44,17 @@ class image{
40 } 44 }
41 45
42 void allocate(){ 46 void allocate(){
43 - img = (T*) malloc( sizeof(T) * R[0] * R[1] * R[2] ); //allocate memory 47 + unalloc();
  48 + img = (T*) malloc( bytes() ); //allocate memory
  49 + memset(img, 0, bytes());
44 } 50 }
45 51
46 void allocate(size_t x, size_t y, size_t c){ //allocate memory based on the resolution 52 void allocate(size_t x, size_t y, size_t c){ //allocate memory based on the resolution
  53 + unalloc();
47 R[0] = c; R[1] = x; R[2] = y; //set the resolution 54 R[0] = c; R[1] = x; R[2] = y; //set the resolution
48 allocate(); //allocate memory 55 allocate(); //allocate memory
49 } 56 }
50 57
51 - size_t bytes(){ return size() * sizeof(T); }  
52 58
53 size_t idx(size_t x, size_t y, size_t c = 0){ 59 size_t idx(size_t x, size_t y, size_t c = 0){
54 return y * C() * X() + x * C() + c; 60 return y * C() * X() + x * C() + c;
@@ -90,24 +96,27 @@ public: @@ -90,24 +96,27 @@ public:
90 96
91 /// Constructor with a filename - loads the specified file 97 /// Constructor with a filename - loads the specified file
92 image(std::string filename){ //constructor initialize the image with an image file 98 image(std::string filename){ //constructor initialize the image with an image file
  99 + init();
93 load(filename); 100 load(filename);
94 } 101 }
95 102
96 /// Create a new image from scratch given a number of samples and channels 103 /// Create a new image from scratch given a number of samples and channels
97 image(size_t x, size_t y = 1, size_t c = 1){ 104 image(size_t x, size_t y = 1, size_t c = 1){
  105 + init();
98 allocate(x, y, c); 106 allocate(x, y, c);
99 } 107 }
100 108
101 /// Create a new image with the data given in 'data' 109 /// Create a new image with the data given in 'data'
102 image(T* data, size_t x, size_t y, size_t c = 1){ 110 image(T* data, size_t x, size_t y, size_t c = 1){
  111 + init();
103 allocate(x, y, c); 112 allocate(x, y, c);
104 memcpy(img, data, bytes()); 113 memcpy(img, data, bytes());
105 } 114 }
106 115
107 /// Copy constructor - duplicates an image object 116 /// Copy constructor - duplicates an image object
108 image(const stim::image<T>& I){ 117 image(const stim::image<T>& I){
  118 + init();
109 allocate(I.X(), I.Y(), I.C()); 119 allocate(I.X(), I.Y(), I.C());
110 - //allocate(I.R[1], I.R[2], I.R[0]);  
111 memcpy(img, I.img, bytes()); 120 memcpy(img, I.img, bytes());
112 } 121 }
113 122
@@ -133,11 +142,18 @@ public: @@ -133,11 +142,18 @@ public:
133 exit(1); 142 exit(1);
134 } 143 }
135 allocate(cvImage.cols, cvImage.rows, cvImage.channels()); //allocate space for the image 144 allocate(cvImage.cols, cvImage.rows, cvImage.channels()); //allocate space for the image
136 - T* cv_ptr = (T*)cvImage.data;  
137 - if(C() == 1) //if this is a single-color image, just copy the data  
138 - memcpy(img, cv_ptr, bytes());  
139 - if(C() == 3) //if this is a 3-color image, OpenCV uses BGR interleaving 145 + T* cv_ptr = (T*) cvImage.data;
  146 + if(C() == 1)
  147 + {
  148 + //if this is a single-color image, just copy the data
  149 + memcpy(img, cv_ptr, bytes());
  150 + }
  151 + if(C() == 3)
  152 + { //if this is a 3-color image, OpenCV uses BGR interleaving
140 set_interleaved_bgr(cv_ptr, X(), Y()); 153 set_interleaved_bgr(cv_ptr, X(), Y());
  154 + }
  155 +
  156 + cvImage.release();
141 } 157 }
142 158
143 //save a file 159 //save a file
@@ -151,16 +167,18 @@ public: @@ -151,16 +167,18 @@ public:
151 get_interleaved_bgr(buffer); 167 get_interleaved_bgr(buffer);
152 cv::Mat cvImage((int)Y(), (int)X(), cv_type(), buffer); 168 cv::Mat cvImage((int)Y(), (int)X(), cv_type(), buffer);
153 cv::imwrite(filename, cvImage); 169 cv::imwrite(filename, cvImage);
  170 + cvImage.release();
  171 + free(buffer);
154 } 172 }
155 173
156 //create an image from an interleaved buffer 174 //create an image from an interleaved buffer
157 - void set_interleaved_rgb(T* buffer, size_t width, size_t height){  
158 - allocate(width, height, 3); 175 + void set_interleaved_rgb(T* buffer, size_t width, size_t height, size_t channels = 3){
  176 + allocate(width, height, channels);
159 memcpy(img, buffer, bytes()); 177 memcpy(img, buffer, bytes());
160 } 178 }
161 179
162 - void set_interleaved_bgr(T* buffer, size_t width, size_t height){  
163 - allocate(width, height, 3); 180 + void set_interleaved_bgr(T* buffer, size_t width, size_t height, size_t channels = 3){
  181 + allocate(width, height, channels);
164 for(size_t c = 0; c < C(); c++){ //copy directly 182 for(size_t c = 0; c < C(); c++){ //copy directly
165 for(size_t y = 0; y < Y(); y++){ 183 for(size_t y = 0; y < Y(); y++){
166 for(size_t x = 0; x < X(); x++){ 184 for(size_t x = 0; x < X(); x++){
@@ -340,6 +358,34 @@ public: @@ -340,6 +358,34 @@ public:
340 358
341 return r; //return the inverted image 359 return r; //return the inverted image
342 } 360 }
  361 +
  362 + /// Invert an image by calculating I1 = alpha - I0, where alpha is the maximum image value
  363 + image<T> invert(){
  364 + size_t N = size(); //calculate the total number of values in the image
  365 + image<T> r(X(), Y(), C()); //allocate space for the resulting image
  366 + T white_val = maxv();
  367 + for(size_t n = 0; n < N; n++)
  368 + r.img[n] = white_val - img[n]; //perform the inversion
  369 +
  370 + return r; //return the inverted image
  371 + }
  372 +
  373 + ///crops the image from x1 to x0 and y1 to y0 and returns a new (smaller) image.
  374 + image<T> crop(int x0, int x1, int y0, int y1)
  375 + {
  376 +
  377 + image<T> ret(x1-x0, y1-y0, C());
  378 + int newWidth = x1-x0;
  379 + int destidx, srcidx;
  380 + ///for each row, cut what amount of data from the original and put it into the new copy.
  381 + for(int i = 0; i < (y1-y0); i++)
  382 + {
  383 + destidx = i*newWidth*C(); ///destination index one per each row
  384 + srcidx = ((i+(y0))*X()+x0)*C(); ///source index, one per each row.
  385 + memcpy(&ret.img[destidx], &img[srcidx], sizeof(T)*newWidth*C());
  386 + }
  387 + return ret;
  388 + }
343 389
344 image<T> srgb2lab(){ 390 image<T> srgb2lab(){
345 std::cout<<"ERROR stim::image::srgb2lab - function has been broken, re-implement."<<std::endl; 391 std::cout<<"ERROR stim::image::srgb2lab - function has been broken, re-implement."<<std::endl;
@@ -358,6 +404,7 @@ public: @@ -358,6 +404,7 @@ public:
358 exit(1); 404 exit(1);
359 } 405 }
360 406
  407 +
361 // leila's code for non_interleaving data in 3D 408 // leila's code for non_interleaving data in 3D
362 //create an data set from an interleaved buffer 409 //create an data set from an interleaved buffer
363 void set_interleaved3(T* buffer, size_t width, size_t height, size_t depth, size_t channels = 3){ 410 void set_interleaved3(T* buffer, size_t width, size_t height, size_t depth, size_t channels = 3){