File: imagefile.h

package info (click to toggle)
ctsim 4.5.2-1.1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 6,536 kB
  • ctags: 3,720
  • sloc: cpp: 26,768; sh: 3,691; ansic: 1,254; perl: 296; makefile: 263
file content (246 lines) | stat: -rw-r--r-- 8,802 bytes parent folder | download | duplicates (2)
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
/*****************************************************************************
** FILE IDENTIFICATION
**
**	Name:	      imagefile.h
**      Purpose:      imagefile class header
**	Programmer:   Kevin Rosenberg
**	Date Started: June 2000
**
**  This is part of the CTSim program
**  Copyright (c) 1983-2001 Kevin Rosenberg
**
**  $Id: imagefile.h 7061 2003-09-07 06:34:45Z kevin $
**
**  This program is free software; you can redistribute it and/or modify
**  it under the terms of the GNU General Public License (version 2) as
**  published by the Free Software Foundation.
**
**  This program is distributed in the hope that it will be useful,
**  but WITHOUT ANY WARRANTY; without even the implied warranty of
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
**  GNU General Public License for more details.
**
**  You should have received a copy of the GNU General Public License
**  along with this program; if not, write to the Free Software
**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
******************************************************************************/

#ifndef IMAGEFILE_H
#define IMAGEFILE_H

#ifndef MSVC
#include <unistd.h>
#endif
#include <string>
#include <sys/types.h>
#include <fstream>
#include <iostream>
#include "ctsupport.h"
#include "fnetorderstream.h"
#include "array2dfile.h"

#ifdef HAVE_MPI
#include <mpi++.h>
#endif

class F32Image : public Array2dFile
{
public:
  F32Image (int nx, int ny, int dataType = Array2dFile::DATA_TYPE_REAL);     
  F32Image (void);

  kfloat32** getArray (void)
      { return (kfloat32**) (m_arrayData); }

  kfloat32** const getArray (void) const
       { return (kfloat32** const) (m_arrayData); }

  kfloat32** getImaginaryArray (void)
      { return (kfloat32**) (m_imaginaryArrayData); }

  kfloat32** const getImaginaryArray (void) const
       { return (kfloat32** const) (m_imaginaryArrayData); }

#ifdef HAVE_MPI
  MPI::Datatype getMPIDataType (void) const
      { return MPI::FLOAT; }
#endif

 private:
  F32Image (const F32Image& rhs);             //copy constructor
  F32Image& operator= (const F32Image& rhs);  // assignment operator
};


class F64Image : public Array2dFile
{
 public:

   F64Image (int nx, int ny, int dataType = Array2dFile::DATA_TYPE_REAL);
  F64Image (void);

  kfloat64** getArray (void)
      { return (kfloat64**) (m_arrayData); }

  kfloat64** const getArray (void) const
      { return (kfloat64** const) (m_arrayData); }

  kfloat64** getImaginaryArray (void)
      { return (kfloat64**) (m_imaginaryArrayData); }

  kfloat64** const getImaginaryArray (void) const
      { return (kfloat64** const) (m_imaginaryArrayData); }

#ifdef HAVE_MPI
  MPI::Datatype getMPIDataType (void) const
      { return MPI::DOUBLE; }
#endif
 private:
  F64Image (const F64Image& rhs);             //copy constructor
  F64Image& operator= (const F64Image& rhs);  // assignment operator
};

#undef IMAGEFILE_64_BITS
#ifdef IMAGEFILE_64_BITS
typedef F64Image   ImageFileBase;
typedef kfloat64   ImageFileValue;
typedef kfloat64*  ImageFileColumn;
typedef kfloat64** ImageFileArray;
typedef kfloat64** const ImageFileArrayConst;
typedef const kfloat64* ImageFileColumnConst;
#else
typedef F32Image   ImageFileBase;
typedef kfloat32   ImageFileValue;
typedef kfloat32*  ImageFileColumn;
typedef kfloat32** ImageFileArray;
typedef kfloat32** const ImageFileArrayConst;
typedef const kfloat32* ImageFileColumnConst;
#endif



class ImageFile : public ImageFileBase
{
private:

  static const char* s_aszExportFormatName[];
  static const char* s_aszExportFormatTitle[];
  static const int s_iExportFormatCount;
  static const char* s_aszImportFormatName[];
  static const char* s_aszImportFormatTitle[];
  static const int s_iImportFormatCount;

  static void skipSpacePPM (FILE* fp); // skip space in a ppm file

public:

  static const int EXPORT_FORMAT_INVALID;
  static const int IMPORT_FORMAT_INVALID;
  static const int EXPORT_FORMAT_TEXT;
  static const int EXPORT_FORMAT_PGM;
  static const int EXPORT_FORMAT_PGMASCII;
  static const int IMPORT_FORMAT_PPM;
#if HAVE_PNG
  static const int EXPORT_FORMAT_PNG;
  static const int EXPORT_FORMAT_PNG16;
  static const int IMPORT_FORMAT_PNG;
#endif
#if HAVE_CTN_DICOM
  static const int EXPORT_FORMAT_DICOM;
  static const int IMPORT_FORMAT_DICOM;
#endif
  static const int EXPORT_FORMAT_RAW;

