+ for (unsigned int iy = 0; iy < m_ny; iy++)\r
+ *out++ = - *in++;\r
+ }\r
+ \r
+ return true;\r
+}\r
+\r
+bool\r
+ImageFile::sqrt (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 (isComplex() && ! result.isComplex())\r
+ result.convertRealToComplex();\r
+ \r
+ bool bComplexOutput = result.isComplex();\r
+ ImageFileArrayConst vLHS = getArray();\r
+ if (! bComplexOutput) // check if should convert to complex output\r
+ for (unsigned int ix = 0; ix < m_nx; ix++)\r
+ for (unsigned int iy = 0; iy < m_ny; iy++)\r
+ if (! bComplexOutput && vLHS[ix][iy] < 0) {\r
+ result.convertRealToComplex();\r
+ bComplexOutput = true;\r
+ break;\r
+ }\r
+ \r
+ ImageFileArrayConst vLHSImag = getImaginaryArray();\r
+ ImageFileArray vResult = result.getArray();\r
+ ImageFileArray vResultImag = result.getImaginaryArray();\r
+ \r
+ for (unsigned int ix = 0; ix < m_nx; ix++) {\r
+ for (unsigned int iy = 0; iy < m_ny; iy++) {\r
+ if (result.isComplex()) {\r
+ double dImag = 0;\r
+ if (isComplex())\r
+ dImag = vLHSImag[ix][iy];\r
+ std::complex<double> cLHS (vLHS[ix][iy], dImag);\r
+ std::complex<double> cResult = std::sqrt(cLHS);\r
+ vResult[ix][iy] = cResult.real();\r
+ vResultImag[ix][iy] = cResult.imag();\r
+ } else\r
+ vResult[ix][iy] = ::sqrt (vLHS[ix][iy]);\r
+ }\r
+ }\r
+ \r
+ \r
+ return true;\r
+}\r
+\r
+bool\r
+ImageFile::log (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 (isComplex() && ! result.isComplex())\r
+ result.convertRealToComplex();\r
+ \r
+ ImageFileArrayConst vLHS = getArray();\r
+ ImageFileArrayConst vLHSImag = getImaginaryArray();\r
+ ImageFileArray vResult = result.getArray();\r
+ ImageFileArray vResultImag = result.getImaginaryArray();\r
+ \r
+ for (unsigned int ix = 0; ix < m_nx; ix++) {\r
+ for (unsigned int iy = 0; iy < m_ny; iy++) {\r
+ if (result.isComplex()) {\r
+ double dImag = 0;\r
+ if (isComplex())\r
+ dImag = vLHSImag[ix][iy];\r
+ std::complex<double> cLHS (vLHS[ix][iy], dImag);\r
+ std::complex<double> cResult = std::log (cLHS);\r
+ vResult[ix][iy] = cResult.real();\r
+ vResultImag[ix][iy] = cResult.imag();\r
+ } else\r
+ vResult[ix][iy] = ::log (vLHS[ix][iy]);\r
+ }\r
+ }\r
+ \r
+ \r
+ return true;\r
+}\r
+\r
+bool\r
+ImageFile::exp (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 (isComplex() && ! result.isComplex())\r
+ result.convertRealToComplex();\r
+ \r
+ ImageFileArrayConst vLHS = getArray();\r
+ ImageFileArrayConst vLHSImag = getImaginaryArray();\r
+ ImageFileArray vResult = result.getArray();\r
+ ImageFileArray vResultImag = result.getImaginaryArray();\r
+ \r
+ for (unsigned int ix = 0; ix < m_nx; ix++) {\r
+ for (unsigned int iy = 0; iy < m_ny; iy++) {\r
+ if (result.isComplex()) {\r
+ double dImag = 0;\r
+ if (isComplex())\r
+ dImag = vLHSImag[ix][iy];\r
+ std::complex<double> cLHS (vLHS[ix][iy], dImag);\r
+ std::complex<double> cResult = std::exp (cLHS);\r
+ vResult[ix][iy] = cResult.real();\r
+ vResultImag[ix][iy] = cResult.imag();\r
+ } else\r
+ vResult[ix][iy] = ::exp (vLHS[ix][iy]);\r
+ }\r
+ }\r
+ \r
+ \r
+ return true;\r
+}\r
+\r
+bool\r
+ImageFile::scaleImage (ImageFile& result) const\r
+{\r
+ unsigned int nx = m_nx;\r
+ unsigned int ny = m_ny;\r
+ unsigned int newNX = result.nx();\r
+ unsigned int newNY = result.ny();\r
+ \r
+ double dXScale = static_cast<double>(newNX) / static_cast<double>(nx);\r
+ double dYScale = static_cast<double>(newNY) / static_cast<double>(ny);\r
+ \r
+ if (isComplex() && ! result.isComplex())\r
+ result.convertRealToComplex();\r
+ \r
+ ImageFileArrayConst vReal = getArray();\r
+ ImageFileArrayConst vImag = getImaginaryArray();\r
+ ImageFileArray vResult = result.getArray();\r
+ ImageFileArray vResultImag = result.getImaginaryArray();\r
+ \r
+ for (unsigned int ix = 0; ix < newNX; ix++) {\r
+ for (unsigned int iy = 0; iy < newNY; iy++) {\r
+ double dXPos = ix / dXScale;\r
+ double dYPos = iy / dYScale;\r
+ unsigned int scaleNX = static_cast<unsigned int> (dXPos);\r
+ unsigned int scaleNY = static_cast<unsigned int> (dYPos);\r
+ double dXFrac = dXPos - scaleNX;\r
+ double dYFrac = dYPos - scaleNY;\r
+ if (scaleNX >= nx - 1 || scaleNY >= ny - 1) {\r
+ vResult[ix][iy] = vReal[scaleNX][scaleNY];\r
+ if (result.isComplex()) {\r
+ if (isComplex())\r
+ vResultImag[ix][iy] = vImag[scaleNX][scaleNY];\r
+ else\r
+ vResultImag[ix][iy] = 0;\r
+ }\r
+ } else {\r
+ vResult[ix][iy] = vReal[scaleNX][scaleNY] + \r
+ dXFrac * (vReal[scaleNX+1][scaleNY] - vReal[scaleNX][scaleNY]) + \r
+ dYFrac * (vReal[scaleNX][scaleNY+1] - vReal[scaleNX][scaleNY]);\r
+ if (result.isComplex()) {\r
+ if (isComplex())\r
+ vResultImag[ix][iy] = vImag[scaleNX][scaleNY] + \r
+ dXFrac * (vImag[scaleNX+1][scaleNY] - vImag[scaleNX][scaleNY]) + \r
+ dYFrac * (vImag[scaleNX][scaleNY+1] - vImag[scaleNX][scaleNY]);\r
+ else\r
+ vResultImag[ix][iy] = 0;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ return true;\r
+}\r
+\r
+#ifdef HAVE_FFTW\r
+bool\r
+ImageFile::fft (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.convertRealToComplex ())\r
+ return false;\r
+ }\r
+ \r
+ fftw_complex* in = new fftw_complex [m_nx * m_ny];\r
+ \r
+ ImageFileArrayConst vReal = getArray();\r
+ ImageFileArrayConst vImag = getImaginaryArray();\r
+ \r
+ unsigned int ix, iy;\r
+ unsigned int iArray = 0;\r
+ for (ix = 0; ix < m_nx; ix++)\r
+ for (iy = 0; iy < m_ny; iy++) {\r
+ in[iArray].re = vReal[ix][iy];\r
+ if (isComplex())\r
+ in[iArray].im = vImag[ix][iy];\r