1 #ifndef TIL_IMAGEARITH_H 2 #define TIL_IMAGEARITH_H 8 #include <boost/type_traits.hpp> 21 template <
class TImage >
22 void set(TImage &im,
typename TImage::value_type value)
25 for (; !iIm.isAtEnd(); ++iIm)
31 template <
class TImage >
35 for (; !iIm.isAtEnd(); ++iIm)
89 template <
class TImage1,
class TImage2 >
91 mul_ii(TImage1 &im1,
const TImage2 &im2)
98 for (; !iIm1.isAtEnd(); ++iIm1, ++iIm2)
109 template <
class TImage1,
class TImage2 >
112 is_Image<TImage1>::value &&
113 is_Image<TImage2>::value
127 template <
class TImage,
typename TMultiplier >
128 void mul_iv(TImage &im,
const TMultiplier & constant)
132 for (; !iIm.isAtEnd(); ++iIm)
155 template <
class TImage,
typename TMultiplier >
158 is_Image<TMultiplier>::value ||
165 const TMultiplier & constant
195 template <
class TImage >
196 void div(TImage & im1,
const TImage & im2)
198 typedef typename TImage::value_type value_type;
200 const value_type EPSILON = 16*std::numeric_limits<value_type>::epsilon();
207 for (; !iIm1.isAtEnd(); ++iIm1, ++iIm2);
209 if (
abs(*iIm2) <= EPSILON)
211 throw std::runtime_error(
"Division by zero");
221 template <
class TImage >
222 void div(TImage &im,
typename TImage::value_type scalar);
226 template <
class TImage1,
class TImage2 >
228 is_Image<TImage1>::value &&
229 is_Image<TImage2>::value
231 sub(TImage1 & im1,
const TImage2 & im2)
233 typedef typename TImage1::value_type TPixel1;
234 typedef typename TImage2::value_type TPixel2;
241 for (; !iIm1.isAtEnd(); ++iIm1, ++iIm2)
243 *iIm1 -= castValue<TPixel2, TPixel1>(*iIm2);
248 template <
class TImage,
typename T >
250 is_Image<TImage>::value &&
253 sub(TImage & im, T scalar)
256 for (; !iIm.isAtEnd(); ++iIm)
265 template <
typename T1,
typename T2 >
266 void operator() (
const T1 &a,
const T2 &b)
const 272 template <
class TImage1,
class TImage2 >
274 is_Image<TImage1>::value &&
275 is_Image<TImage2>::value
277 add(TImage1 & im1,
const TImage2 & im2)
279 typedef typename TImage1::value_type TPixel1;
280 typedef typename TImage2::value_type TPixel2;
287 for (; !iIm1.isAtEnd(); ++iIm1, ++iIm2)
289 *iIm1 += castValue<TPixel2, TPixel1>(*iIm2);
293 template <
class TImage,
typename T >
295 is_Image<TImage>::value &&
298 add(TImage & im, T scalar)
301 for (; !iIm.isAtEnd(); ++iIm)
309 template <
class TImage >
310 void square(
const TImage & in, TImage & out)
317 for (; !iIn.isAtEnd(); ++iIn, ++iOut)
325 template <
class TImage >
326 void sqrt(
const TImage &in, TImage &out)
333 for (; !iIn.isAtEnd(); ++iIn, ++iOut)
A trait class to assign iterators to image types.
void mul_ii(TImage1 &im1, const TImage2 &im2)
Numerical precision of the data for storage classes.
void sqrt(const TImage &in, TImage &out)
void similarityCheck(const TImage1 &im1, const TImage2 &im2)
Check whether both images are allocated and have the same size and voxel size.
Belongs to package Box Do not include directly, include til/Box.h instead.
void mul_iv(TImage &im, const TMultiplier &constant)
General macros, definitions and functions.
Defines empty classes that serves as labels.
numeric_array< T, D > abs(const numeric_array< T, D > &a)
Absolute value, element-wise.
void square(const TImage &in, TImage &out)
Template tool to enable a template specialization under some condition.