  static const int getExportFormatCount() {return s_iExportFormatCount;}
  static const char** getExportFormatNameArray() {return s_aszExportFormatName;}
  static const char** getExportFormatTitleArray() {return s_aszExportFormatTitle;}
  static int convertExportFormatNameToID (const char* const ExportFormatName);
  static const char* convertExportFormatIDToName (const int ExportFormatID);
  static const char* convertExportFormatIDToTitle (const int ExportFormatID);

  static const int getImportFormatCount() {return s_iImportFormatCount;}
  static const char** getImportFormatNameArray() {return s_aszImportFormatName;}
  static const char** getImportFormatTitleArray() {return s_aszImportFormatTitle;}
  static int convertImportFormatNameToID (const char* const ImportFormatName);
  static const char* convertImportFormatIDToName (const int ImportFormatID);
  static const char* convertImportFormatIDToTitle (const int ImportFormatID);

  static const double s_dRedGrayscaleFactor;
  static const double s_dGreenGrayscaleFactor;
  static const double s_dBlueGrayscaleFactor;

  ImageFile (int nx, int ny)
      : ImageFileBase (nx, ny)
  {}

  ImageFile (void)
      : ImageFileBase ()
  {}

  void getCenterCoordinates (unsigned int& iXCenter, unsigned int& iYCenter);

  bool convertRealToComplex ();
  bool convertComplexToReal ();

  void filterResponse (const char* const domainName, double bw, const char* const filterName, double filt_param, double dInputScale = 1., double dOutputScale = 1.);

  void statistics (double& min, double& max, double& mean, double& mode, double& median, double& stddev) const;
  void statistics (ImageFileArrayConst v, double& min, double& max, double& mean, double& mode, double& median, double& stddev) const;
  void getMinMax (double& min, double& max) const;
  void printStatistics (std::ostream& os) const;
  bool comparativeStatistics (const ImageFile& imComp, double& d, double& r, double& e) const;
  bool printComparativeStatistics (const ImageFile& imComp, std::ostream& os) const;

  bool subtractImages (const ImageFile& rRHS, ImageFile& result) const;
  bool addImages (const ImageFile& rRHS, ImageFile& result) const;
  bool multiplyImages (const ImageFile& rRHS, ImageFile& result) const;
  bool divideImages (const ImageFile& rRHS, ImageFile& result) const;

  bool scaleImage (ImageFile& result) const;

  bool invertPixelValues (ImageFile& result) const;
  bool sqrt (ImageFile& result) const;
  bool square (ImageFile& result) const;
  bool log (ImageFile& result) const;
  bool exp (ImageFile& result) const;
  bool fourier (ImageFile& result) const;
  bool inverseFourier (ImageFile& result) const;
#ifdef HAVE_FFTW
  bool fft (ImageFile& result) const;
  bool ifft (ImageFile& result) const;
  bool fftRows (ImageFile& result) const;
  bool ifftRows (ImageFile& result) const;
  bool fftCols (ImageFile& result) const;
  bool ifftCols (ImageFile& result) const;
#endif
  bool magnitude (ImageFile& result) const;
  bool phase (ImageFile& result) const;
  bool real (ImageFile& result) const;
  bool imaginary (ImageFile& result) const;

  bool exportImage (const char* const pszFormat, const char* const pszFilename, int nxcell, int nycell, double densmin, double densmax);

  bool importImage (const char* const pszFormat, const char* const pszFilename);

#ifdef HAVE_PNG
  bool writeImagePNG (const char* const outfile, int bitdepth, int nxcell, int nycell, double densmin, double densmax);
  bool readImagePNG (const char* const pszFile);
#endif
#ifdef HAVE_GD
  bool writeImageGIF (const char* const outfile, int nxcell, int nycell, double densmin, double densmax);
#endif
  bool writeImagePGM (const char* const outfile, int nxcell, int nycell, double densmin, double densmax);
  bool writeImagePGMASCII (const char* const outfile, int nxcell, int nycell, double densmin, double densmax);
  bool readImagePPM (const char* const pszFile);
  bool writeImageRaw(const char* const outfile, int nxcell, int nycell);
  bool writeImageText (const char* const outfile);

  static double redGrayscaleFactor() {return s_dRedGrayscaleFactor;}
  static double greenGrayscaleFactor() {return s_dGreenGrayscaleFactor;}
  static double blueGrayscaleFactor() {return s_dBlueGrayscaleFactor;}
  static double colorToGrayscale (double r, double g, double b) 
  { return r * s_dRedGrayscaleFactor + g * s_dGreenGrayscaleFactor + b * s_dBlueGrayscaleFactor; }
};


#endif