rtsImage.h
5.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include "rtsFunction3D.h"
#include "cimg/cimg.h"
#include <string>
#include <sstream>
#include <iomanip>
using namespace std;
using namespace cimg_library;
///This file contains a series of functions useful for loading images into other structures. These function use the CImg header file.
void rts_cimgLoadImage(rtsFunction3D<unsigned char>& result, const char* filename) ///<This function loads an image and store it in an Implicit3D object.
{
CImg<unsigned char> image(filename), visu(500,400,1,3,0);
result = rtsFunction3D<unsigned char>(image.width, image.height, 1);
unsigned int x, y;
for(x=0; x<image.width; x++)
for(y=0; y<image.height; y++)
{
result(x, y, 0) = image(x, y);
}
}
void rts_cimgSaveImage(rtsFunction3D<unsigned char>& result, int z, const char* filename)
{
CImg<unsigned char> image(result.DimX(), result.DimY());
unsigned int x, y;
for(x=0; x<image.width; x++)
for(y=0; y<image.height; y++)
image(x, y) = result(x, y, z);
image.save(filename);
}
void rts_cimgLoadImageSequence(rtsFunction3D<unsigned char>& result, const char* filename, unsigned int min, unsigned int max, unsigned int color = 0)
{
/**
This function loads a sequence of images into a 3D implicit function. The filename is passed using the '?' wild
card. The wild cards are then replaced with the given min through max values in order to construct the names
for the image files to be loaded. The files are then loaded and placed in sequential order along the z-axis
of the implicit function.
**/
string sequence_name = filename; //turn the filename into a string
unsigned int wild_card_begin = sequence_name.find_first_of('?'); //find the start and end indices of the wild card
unsigned int wild_card_end = sequence_name.find_last_of('?');
unsigned int max_number_length = wild_card_end - wild_card_begin + 1; //find the maximum number of characters in the image number
unsigned int max_number = (unsigned int)pow((double)10, (double)max_number_length) - 1; //find the maximum possible number
//make sure that the data is given correctly
if(max < min) return;
if(max > max_number) max = max_number;
//create an array of file names
int num_images = max - min + 1; //compute the number of images
bool implicit_created = false;
for(int i=0; i<num_images; i++)
{
ostringstream format_stream; //create a stream for number formatting
format_stream.fill('0'); //the frame name will be right justified with proceeding zeroes
format_stream<<setw(max_number_length); //specify the length of the frame name (based on the wild cards)
format_stream<<i+min; //put the number in the stream, convert it to a string
string frame_name = format_stream.str();
string file_name = sequence_name; //create the file name for the current frame
file_name.replace(wild_card_begin, max_number_length, frame_name);
CImg<unsigned char> image(file_name.c_str()); //load the frame
if(implicit_created == false) //create the implicit function for the first frame
{
result = rtsFunction3D<unsigned char>(image.width, image.height, num_images);
implicit_created = true;
}
//place the frame in the implicit function
unsigned int x, y;
for(x=0; x<image.width; x++)
for(y=0; y<image.height; y++)
result(x, y, i) = image(x, y, color);
}
}
void rts_cimgSaveImageSequence(rtsFunction3D<unsigned char>& result, const char* filename)
{
string sequence_name = filename; //turn the filename into a string
unsigned int wild_card_begin = sequence_name.find_first_of('?'); //find the start and end indices of the wild card
unsigned int wild_card_end = sequence_name.find_last_of('?');
unsigned int max_number_length = wild_card_end - wild_card_begin + 1; //find the maximum number of characters in the image number
unsigned int max_number = (unsigned int)pow((double)10, (double)max_number_length) - 1; //find the maximum possible number
//make sure that the data is given correctly
unsigned int max = result.DimZ();
if(max > max_number) max = max_number;
//save each individual file
int num_images = max; //compute the number of images
CImg<unsigned char> image(result.DimX(), result.DimY()); //create an image for saving
for(int i=0; i<num_images; i++) //determine the filename and save the image
{
ostringstream format_stream; //create a stream for number formatting
format_stream.fill('0'); //the frame name will be right justified with proceeding zeroes
format_stream<<setw(max_number_length); //specify the length of the frame name (based on the wild cards)
format_stream<<i; //put the number in the stream, convert it to a string
string frame_name = format_stream.str();
string file_name = sequence_name; //create the file name for the current frame
file_name.replace(wild_card_begin, max_number_length, frame_name);
//fill the image with the implicit data at the current z coordinate
unsigned int x, y;
for(x=0; x<image.width; x++)
for(y=0; y<image.height; y++)
image(x, y) = result(x, y, i);
//save the file
image.save(file_name.c_str());
}
}
void rts_cimgDisplayFunction3D(rtsFunction3D<unsigned char> source, unsigned int z)
{
CImg<unsigned char> image(source.DimX(), source.DimY());
int x, y;
for(x=0; x<image.width; x++)
for(y=0; y<image.height; y++)
image(x, y) = source(x, y, z);
CImgDisplay main_disp(image,"loaded image");
while (!main_disp.is_closed)
main_disp.wait();
}