TODO
Read PlotFile's.
-
+ Add to ctsim export of imagefiles to standard graphic formats.
+ Use FFTW library in imagefile.cpp
3.0alpha1 - Released 12/30/00
files.
* ctsim: Added "Process" menu to image file display with math
- functions. Added 2-dimensional inverse Fourier to math functions.
+ functions. Added 2-dimensional inverse Fourier to math
+ functions. Added support for complex (real/imaginary) images.
* mathfuncs.cpp: Reworked statistics algorithm to share between
imagefile and plotfile classes.
* imagefile.cpp: Fixed scaling bug when rasterizing Phantom with
nsamples > 2. Added generic mage math functions, moved from
- if1.cpp and if2.cpp to imagefile.cpp
+ if1.cpp and if2.cpp to imagefile.cpp. Added support complex
+ images.
+
+ * array2dfile.cpp: Added code to support complex (real/imaginary)
+ images.
* if1: Updated to handle error conditions, such as sqrt of a
negative number. Converted to use new ImageFile math functions.
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: array2dfile.h,v 1.12 2000/12/16 06:12:47 kevin Exp $
+** $Id: array2dfile.h,v 1.13 2000/12/29 19:30:08 kevin Exp $
**
** 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
PIXEL_FLOAT32 = 7,
PIXEL_FLOAT64 = 8,
};
-
- Array2dFile (int nx, int ny, int pixelSize, int pixelFormat = PIXEL_INVALID);
+\r
+ enum {\r
+ DATA_TYPE_INVALID = 0,\r
+ DATA_TYPE_REAL,\r
+ DATA_TYPE_COMPLEX,\r
+ };\r
+
+ Array2dFile (int nx, int ny, int pixelSize, int pixelFormat = PIXEL_INVALID, int dataType = DATA_TYPE_REAL);
Array2dFile (void);
~Array2dFile ();
- void setArraySize (int nx, int ny, int pixelSize, int pixelFormat = PIXEL_INVALID);
+ void setArraySize (int nx, int ny, int pixelSize, int pixelFormat = PIXEL_INVALID, int dataType = DATA_TYPE_REAL);
void setArraySize (int nx, int ny);
kuint32 ny (void) const
{ return m_ny; }
+\r
+ int dataType () const\r
+ { return static_cast<int>(m_dataType); }\r
+\r
+ void setDataType (int dataType)\r
+ { m_dataType = dataType; }\r
void setAxisIncrement (double axisIncX, double axisIncY);
- void setAxisExtent (double minX, double maxX, double minY, double maxY);
+ bool reallocRealToComplex ();\r
+\r
+ bool reallocComplexToReal ();\r
- void getPixelValueRange (double& pvmin, double& pvmax) const;
+ void getPixelValueRange (double& pvmin, double& pvmax) const;\r
+ void setAxisExtent (double minX, double maxX, double minY, double maxY);
void doPixelOffsetScale (double offset, double scale);
kuint32 m_ny;
kuint32 m_arraySize;
labelContainer m_labels;
- kuint16 m_numFileLabels;
+ kuint16 m_numFileLabels;\r
+ kuint16 m_dataType;
unsigned char** m_arrayData;
+ unsigned char** m_imaginaryArrayData;\r
private:
void init (void);
bool labelSeek (int label_num);
- void allocArray (void);
-
- void freeArray (void);
+ void allocArrays ();
+ void freeArrays ();
+\r
+ void allocArray (unsigned char**& rppData);\r
+ void freeArray (unsigned char**& rppData);\r
Array2dFile (const Array2dFile& rhs); // copy constructor
Array2dFile& operator= (const Array2dFile&); // assignment operator
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: imagefile.h,v 1.24 2000/12/29 15:45:06 kevin Exp $
+** $Id: imagefile.h,v 1.25 2000/12/29 19:30:08 kevin Exp $
**
** 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
class F32Image : public Array2dFile
{
public:
- F32Image (int nx, int ny);
+ F32Image (int nx, int ny, int dataType = Array2dFile::DATA_TYPE_REAL);
F32Image (void);\r
- kfloat32** getArray (void)
- { return (kfloat32**) (m_arrayData); }
-
- kfloat32** const getArray (void) const
- { return (kfloat32** const) (m_arrayData); }
-
+ kfloat32** getArray (void)\r
+ { return (kfloat32**) (m_arrayData); }\r
+\r
+ kfloat32** const getArray (void) const\r
+ { return (kfloat32** const) (m_arrayData); }\r
+\r
+ kfloat32** getImaginaryArray (void)\r
+ { return (kfloat32**) (m_imaginaryArrayData); }\r
+\r
+ kfloat32** const getImaginaryArray (void) const\r
+ { return (kfloat32** const) (m_imaginaryArrayData); }\r
+\r
#ifdef HAVE_MPI
MPI::Datatype getMPIDataType (void) const
{ return MPI::FLOAT; }
{
public:
- F64Image (int nx, int ny);
+ 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** getArray (void)\r
+ { return (kfloat64**) (m_arrayData); }\r
+\r
+ kfloat64** const getArray (void) const\r
+ { return (kfloat64** const) (m_arrayData); }\r
+\r
+ kfloat64** getImaginaryArray (void)\r
+ { return (kfloat64**) (m_imaginaryArrayData); }\r
+\r
+ kfloat64** const getImaginaryArray (void) const\r
+ { return (kfloat64** const) (m_imaginaryArrayData); }\r
+\r
#ifdef HAVE_MPI
MPI::Datatype getMPIDataType (void) const
{ return MPI::DOUBLE; }
ImageFile (void)
: ImageFileBase ()
{}
+\r
+ bool convertRealToComplex ();\r
+ bool convertComplexToReal ();\r
void filterResponse (const char* const domainName, double bw, const char* const filterName, double filt_param);
- void statistics (double& min, double& max, double& mean, double& mode, double& median, double& stddev) const;
+ void statistics (double& min, double& max, double& mean, double& mode, double& median, double& stddev) const;\r
+ void statistics (ImageFileArrayConst& v, double& min, double& max, double& mean, double& mode, double& median, double& stddev) const;\r
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 square (ImageFile& result) const;\r
bool log (ImageFile& result) const;\r
bool exp (ImageFile& result) const;\r
- bool FFTMagnitude (ImageFile& result) const;\r
- bool FFTPhase (ImageFile& result) const;\r
+ bool fourier (ImageFile& result) const;\r
+ bool inverseFourier (ImageFile& result) const;\r
+ bool magnitude (ImageFile& result) const;\r
+ bool phase (ImageFile& result) const;\r
\r
int display (void) const;
int displayScaling (const int scaleFactor, ImageFileValue pmin, ImageFileValue pmax) const;
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: array2dfile.cpp,v 1.21 2000/12/16 06:12:47 kevin Exp $
+** $Id: array2dfile.cpp,v 1.22 2000/12/29 19:30:08 kevin Exp $
**
** 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
void
Array2dFileLabel::init (void)
{
- m_calcTime = 0;
- m_labelType = L_EMPTY;
- time_t t = time(0);
- tm* lt = localtime(&t);
- m_year = lt->tm_year;
- m_month = lt->tm_mon;
- m_day = lt->tm_mday;
- m_hour = lt->tm_hour;
- m_minute = lt->tm_min;
- m_second = lt->tm_sec;
+ m_calcTime = 0;
+ m_labelType = L_EMPTY;
+ time_t t = time(0);
+ tm* lt = localtime(&t);
+ m_year = lt->tm_year;
+ m_month = lt->tm_mon;
+ m_day = lt->tm_mday;
+ m_hour = lt->tm_hour;
+ m_minute = lt->tm_min;
+ m_second = lt->tm_sec;
}
Array2dFileLabel::Array2dFileLabel()
{
- init();
+ init();
}
Array2dFileLabel::Array2dFileLabel(const char* const str, double ctime)
- : m_strLabel (str)
+: m_strLabel (str)
{
- init();
-
- m_labelType = L_USER;
- m_calcTime = ctime;
+ init();
+
+ m_labelType = L_USER;
+ m_calcTime = ctime;
}
Array2dFileLabel::Array2dFileLabel(const int type, const char* const str, double ctime)
- : m_strLabel (str)
+: m_strLabel (str)
{
- init();
-
- m_labelType = type;
- m_calcTime = ctime;
+ init();
+
+ m_labelType = type;
+ m_calcTime = ctime;
}
Array2dFileLabel::~Array2dFileLabel()
{
char szDate [128];\r
snprintf (szDate, sizeof(szDate), "%2d/%02d/%4d %02d:%02d:%02d",\r
- m_month + 1, m_day, m_year + 1900, m_hour, m_minute, m_second);
+ m_month + 1, m_day, m_year + 1900, m_hour, m_minute, m_second);
m_strDate = szDate;
return m_strDate;
}
Array2dFileLabel::Array2dFileLabel (const Array2dFileLabel& rhs)
{
- m_calcTime = rhs.m_calcTime;
- m_labelType = rhs.m_labelType;
- m_strLabel = rhs.m_strLabel;
- m_year = rhs.m_year; m_month = rhs.m_month; m_day = rhs.m_day;
- m_hour = rhs.m_hour; m_minute = rhs.m_minute; m_second = rhs.m_second;
+ m_calcTime = rhs.m_calcTime;
+ m_labelType = rhs.m_labelType;
+ m_strLabel = rhs.m_strLabel;
+ m_year = rhs.m_year; m_month = rhs.m_month; m_day = rhs.m_day;
+ m_hour = rhs.m_hour; m_minute = rhs.m_minute; m_second = rhs.m_second;
}
Array2dFileLabel&
Array2dFileLabel::operator= (const Array2dFileLabel& rhs)
{
- m_calcTime = rhs.m_calcTime;
- m_labelType = rhs.m_labelType;
- m_strLabel = rhs.m_strLabel;
- m_year = rhs.m_year; m_month = rhs.m_month; m_day = rhs.m_day;
- m_hour = rhs.m_hour; m_minute = rhs.m_minute; m_second = rhs.m_second;
-
- return (*this);
+ m_calcTime = rhs.m_calcTime;
+ m_labelType = rhs.m_labelType;
+ m_strLabel = rhs.m_strLabel;
+ m_year = rhs.m_year; m_month = rhs.m_month; m_day = rhs.m_day;
+ m_hour = rhs.m_hour; m_minute = rhs.m_minute; m_second = rhs.m_second;
+
+ return (*this);
}
void
Array2dFileLabel::print (std::ostream& os) const
{
if (m_labelType == L_HISTORY) {
- os << "History: " << std::endl;
+ os << "History: " << std::endl;
os << " " << m_strLabel << std::endl;
os << " calc time = " << m_calcTime << " secs" << std::endl;
os << " Timestamp = " << getDateString() << std::endl;
///////////////////////////////////////////////////////////////////////////
-Array2dFile::Array2dFile (int x, int y, int pixelSize, int pixelFormat)
+Array2dFile::Array2dFile (int x, int y, int pixelSize, int pixelFormat, int dataType)
{
- init();
- setArraySize (x, y, pixelSize, pixelFormat);
+ init();
+ setArraySize (x, y, pixelSize, pixelFormat, dataType);
}
Array2dFile::~Array2dFile (void)
{
- freeArray ();
- for (labelIterator l = m_labels.begin(); l != m_labels.end(); l++)
- delete *l;
+ freeArrays ();
+ for (labelIterator l = m_labels.begin(); l != m_labels.end(); l++)
+ delete *l;
}
Array2dFile::Array2dFile (void)
{
- init();
+ init();
}
void
{
m_pixelSize = 0;
m_pixelFormat = PIXEL_INVALID;
- m_arrayData = NULL;
+ m_arrayData = NULL;\r
+ m_imaginaryArrayData = NULL;\r
+ m_dataType = DATA_TYPE_INVALID;
m_nx = 0;
m_ny = 0;
m_headersize = 0;
void
-Array2dFile::setArraySize (int x, int y, int pixelSize, int pixelFormat)
+Array2dFile::setArraySize (int x, int y, int pixelSize, int pixelFormat, int dataType)
{
- m_pixelSize = pixelSize;
- m_pixelFormat = pixelFormat;
- setArraySize (x, y);
+ m_pixelSize = pixelSize;
+ m_pixelFormat = pixelFormat;\r
+ m_dataType = dataType;
+ setArraySize (x, y);
}
void
Array2dFile::setArraySize (int x, int y)
{
- m_nx = x;
- m_ny = y;
- allocArray ();
-}
+ m_nx = x;
+ m_ny = y;
+ allocArrays ();
+}\r
+\r
+bool\r
+Array2dFile::reallocComplexToReal ()\r
+{\r
+ if (m_dataType != DATA_TYPE_COMPLEX)\r
+ return false;\r
+\r
+ freeArray (m_imaginaryArrayData);\r
+ m_dataType = DATA_TYPE_REAL;\r
+\r
+ return true;\r
+}\r
+\r
+\r
+bool\r
+Array2dFile::reallocRealToComplex ()\r
+{\r
+ if (m_dataType != DATA_TYPE_REAL)\r
+ return false;\r
+\r
+ allocArray (m_imaginaryArrayData);\r
+ m_dataType = DATA_TYPE_COMPLEX;\r
+\r
+ return true;\r
+}\r
+\r
+
void
-Array2dFile::allocArray (void)
+Array2dFile::allocArrays ()
{
- if (m_arrayData)
- freeArray();
-
- m_arraySize = m_nx * m_ny * m_pixelSize;
- m_arrayData = new unsigned char* [m_nx];
-
- int columnBytes = m_ny * m_pixelSize;
- for (unsigned int i = 0; i < m_nx; i++)
- m_arrayData[i] = new unsigned char [columnBytes];
+ if (m_arrayData) \r
+ freeArray (m_arrayData);\r
+ if (m_imaginaryArrayData)\r
+ freeArray (m_imaginaryArrayData);\r
+\r
+ allocArray (m_arrayData);\r
+ if (m_dataType == DATA_TYPE_COMPLEX)\r
+ allocArray (m_imaginaryArrayData);\r
+}\r
+\r
+void\r
+Array2dFile::allocArray (unsigned char**& rppData)\r
+{\r
+ m_arraySize = m_nx * m_ny * m_pixelSize;
+ rppData = new unsigned char* [m_nx];\r
+ int columnBytes = m_ny * m_pixelSize;
+ for (unsigned int i = 0; i < m_nx; i++)
+ rppData[i] = new unsigned char [columnBytes];\r
}
void
-Array2dFile::freeArray (void)
-{
- if (m_arrayData) {
- for (unsigned int i = 0; i < m_nx; i++)
- delete m_arrayData[i];
- delete m_arrayData;
- m_arrayData = NULL;
- }
-}
+Array2dFile::freeArrays ()
+{
+ if (m_arrayData) \r
+ freeArray (m_arrayData);\r
+ \r
+ if (m_imaginaryArrayData) \r
+ freeArray (m_imaginaryArrayData);\r
+ \r
+}\r
+\r
+void\r
+Array2dFile::freeArray (unsigned char**& rppData)\r
+{\r
+ for (unsigned int i = 0; i < m_nx; i++)\r
+ delete rppData[i];\r
+ delete rppData;\r
+ rppData = NULL;\r
+}\r
+\r
bool
Array2dFile::fileWrite (const std::string& filename)
bool
Array2dFile::fileWrite (const char* const filename)
{
- m_filename = filename;
-
- frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::trunc | std::ios::binary);
- if (fs.fail()) {
- sys_error (ERR_WARNING, "Error opening file %s for writing [fileCreate]", m_filename.c_str());
- return false;
- }
- if (! headerWrite(fs))
- return false;
-
- if (! arrayDataWrite (fs))
- return false;
-
- if (! labelsWrite (fs))
- return false;
-
- return true;
+ m_filename = filename;
+
+ frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::trunc | std::ios::binary);
+ if (fs.fail()) {
+ sys_error (ERR_WARNING, "Error opening file %s for writing [fileCreate]", m_filename.c_str());
+ return false;
+ }
+ if (! headerWrite(fs))
+ return false;
+
+ if (! arrayDataWrite (fs))
+ return false;
+
+ if (! labelsWrite (fs))
+ return false;
+
+ return true;
}
bool
bool
Array2dFile::fileRead (const char* const filename)
{
- m_filename = filename;
-
+ m_filename = filename;
+
#ifdef MSVC\r
- frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::binary);\r
+ frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::binary);\r
#else\r
- frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::binary | std::ios::nocreate);\r
+ frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::binary | std::ios::nocreate);\r
#endif\r
- if (fs.fail()) {
- sys_error (ERR_WARNING, "Unable to open file %s [fileRead]", m_filename.c_str());
- return false;
- }
-
- if (! headerRead(fs))
- return false;
-
- allocArray ();
-
- if (! arrayDataRead(fs))
- return false;;
-
- if (! labelsRead (fs))
- return false;
-
- return true;
+ if (fs.fail()) {
+ sys_error (ERR_WARNING, "Unable to open file %s [fileRead]", m_filename.c_str());
+ return false;
+ }
+
+ if (! headerRead(fs))
+ return false;
+
+ allocArrays ();
+
+ if (! arrayDataRead(fs))
+ return false;;
+
+ if (! labelsRead (fs))
+ return false;
+
+ return true;
}
void
void
Array2dFile::setAxisExtent (double minX, double maxX, double minY, double maxY)
{
- m_axisExtentKnown = true;
- m_minX = minX;
- m_maxY = maxX;
- m_minX = minX;
- m_maxY = maxY;
+ m_axisExtentKnown = true;
+ m_minX = minX;
+ m_maxY = maxX;
+ m_minX = minX;
+ m_maxY = maxY;
}
bool
sys_error (ERR_WARNING, "Tried to read header with file closed [headerRead]");
return false;
}
-
+
fs.seekg (0);
kuint16 file_signature;
-
+
fs.readInt16 (m_headersize);
fs.readInt16 (file_signature);
fs.readInt16 (m_pixelFormat);
fs.readInt16 (m_pixelSize);
fs.readInt16 (m_numFileLabels);
fs.readInt32 (m_nx);
- fs.readInt32 (m_ny);
+ fs.readInt32 (m_ny);\r
+ fs.readInt16 (m_dataType);
fs.readInt16 (m_axisIncrementKnown);
fs.readFloat64 (m_axisIncrementX);
fs.readFloat64 (m_axisIncrementY);
fs.readFloat64 (m_maxY);
fs.readFloat64 (m_offsetPV);
fs.readFloat64 (m_scalePV);
-
+
int read_m_headersize = fs.tellg();
if (read_m_headersize != m_headersize) {
sys_error (ERR_WARNING, "Read m_headersize %d != file m_headersize %d", read_m_headersize, m_headersize);
sys_error (ERR_WARNING, "File signature %d != true signature %d", file_signature, m_signature);
return false;
}
-
+
return true;
}
sys_error (ERR_WARNING, "Tried to write header with ! fs");
return false;
}
-
+
m_numFileLabels = m_labels.size();
-
+
fs.seekp (0);
fs.writeInt16 (m_headersize);
fs.writeInt16 (m_signature);
fs.writeInt16 (m_pixelSize);
fs.writeInt16 (m_numFileLabels);
fs.writeInt32 (m_nx);
- fs.writeInt32 (m_ny);
+ fs.writeInt32 (m_ny);\r
+ fs.writeInt16 (m_dataType);
fs.writeInt16 (m_axisIncrementKnown);
fs.writeFloat64 (m_axisIncrementX);
fs.writeFloat64 (m_axisIncrementY);
fs.writeFloat64 (m_maxY);
fs.writeFloat64 (m_offsetPV);
fs.writeFloat64 (m_scalePV);
-
+
m_headersize = static_cast<kuint16>(fs.tellp());
fs.seekp (0);
fs.writeInt16 (m_headersize);
sys_error (ERR_WARNING, "Tried to arrayDataWrite with !fs");
return false;
}
-
+
if (! m_arrayData)
- return false;
-
+ return false;
+
fs.seekp (m_headersize);
int columnSize = m_ny * m_pixelSize;
- for (unsigned int ix = 0; ix < m_nx; ix++) {
- unsigned char* ptrColumn = m_arrayData[ix];
- if (NativeBigEndian()) {
- for (unsigned int iy = 0; iy < m_ny; iy++) {
- ConvertReverseNetworkOrder (ptrColumn, m_pixelSize);
- fs.write (reinterpret_cast<const char*>(ptrColumn), m_pixelSize);
- ptrColumn += m_pixelSize;
- }
- } else
- fs.write (reinterpret_cast<const char*>(ptrColumn), columnSize);
- }
-
+ for (unsigned int ix = 0; ix < m_nx; ix++) {\r
+ unsigned char* ptrColumn = m_arrayData[ix];\r
+ if (NativeBigEndian()) {\r
+ for (unsigned int iy = 0; iy < m_ny; iy++) {\r
+ ConvertReverseNetworkOrder (ptrColumn, m_pixelSize);\r
+ fs.write (reinterpret_cast<const char*>(ptrColumn), m_pixelSize);\r
+ ptrColumn += m_pixelSize;\r
+ }\r
+ } else \r
+ fs.write (reinterpret_cast<const char*>(ptrColumn), columnSize);\r
+ }\r
+ if (m_dataType == DATA_TYPE_COMPLEX) {\r
+ for (unsigned int ix = 0; ix < m_nx; ix++) {\r
+ unsigned char* ptrColumn = m_imaginaryArrayData[ix];\r
+ if (NativeBigEndian()) {\r
+ for (unsigned int iy = 0; iy < m_ny; iy++) {\r
+ ConvertReverseNetworkOrder (ptrColumn, m_pixelSize);\r
+ fs.write (reinterpret_cast<const char*>(ptrColumn), m_pixelSize);\r
+ ptrColumn += m_pixelSize;\r
+ }\r
+ } else \r
+ fs.write (reinterpret_cast<const char*>(ptrColumn), columnSize);\r
+ }\r
+ }\r
+
return true;
}
sys_error (ERR_WARNING, "Tried to arrayDataRead with ! fs");
return false;
}
-
+
if (! m_arrayData)
- return false;
-
+ return false;
+
fs.seekg (m_headersize);
int columnSize = m_ny * m_pixelSize;
- for (unsigned int ix = 0; ix < m_nx; ix++) {
- unsigned char* ptrColumn = m_arrayData[ix];
- if (NativeBigEndian()) {
- for (unsigned int iy = 0; iy < m_ny; iy++) {
- fs.read (reinterpret_cast<char*>(ptrColumn), m_pixelSize);
- ConvertReverseNetworkOrder (ptrColumn, m_pixelSize);
- ptrColumn += m_pixelSize;
- }
- } else
- fs.read (reinterpret_cast<char*>(ptrColumn), columnSize);
- }
-
+ for (unsigned int ix = 0; ix < m_nx; ix++) {\r
+ unsigned char* ptrColumn = m_arrayData[ix];\r
+ if (NativeBigEndian()) {\r
+ for (unsigned int iy = 0; iy < m_ny; iy++) {\r
+ fs.read (reinterpret_cast<char*>(ptrColumn), m_pixelSize);\r
+ ConvertReverseNetworkOrder (ptrColumn, m_pixelSize);\r
+ ptrColumn += m_pixelSize;\r
+ } \r
+ } else\r
+ fs.read (reinterpret_cast<char*>(ptrColumn), columnSize);\r
+ }\r
+ if (m_dataType == DATA_TYPE_COMPLEX) {\r
+ for (unsigned int ix = 0; ix < m_nx; ix++) {\r
+ unsigned char* ptrColumn = m_imaginaryArrayData[ix];\r
+ if (NativeBigEndian()) {\r
+ for (unsigned int iy = 0; iy < m_ny; iy++) {\r
+ fs.read (reinterpret_cast<char*>(ptrColumn), m_pixelSize);\r
+ ConvertReverseNetworkOrder (ptrColumn, m_pixelSize);\r
+ ptrColumn += m_pixelSize;\r
+ } \r
+ } else\r
+ fs.read (reinterpret_cast<char*>(ptrColumn), columnSize);\r
+ }\r
+ }\r
+
return true;
}
bool
Array2dFile::labelsRead (frnetorderstream& fs)
{
- off_t pos = m_headersize + m_arraySize;
- fs.seekg (pos);
- if (fs.fail())
- return false;
-
- for (int i = 0; i < m_numFileLabels; i++) {
- kuint16 labelType, year, month, day, hour, minute, second;
- kfloat64 calcTime;
-
- fs.readInt16 (labelType);
- fs.readInt16 (year);
- fs.readInt16 (month);
- fs.readInt16 (day);
- fs.readInt16 (hour);
- fs.readInt16 (minute);
- fs.readInt16 (second);
- fs.readFloat64 (calcTime);
-
- kuint16 strLength;
- fs.readInt16 (strLength);
- char* pszLabelStr = new char [strLength+1];
- fs.read (pszLabelStr, strLength);
- pszLabelStr[strLength] = 0;
-
- Array2dFileLabel* pLabel = new Array2dFileLabel (labelType, pszLabelStr, calcTime);
- delete pszLabelStr;\r
-\r
- pLabel->setDateTime (year, month, day, hour, minute, second);
- m_labels.push_back (pLabel);\r
- }
-
- return true;
+ off_t pos = m_headersize + m_arraySize;
+ fs.seekg (pos);
+ if (fs.fail())
+ return false;
+
+ for (int i = 0; i < m_numFileLabels; i++) {
+ kuint16 labelType, year, month, day, hour, minute, second;
+ kfloat64 calcTime;
+
+ fs.readInt16 (labelType);
+ fs.readInt16 (year);
+ fs.readInt16 (month);
+ fs.readInt16 (day);
+ fs.readInt16 (hour);
+ fs.readInt16 (minute);
+ fs.readInt16 (second);
+ fs.readFloat64 (calcTime);
+
+ kuint16 strLength;
+ fs.readInt16 (strLength);
+ char* pszLabelStr = new char [strLength+1];
+ fs.read (pszLabelStr, strLength);
+ pszLabelStr[strLength] = 0;
+
+ Array2dFileLabel* pLabel = new Array2dFileLabel (labelType, pszLabelStr, calcTime);
+ delete pszLabelStr;\r
+ \r
+ pLabel->setDateTime (year, month, day, hour, minute, second);
+ m_labels.push_back (pLabel);\r
+ }
+
+ return true;
}
bool
Array2dFile::labelsWrite (frnetorderstream& fs)
{
- off_t pos = m_headersize + m_arraySize;
- fs.seekp (pos);
-
- for (constLabelIterator l = m_labels.begin(); l != m_labels.end(); l++) {
- const Array2dFileLabel& label = **l;
- kuint16 labelType = label.getLabelType();
- kfloat64 calcTime = label.getCalcTime();
- const char* const labelString = label.getLabelString().c_str();
- int year, month, day, hour, minute, second;
- kuint16 yearBuf, monthBuf, dayBuf, hourBuf, minuteBuf, secondBuf;
-
- label.getDateTime (year, month, day, hour, minute, second);
- yearBuf = year; monthBuf = month; dayBuf = day;
- hourBuf = hour; minuteBuf = minute; secondBuf = second;
-
- fs.writeInt16 (labelType);
- fs.writeInt16 (yearBuf);
- fs.writeInt16 (monthBuf);
- fs.writeInt16 (dayBuf);
- fs.writeInt16 (hourBuf);
- fs.writeInt16 (minuteBuf);
- fs.writeInt16 (secondBuf);
- fs.writeFloat64 (calcTime);
- kuint16 strlength = strlen (labelString);
- fs.writeInt16 (strlength);
- fs.write (labelString, strlength);
- }
-
- return true;
+ off_t pos = m_headersize + m_arraySize;
+ fs.seekp (pos);
+
+ for (constLabelIterator l = m_labels.begin(); l != m_labels.end(); l++) {
+ const Array2dFileLabel& label = **l;
+ kuint16 labelType = label.getLabelType();
+ kfloat64 calcTime = label.getCalcTime();
+ const char* const labelString = label.getLabelString().c_str();
+ int year, month, day, hour, minute, second;
+ kuint16 yearBuf, monthBuf, dayBuf, hourBuf, minuteBuf, secondBuf;
+
+ label.getDateTime (year, month, day, hour, minute, second);
+ yearBuf = year; monthBuf = month; dayBuf = day;
+ hourBuf = hour; minuteBuf = minute; secondBuf = second;
+
+ fs.writeInt16 (labelType);
+ fs.writeInt16 (yearBuf);
+ fs.writeInt16 (monthBuf);
+ fs.writeInt16 (dayBuf);
+ fs.writeInt16 (hourBuf);
+ fs.writeInt16 (minuteBuf);
+ fs.writeInt16 (secondBuf);
+ fs.writeFloat64 (calcTime);
+ kuint16 strlength = strlen (labelString);
+ fs.writeInt16 (strlength);
+ fs.write (labelString, strlength);
+ }
+
+ return true;
}
void
Array2dFile::labelAdd (int type, const char* const lstr, double calc_time)
{
Array2dFileLabel label (type, lstr, calc_time);
-
+
labelAdd (label);
}
void
Array2dFile::labelAdd (const Array2dFileLabel& label)
{
- Array2dFileLabel* pLabel = new Array2dFileLabel(label);
-
- m_labels.push_back (pLabel);
+ Array2dFileLabel* pLabel = new Array2dFileLabel(label);
+
+ m_labels.push_back (pLabel);
}
void
Array2dFile::labelsCopy (Array2dFile& copyFile, const char* const pszId)
{
- std::string id;
- if (pszId)
- id = pszId;
- for (unsigned int i = 0; i < copyFile.getNumLabels(); i++) {
- Array2dFileLabel l (copyFile.labelGet (i));
- std::string lstr = l.getLabelString();
- lstr = id + lstr;
- l.setLabelString (lstr);
- labelAdd (l);
- }
+ std::string id;
+ if (pszId)
+ id = pszId;
+ for (unsigned int i = 0; i < copyFile.getNumLabels(); i++) {
+ Array2dFileLabel l (copyFile.labelGet (i));
+ std::string lstr = l.getLabelString();
+ lstr = id + lstr;
+ l.setLabelString (lstr);
+ labelAdd (l);
+ }
}
void
Array2dFile::arrayDataClear (void)
{
- if (m_arrayData) {
- int columnSize = m_ny * m_pixelSize;
- for (unsigned int ix = 0; ix < m_nx; ix++)
- memset (m_arrayData[ix], 0, columnSize);
- }
+ if (m_arrayData) {\r
+ int columnSize = m_ny * m_pixelSize;\r
+ for (unsigned int ix = 0; ix < m_nx; ix++)\r
+ memset (m_arrayData[ix], 0, columnSize);\r
+ }\r
+ if (m_imaginaryArrayData) {\r
+ int columnSize = m_ny * m_pixelSize;\r
+ for (unsigned int ix = 0; ix < m_nx; ix++)\r
+ memset (m_arrayData[ix], 0, columnSize);\r
+ }\r
}
void
Array2dFile::printLabels (std::ostream& os) const
{
- for (constLabelIterator l = m_labels.begin(); l != m_labels.end(); l++) {
- const Array2dFileLabel& label = **l;
-
- label.print (os);
- os << std::endl;
- }
+ for (constLabelIterator l = m_labels.begin(); l != m_labels.end(); l++) {
+ const Array2dFileLabel& label = **l;
+
+ label.print (os);
+ os << std::endl;
+ }
}
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: imagefile.cpp,v 1.25 2000/12/29 15:45:06 kevin Exp $
+** $Id: imagefile.cpp,v 1.26 2000/12/29 19:30:08 kevin Exp $
**
** 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
#include "ct.h"
-F32Image::F32Image (int nx, int ny)\r
-: Array2dFile (nx, ny, sizeof(kfloat32), Array2dFile::PIXEL_FLOAT32)\r
+F32Image::F32Image (int nx, int ny, int dataType)\r
+: Array2dFile (nx, ny, sizeof(kfloat32), Array2dFile::PIXEL_FLOAT32, dataType)\r
{\r
}\r
\r
{\r
setPixelFormat (Array2dFile::PIXEL_FLOAT32);\r
setPixelSize (sizeof(kfloat32));\r
+ setDataType (Array2dFile::DATA_TYPE_REAL);\r
}\r
\r
-F64Image::F64Image (int nx, int ny)\r
-: Array2dFile (nx, ny, sizeof(kfloat64), Array2dFile::PIXEL_FLOAT64)\r
+F64Image::F64Image (int nx, int ny, int dataType)\r
+: Array2dFile (nx, ny, sizeof(kfloat64), Array2dFile::PIXEL_FLOAT64, dataType)\r
{\r
}\r
\r
{\r
setPixelFormat (PIXEL_FLOAT64);\r
setPixelSize (sizeof(kfloat64));\r
+ setDataType (Array2dFile::DATA_TYPE_REAL);\r
}\r
void
{
double min, max, mean, mode, median, stddev;
- statistics (min, max, mean, mode, median, stddev);
-
+ statistics (min, max, mean, mode, median, stddev);\r
+ if (dataType() == Array2dFile::DATA_TYPE_COMPLEX)\r
+ os << "Real Component Statistics" << std::endl;\r
+
os << " min: " << min << std::endl;
os << " max: " << max << std::endl;
os << " mean: " << mean << std::endl;
os << " mode: " << mode << std::endl;
os << "median: " << median << std::endl;
- os << "stddev: " << stddev << std::endl;
+ os << "stddev: " << stddev << std::endl;\r
+\r
+ if (dataType() == Array2dFile::DATA_TYPE_COMPLEX) {\r
+ statistics (getImaginaryArray(), min, max, mean, mode, median, stddev);\r
+ os << std::endl << "Imaginary Component Statistics" << std::endl;
+ os << " min: " << min << std::endl;\r
+ os << " max: " << max << std::endl;\r
+ os << " mean: " << mean << std::endl;\r
+ os << " mode: " << mode << std::endl;\r
+ os << "median: " << median << std::endl;\r
+ os << "stddev: " << stddev << std::endl;\r
+ }\r
}
void
ImageFile::statistics (double& min, double& max, double& mean, double& mode, double& median, double& stddev) const
-{
- int nx = m_nx;
- int ny = m_ny;
- ImageFileArrayConst v = getArray();
-
- if (v == NULL || nx == 0 || ny == 0)
- return;
+{\r
+ ImageFileArrayConst v = getArray();\r
+ statistics (v, min, max, mean, mode, median, stddev);\r
+}
+
+
+void\r
+ImageFile::statistics (ImageFileArrayConst& v, double& min, double& max, double& mean, double& mode, double& median, double& stddev) const\r
+{\r
+ int nx = m_nx;\r
+ int ny = m_ny;\r
+ \r
+ if (v == NULL || nx == 0 || ny == 0)\r
+ return;\r
\r
std::vector<double> vecImage;\r
int iVec = 0;\r
}\r
\r
vectorNumericStatistics (vecImage, nx * ny, min, max, mean, mode, median, stddev);\r
-}
-
-
+}\r
+\r
void
ImageFile::getMinMax (double& min, double& max) const
{
}
}
\r
+bool\r
+ImageFile::convertRealToComplex ()\r
+{\r
+ if (dataType() != Array2dFile::DATA_TYPE_REAL)\r
+ return false;\r
+\r
+ if (! reallocRealToComplex())\r
+ return false;\r
+\r
+ ImageFileArray vImag = getImaginaryArray();\r
+ for (int ix = 0; ix < m_nx; ix++) {\r
+ ImageFileColumn vCol = vImag[ix];\r
+ for (int iy = 0; iy < m_ny; iy++)\r
+ *vCol++ = 0;\r
+ }\r
+\r
+ return true;\r
+}\r
+\r
+bool\r
+ImageFile::convertComplexToReal ()\r
+{\r
+ if (dataType() != Array2dFile::DATA_TYPE_COMPLEX)\r
+ return false;\r
+\r
+ ImageFileArray vReal = getArray();\r
+ ImageFileArray vImag = getImaginaryArray();\r
+ for (int ix = 0; ix < m_nx; ix++) {\r
+ ImageFileColumn vRealCol = vReal[ix];\r
+ ImageFileColumn vImagCol = vImag[ix];\r
+ for (int iy = 0; iy < m_ny; iy++) {\r
+ std::complex<double> c (*vRealCol, *vImagCol);\r
+ *vRealCol++ = std::abs (c);\r
+ vImagCol++;\r
+ }\r
+ }\r
+\r
+ return reallocComplexToReal();\r
+}\r
+\r
bool\r
ImageFile::subtractImages (const ImageFile& rRHS, ImageFile& result) const\r
{\r
}\r
\r
bool\r
-ImageFile::FFTMagnitude (ImageFile& result) const\r
+ImageFile::inverseFourier (ImageFile& result) const\r
+{\r
+ if (m_nx != result.nx() || m_ny != result.ny()) {\r
+ sys_error (ERR_WARNING, "Difference sizes of images [ImageFile::invertPixelValues]");\r
+ return false;\r
+ }\r
+\r
+ return true;\r
+}\r
+\r
+bool\r
+ImageFile::fourier (ImageFile& result) const\r
{\r
if (m_nx != result.nx() || m_ny != result.ny()) {\r
sys_error (ERR_WARNING, "Difference sizes of images [ImageFile::invertPixelValues]");\r
return false;\r
}\r
\r
+ if (result.dataType() == Array2dFile::DATA_TYPE_REAL) {\r
+ if (! result.reallocRealToComplex ())\r
+ return false;\r
+ }\r
+\r
ImageFileArrayConst vLHS = getArray();\r
- ImageFileArray vResult = result.getArray();\r
+ ImageFileArray vRealResult = result.getArray();\r
+ ImageFileArray vImagResult = result.getImaginaryArray();\r
\r
int ix, iy;\r
double* pY = new double [m_ny];\r
delete [] complexOutCol;\r
\r
for (ix = 0; ix < m_nx; ix++)\r
- for (iy = 0; iy < m_ny; iy++)\r
- vResult[ix][iy] = std::abs (complexOut[ix][iy]);\r
+ for (iy = 0; iy < m_ny; iy++) {\r
+ vRealResult[ix][iy] = complexOut[ix][iy].real();\r
+ vImagResult[ix][iy] = complexOut[ix][iy].imag();\r
+ }\r
\r
for (ix = 0; ix < m_nx; ix++)\r
delete [] complexOut[ix];\r
}\r
\r
bool\r
-ImageFile::FFTPhase (ImageFile& result) const\r
+ImageFile::magnitude (ImageFile& result) const\r
{\r
if (m_nx != result.nx() || m_ny != result.ny()) {\r
sys_error (ERR_WARNING, "Difference sizes of images [ImageFile::invertPixelValues]");\r
return false;\r
}\r
\r
- ImageFileArrayConst vLHS = getArray();\r
- ImageFileArray vResult = result.getArray();\r
-\r
- int ix, iy;\r
- double* pY = new double [m_ny];\r
- std::complex<double>** complexOut = new std::complex<double>* [m_nx];\r
- for (ix = 0; ix < m_nx; ix++)\r
- complexOut[ix] = new std::complex<double> [m_ny];\r
-\r
- for (ix = 0; ix < m_nx; ix++) {\r
- for (iy = 0; iy < m_ny; iy++)\r
- pY[iy] = vLHS[ix][iy];\r
- ProcessSignal::finiteFourierTransform (pY, complexOut[ix], m_ny, ProcessSignal::FORWARD);\r
+ ImageFileArray vReal = getArray();\r
+ ImageFileArray vImag = NULL;\r
+ if (dataType() == Array2dFile::DATA_TYPE_COMPLEX)\r
+ vImag = getImaginaryArray();\r
+\r
+ ImageFileArray vRealResult = result.getArray();\r
+ if (result.dataType() == Array2dFile::DATA_TYPE_COMPLEX) {\r
+ ImageFileArray vImagResult = result.getImaginaryArray();\r
+ for (int ix = 0; ix < m_nx; ix++)\r
+ for (int iy = 0; iy < m_ny; iy++)\r
+ vImagResult[ix][iy] = 0;\r
}\r
- delete pY;\r
-\r
- std::complex<double>* pX = new std::complex<double> [m_nx];\r
- std::complex<double>* complexOutCol = new std::complex<double> [m_nx];\r
- for (iy = 0; iy < m_ny; iy++) {\r
- for (ix = 0; ix < m_nx; ix++)\r
- pX[ix] = complexOut[ix][iy];\r
- ProcessSignal::finiteFourierTransform (pX, complexOutCol, m_nx, ProcessSignal::FORWARD);\r
- for (ix = 0; ix < m_nx; ix++)\r
- complexOut[ix][iy] = complexOutCol[ix];\r
- }\r
- delete [] pX;\r
\r
- for (ix = 0; ix < m_nx; ix++)\r
- ProcessSignal::shuffleFourierToNaturalOrder (complexOut[ix], m_ny);\r
+ for (int ix = 0; ix < m_nx; ix++)\r
+ for (int iy = 0; iy < m_ny; iy++) {\r
+ if (dataType() == Array2dFile::DATA_TYPE_COMPLEX) \r
+ vRealResult[ix][iy] = ::sqrt (vReal[ix][iy] * vReal[ix][iy] + vImag[ix][iy] * vImag[ix][iy]);\r
+ else\r
+ vRealResult[ix][iy] = vReal[ix][iy];\r
+ }\r
\r
- \r
- for (iy = 0; iy < m_ny; iy++) {\r
- for (ix = 0; ix < m_nx; ix++)\r
- complexOutCol[ix] = complexOut[ix][iy];\r
- ProcessSignal::shuffleFourierToNaturalOrder (complexOutCol, m_nx);;\r
- for (ix = 0; ix < m_nx; ix++)\r
- complexOut[ix][iy] = complexOutCol[ix];\r
+ return true;\r
+}\r
\r
+bool\r
+ImageFile::phase (ImageFile& result) const\r
+{\r
+ if (m_nx != result.nx() || m_ny != result.ny()) {\r
+ sys_error (ERR_WARNING, "Difference sizes of images [ImageFile::invertPixelValues]");\r
+ return false;\r
}\r
- delete [] complexOutCol;\r
-\r
- for (ix = 0; ix < m_nx; ix++)\r
- for (iy = 0; iy < m_ny; iy++)\r
- vResult[ix][iy] = atan (complexOut[ix][iy].imag / complexOut[ix][iy].real);\r
\r
- for (ix = 0; ix < m_nx; ix++)\r
- delete [] complexOut[ix];\r
+ ImageFileArray vReal = getArray();\r
+ ImageFileArray vImag = NULL;\r
+ if (dataType() == Array2dFile::DATA_TYPE_COMPLEX)\r
+ vImag = getImaginaryArray();\r
+\r
+ ImageFileArray vRealResult = result.getArray();\r
+ if (result.dataType() == Array2dFile::DATA_TYPE_COMPLEX) {\r
+ ImageFileArray vImagResult = result.getImaginaryArray();\r
+ for (int ix = 0; ix < m_nx; ix++)\r
+ for (int iy = 0; iy < m_ny; iy++)\r
+ vImagResult[ix][iy] = 0;\r
+ }\r
\r
- delete [] complexOut;\r
+ for (int ix = 0; ix < m_nx; ix++)\r
+ for (int iy = 0; iy < m_ny; iy++) {\r
+ if (dataType() == Array2dFile::DATA_TYPE_COMPLEX) \r
+ vRealResult[ix][iy] = ::atan (vImag[ix][iy] / vReal[ix][iy]);\r
+ else\r
+ vRealResult[ix][iy] = vReal[ix][iy];\r
+ }\r
\r
return true;\r
}\r
# ADD BASE RSC /l 0x409 /i "\wx2\include\wx\msw"\r
# SUBTRACT BASE RSC /i "\wx2\include\wx\msw" /i "\wx2\include"\r
# ADD RSC /l 0x409 /i "\wx2\include\wx\msw"\r
+# SUBTRACT RSC /i "\wx2\include\wx\msw" /i "\wx2\include"\r
\r
!ENDIF \r
\r
--------------------Configuration: libctsim - Win32 Debug--------------------\r
</h3>\r
<h3>Command Lines</h3>\r
-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP34.tmp" with contents\r
+Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP8B.tmp" with contents\r
[\r
/nologo /G6 /MTd /W3 /Gm /GR /GX /ZI /Od /I "..\..\..\zlib" /I "..\..\INCLUDE" /I "..\..\getopt" /I "..\..\..\lpng108" /I "..\..\..\fftw-2.1.3\fftw" /I "..\..\..\fftw-2.1.3\rfftw" /I "..\..\..\wx2\include" /D "_DEBUG" /D "HAVE_WXWIN" /D "HAVE_STRING_H" /D "HAVE_GETOPT_H" /D "WIN32" /D "_MBCS" /D "_LIB" /D "MSVC" /D "HAVE_FFTW" /D "HAVE_PNG" /D "HAVE_SGP" /D "HAVE_WXWINDOWS" /D "__WXMSW__" /FR"Debug/" /Fp"Debug/libctsim.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c \r
"C:\ctsim-2.0.6\libctsim\imagefile.cpp"\r
]\r
-Creating command line "cl.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP34.tmp" \r
-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP35.tmp" with contents\r
+Creating command line "cl.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP8B.tmp" \r
+Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP8C.tmp" with contents\r
[\r
/nologo /out:"Debug\libctsim.lib" \r
".\Debug\array2dfile.obj"\r
".\Debug\transformmatrix.obj"\r
".\Debug\xform.obj"\r
]\r
-Creating command line "link.exe -lib @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP35.tmp"\r
+Creating command line "link.exe -lib @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP8C.tmp"\r
<h3>Output Window</h3>\r
Compiling...\r
imagefile.cpp\r
--------------------Configuration: ctsim - Win32 Debug--------------------\r
</h3>\r
<h3>Command Lines</h3>\r
-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP36.tmp" with contents\r
+Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP8D.tmp" with contents\r
[\r
comctl32.lib winmm.lib rpcrt4.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../libctsim/Debug/libctsim.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\..\lpng108\msvc\win32\libpng\lib_dbg\libpng.lib ..\..\..\lpng108\msvc\win32\zlib\lib_dbg\zlib.lib libcmtd.lib ..\..\..\fftw-2.1.3\Win32\FFTW2st\Debug\FFTW2st.lib ..\..\..\fftw-2.1.3\Win32\RFFTW2st\Debug\RFFTW2st.lib ../../../wx2/lib/wxd.lib /nologo /subsystem:windows /incremental:yes /pdb:"Debug/ctsim.pdb" /debug /machine:I386 /nodefaultlib:"libcd.lib" /nodefaultlib:"libcid.lib" /nodefaultlib:"msvcrtd.lib" /out:"Debug/ctsim.exe" /pdbtype:sept /libpath:"..\..\..\lpng108\msvc\win32\libpng\lib" /libpath:"..\..\..\lpng108\msvc\win32\zlib\lib" \r
".\Debug\ctsim.obj"\r
"\fftw-2.1.3\Win32\RFFTW2st\Debug\RFFTW2st.lib"\r
"\wx2\lib\wxd.lib"\r
]\r
-Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP36.tmp"\r
+Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP8D.tmp"\r
<h3>Output Window</h3>\r
Linking...\r
\r
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: ctsim.h,v 1.14 2000/12/29 15:45:06 kevin Exp $
+** $Id: ctsim.h,v 1.15 2000/12/29 19:30:08 kevin Exp $
**
** 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
IFMENU_PROCESS_SQUARE,\r
IFMENU_PROCESS_LOG,\r
IFMENU_PROCESS_EXP,\r
- IFMENU_PROCESS_FFT_MAGNITUDE,\r
- IFMENU_PROCESS_FFT_PHASE,\r
+ IFMENU_PROCESS_FOURIER,\r
+ IFMENU_PROCESS_INVERSE_FOURIER,\r
+ IFMENU_PROCESS_MAGNITUDE,\r
+ IFMENU_PROCESS_PHASE,\r
PHMMENU_PROCESS_RASTERIZE,
PHMMENU_PROCESS_PROJECTIONS,\r
PLOTMENU_VIEW_SCALE_MINMAX,\r
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: views.cpp,v 1.40 2000/12/29 15:45:06 kevin Exp $
+** $Id: views.cpp,v 1.41 2000/12/29 19:30:08 kevin Exp $
**
** 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
EVT_MENU(IFMENU_PROCESS_SQRT, ImageFileView::OnSquareRoot)\r
EVT_MENU(IFMENU_PROCESS_LOG, ImageFileView::OnLog)\r
EVT_MENU(IFMENU_PROCESS_EXP, ImageFileView::OnExp)\r
-EVT_MENU(IFMENU_PROCESS_FFT_MAGNITUDE, ImageFileView::OnFFTMagnitude)\r
-EVT_MENU(IFMENU_PROCESS_FFT_PHASE, ImageFileView::OnFFTPhase)\r
+EVT_MENU(IFMENU_PROCESS_FOURIER, ImageFileView::OnFourier)\r
+EVT_MENU(IFMENU_PROCESS_INVERSE_FOURIER, ImageFileView::OnInverseFourier)\r
+EVT_MENU(IFMENU_PROCESS_MAGNITUDE, ImageFileView::OnMagnitude)\r
+EVT_MENU(IFMENU_PROCESS_PHASE, ImageFileView::OnPhase)\r
EVT_MENU(IFMENU_PLOT_ROW, ImageFileView::OnPlotRow)\r
EVT_MENU(IFMENU_PLOT_COL, ImageFileView::OnPlotCol)\r
END_EVENT_TABLE()
void
ImageFileView::OnProperties (wxCommandEvent& event)
{
- double min, max, mean, mode, median, stddev;
const ImageFile& rIF = GetDocument()->getImageFile();
if (rIF.nx() == 0 || rIF.ny() == 0)
*theApp->getLog() << "Properties: empty imagefile\n";
else {
const std::string& rFilename = rIF.getFilename();
- rIF.statistics (min, max, mean, mode, median, stddev);
std::ostringstream os;
- os << "file: " << rFilename << "\nmin: "<<min<<"\nmax: "<<max<<"\nmean: "<<mean<<"\nmedian: "<<median<<"\nmode: "<<mode<<"\nstddev: "<<stddev << "\n";
+ double min, max, mean, mode, median, stddev;\r
+ rIF.statistics (min, max, mean, mode, median, stddev);\r
+ os << "Filename: " << rFilename << "\n";\r
+ os << "Size: (" << rIF.nx() << "," << rIF.ny() << ")\n";\r
+ os << "Data type: ";\r
+ if (rIF.dataType() == Array2dFile::DATA_TYPE_COMPLEX)\r
+ os << "Complex\n";\r
+ else\r
+ os << "Real\n";\r
+ os << "\nMinimum: "<<min<<"\nMaximum: "<<max<<"\nMean: "<<mean<<"\nMedian: "<<median<<"\nMode: "<<mode<<"\nStandard Deviation: "<<stddev << "\n";
+ if (rIF.dataType() == Array2dFile::DATA_TYPE_COMPLEX) {\r
+ rIF.statistics (rIF.getImaginaryArray(), min, max, mean, mode, median, stddev);\r
+ os << "\nImaginary: min: "<<min<<"\nmax: "<<max<<"\nmean: "<<mean<<"\nmedian: "<<median<<"\nmode: "<<mode<<"\nstddev: "<<stddev << "\n";\r
+ }\r
*theApp->getLog() << os.str().c_str();
wxMessageDialog dialogMsg (m_frame, os.str().c_str(), "Imagefile Properties", wxOK | wxICON_INFORMATION);
dialogMsg.ShowModal();
}\r
\r
void\r
-ImageFileView::OnFFTMagnitude (wxCommandEvent& event)\r
+ImageFileView::OnFourier (wxCommandEvent& event)\r
{\r
ImageFile& rIF = GetDocument()->getImageFile();\r
- rIF.FFTMagnitude (rIF);\r
+ rIF.fourier (rIF);\r
+ m_bMinSpecified = false;\r
+ m_bMaxSpecified = false;\r
+ if (theApp->getSetModifyNewDocs())\r
+ GetDocument()->Modify(TRUE);\r
+ GetDocument()->UpdateAllViews(this);\r
+}\r
+\r
+void\r
+ImageFileView::OnInverseFourier (wxCommandEvent& event)\r
+{\r
+ ImageFile& rIF = GetDocument()->getImageFile();\r
+ rIF.inverseFourier (rIF);\r
+ m_bMinSpecified = false;\r
+ m_bMaxSpecified = false;\r
if (theApp->getSetModifyNewDocs())\r
GetDocument()->Modify(TRUE);\r
GetDocument()->UpdateAllViews(this);\r
}\r
\r
void\r
-ImageFileView::OnFFTPhase (wxCommandEvent& event)\r
+ImageFileView::OnMagnitude (wxCommandEvent& event)\r
{\r
ImageFile& rIF = GetDocument()->getImageFile();\r
- rIF.FFTPhase (rIF);\r
+ rIF.magnitude (rIF);\r
+ m_bMinSpecified = false;\r
+ m_bMaxSpecified = false;\r
+ if (theApp->getSetModifyNewDocs())\r
+ GetDocument()->Modify(TRUE);\r
+ GetDocument()->UpdateAllViews(this);\r
+}\r
+\r
+void\r
+ImageFileView::OnPhase (wxCommandEvent& event)\r
+{\r
+ ImageFile& rIF = GetDocument()->getImageFile();\r
+ rIF.phase (rIF);\r
+ m_bMinSpecified = false;\r
+ m_bMaxSpecified = false;\r
if (theApp->getSetModifyNewDocs())\r
GetDocument()->Modify(TRUE);\r
GetDocument()->UpdateAllViews(this);\r
process_menu->Append (IFMENU_PROCESS_SQRT, "Square &Root");\r
process_menu->Append (IFMENU_PROCESS_LOG, "&Log");\r
process_menu->Append (IFMENU_PROCESS_EXP, "&Exp");\r
- process_menu->Append (IFMENU_PROCESS_FFT_MAGNITUDE, "&FFT Magnitude");\r
- process_menu->Append (IFMENU_PROCESS_FFT_PHASE, "FFT &Phase");\r
+ process_menu->AppendSeparator();\r
+ process_menu->Append (IFMENU_PROCESS_FOURIER, "&Fourier");\r
+ process_menu->Append (IFMENU_PROCESS_INVERSE_FOURIER, "&Inverse Fourier");\r
+ process_menu->Append (IFMENU_PROCESS_MAGNITUDE, "&Magnitude");\r
+ process_menu->Append (IFMENU_PROCESS_PHASE, "&Phase");\r
\r
wxMenu *plot_menu = new wxMenu;\r
plot_menu->Append (IFMENU_PLOT_ROW, "Plot &Row");\r
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: views.h,v 1.17 2000/12/29 15:45:06 kevin Exp $
+** $Id: views.h,v 1.18 2000/12/29 19:30:08 kevin Exp $
**
** 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
void OnSquareRoot (wxCommandEvent& event);\r
void OnLog (wxCommandEvent& event);\r
void OnExp (wxCommandEvent& event);\r
- void OnFFTMagnitude (wxCommandEvent& event);\r
- void OnFFTPhase (wxCommandEvent& event);\r
+ void OnFourier (wxCommandEvent& event);\r
+ void OnInverseFourier (wxCommandEvent& event);\r
+ void OnMagnitude (wxCommandEvent& event);\r
+ void OnPhase (wxCommandEvent& event);\r
void OnScaleAuto (wxCommandEvent& event);
void OnScaleMinMax (wxCommandEvent& event);
void OnPlotRow (wxCommandEvent& event);\r
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: if1.cpp,v 1.3 2000/12/29 15:45:06 kevin Exp $
+** $Id: if1.cpp,v 1.4 2000/12/29 19:30:08 kevin Exp $
**
** 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
{0, 0, 0, 0}
};
-static const char* g_szIdStr = "$Id: if1.cpp,v 1.3 2000/12/29 15:45:06 kevin Exp $";
+static const char* g_szIdStr = "$Id: if1.cpp,v 1.4 2000/12/29 19:30:08 kevin Exp $";
void
if1_usage (const char *program)
std::cout << " --exp Natural exponential of image" << std::endl;
std::cout << " --sqr Square of image" << std::endl;
std::cout << " --sqrt Square root of image" << std::endl;
- std::cout << " --verbose Verbose modem" << std::endl;
+ std::cout << " --verbose Verbose mode" << std::endl;
std::cout << " --version Print version" << std::endl;
std::cout << " --help Print this help message" << std::endl;
}
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: ifinfo.cpp,v 1.5 2000/12/17 23:30:48 kevin Exp $
+** $Id: ifinfo.cpp,v 1.6 2000/12/29 19:30:08 kevin Exp $
**
** 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
{0, 0, 0, 0}
};
-static const char* g_szIdStr = "$Id: ifinfo.cpp,v 1.5 2000/12/17 23:30:48 kevin Exp $";
+static const char* g_szIdStr = "$Id: ifinfo.cpp,v 1.6 2000/12/29 19:30:08 kevin Exp $";
void
im->printLabels (std::cout);
if (opt_stats) {
- std::cout << "Size: (" << im->nx() << "," << im->ny() << ")\n";
+ std::cout << "Size: (" << im->nx() << "," << im->ny() << ")\n";\r
+ std::cout << "Data type: ";\r
+ if (im->dataType() == Array2dFile::DATA_TYPE_COMPLEX)\r
+ std::cout << "Complex\n";\r
+ else \r
+ std::cout << "Real\n";\r
+
im->printStatistics (std::cout);
}