Toshihiro Shimizu 890ddd
#include <cmath></cmath>
Toshihiro Shimizu 890ddd
#include <vector></vector>
Shinya Kitaoka 120a6e
#include <algorithm>  // std::sort()</algorithm>
Shinya Kitaoka 120a6e
#include <stdexcept>  /* std::domain_error(-) */</stdexcept>
Shinya Kitaoka 120a6e
#include <limits>     /* std::numeric_limits */</limits>
Toshihiro Shimizu 890ddd
#include "igs_ifx_common.h"
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace igs {
Shinya Kitaoka 120a6e
namespace median_filter {
Toshihiro Shimizu 890ddd
enum out_of_image {
Shinya Kitaoka 120a6e
  is_spread_edge,
Shinya Kitaoka 120a6e
  is_flip_repeat,
Shinya Kitaoka 120a6e
  is_black,  /* 必要か?????? */
Shinya Kitaoka 120a6e
  is_repeat, /* 必要か?????? */
Toshihiro Shimizu 890ddd
};
Shinya Kitaoka 120a6e
class pixrender {
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  pixrender(double radius, igs::median_filter::out_of_image type);
Shinya Kitaoka 120a6e
  std::vector<int> xp;</int>
Shinya Kitaoka 120a6e
  std::vector<int> yp;</int>
Shinya Kitaoka 120a6e
  std::vector<int> around;</int>
Shinya Kitaoka 120a6e
  void position(const int ww, const int hh, int &xx, int &yy);
Shinya Kitaoka 120a6e
  void clear(void);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  pixrender();
Shinya Kitaoka 120a6e
  igs::median_filter::out_of_image type_;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
igs::median_filter::pixrender::pixrender(
Shinya Kitaoka 120a6e
    const double radius, const igs::median_filter::out_of_image type)
Shinya Kitaoka 120a6e
    : type_(type) {
Shinya Kitaoka 120a6e
  const int radius_int = (int)ceil(radius);
Shinya Kitaoka 120a6e
  int size             = 0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  for (int yy = -radius_int; yy <= radius_int; ++yy) {
Shinya Kitaoka 120a6e
    for (int xx = -radius_int; xx <= radius_int; ++xx) {
Shinya Kitaoka 120a6e
      /***
Shinya Kitaoka 120a6e
const double xr = xx / radius;
Shinya Kitaoka 120a6e
const double yr = yy / radius;
Shinya Kitaoka 120a6e
if ( sqrt(xr * xr + yr * yr) <= (1.0 + 1e-6) ){
Shinya Kitaoka 120a6e
++size;
Shinya Kitaoka 120a6e
}
Shinya Kitaoka 120a6e
***/
Shinya Kitaoka 120a6e
      const double xr = static_cast<double>(xx);</double>
Shinya Kitaoka 120a6e
      const double yr = static_cast<double>(yy);</double>
Shinya Kitaoka 120a6e
      if ((xr * xr + yr * yr) <= (radius * radius + 1e-6)) {
Shinya Kitaoka 120a6e
        ++size;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  this->xp.resize(size);
Shinya Kitaoka 120a6e
  this->yp.resize(size);
Shinya Kitaoka 120a6e
  this->around.resize(size);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int ii = 0;
Shinya Kitaoka 120a6e
  for (int yy = -radius_int; yy <= radius_int; ++yy) {
Shinya Kitaoka 120a6e
    for (int xx = -radius_int; xx <= radius_int; ++xx) {
Shinya Kitaoka 120a6e
      /***
Shinya Kitaoka 120a6e
const double xr = xx / radius;
Shinya Kitaoka 120a6e
const double yr = yy / radius;
Shinya Kitaoka 120a6e
if ( sqrt(xr * xr + yr * yr) <= (1.0 + 1e-6) ){
Shinya Kitaoka 120a6e
this->xp.at(ii) = xx;
Shinya Kitaoka 120a6e
this->yp.at(ii) = yy;
Shinya Kitaoka 120a6e
++ii;
Shinya Kitaoka 120a6e
}
Shinya Kitaoka 120a6e
***/
Shinya Kitaoka 120a6e
      const double xr = static_cast<double>(xx);</double>
Shinya Kitaoka 120a6e
      const double yr = static_cast<double>(yy);</double>
Shinya Kitaoka 120a6e
      if ((xr * xr + yr * yr) <= (radius * radius + 1e-6)) {
Shinya Kitaoka 120a6e
        this->xp.at(ii) = xx;
Shinya Kitaoka 120a6e
        this->yp.at(ii) = yy;
Shinya Kitaoka 120a6e
        ++ii;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Shinya Kitaoka 120a6e
void igs::median_filter::pixrender::clear(void) {
Shinya Kitaoka 120a6e
  this->around.clear();
Shinya Kitaoka 120a6e
  this->yp.clear();
Shinya Kitaoka 120a6e
  this->xp.clear();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void igs::median_filter::pixrender::position(const int ww, const int hh,
Shinya Kitaoka 120a6e
                                             int &xx, int &yy) {
Shinya Kitaoka 120a6e
  switch (this->type_) {
Shinya Kitaoka 120a6e
  case igs::median_filter::is_spread_edge:
Shinya Kitaoka 120a6e
    xx = (xx < 0) ? 0 : ((ww <= xx) ? ww - 1 : xx);
Shinya Kitaoka 120a6e
    yy = (yy < 0) ? 0 : ((hh <= yy) ? hh - 1 : yy);
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  case igs::median_filter::is_flip_repeat:
Shinya Kitaoka 120a6e
    if (xx < 0) {
Shinya Kitaoka 120a6e
      while (xx < 0) {
Shinya Kitaoka 120a6e
        xx += ww;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      xx = ww - 1 - xx;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    if (ww <= xx) {
Shinya Kitaoka 120a6e
      while (ww <= xx) {
Shinya Kitaoka 120a6e
        xx -= ww;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      xx = ww - 1 - xx;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    if (yy < 0) {
Shinya Kitaoka 120a6e
      while (yy < 0) {
Shinya Kitaoka 120a6e
        yy += hh;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      yy = hh - 1 - yy;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    if (hh <= yy) {
Shinya Kitaoka 120a6e
      while (hh <= yy) {
Shinya Kitaoka 120a6e
        yy -= hh;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      yy = hh - 1 - yy;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  case igs::median_filter::is_black: /* 必要か?????? */
Shinya Kitaoka 120a6e
    if (xx < 0 || ww <= xx) {
Shinya Kitaoka 120a6e
      xx = -1;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    if (yy < 0 || hh <= yy) {
Shinya Kitaoka 120a6e
      yy = -1;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  case igs::median_filter::is_repeat: /* 必要か?????? */
Shinya Kitaoka 120a6e
    while (xx < 0) {
Shinya Kitaoka 120a6e
      xx += ww;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    while (ww <= xx) {
Shinya Kitaoka 120a6e
      xx -= ww;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    while (yy < 0) {
Shinya Kitaoka 120a6e
      yy += hh;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    while (hh <= yy) {
Shinya Kitaoka 120a6e
      yy -= hh;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Shinya Kitaoka 120a6e
namespace {
Toshihiro Shimizu 890ddd
template <class t=""></class>
Shinya Kitaoka 120a6e
T getter_(igs::median_filter::pixrender &pixr, const T *image, const int hh,
Shinya Kitaoka 120a6e
          const int ww, const int ch, int xx, int yy, const int zz) {
Shinya Kitaoka 120a6e
  pixr.position(ww, hh, xx, yy);
Shinya Kitaoka 120a6e
  if ((xx < 0) || (yy < 0)) {
Shinya Kitaoka 120a6e
    return 0;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  return *(image + (ww * ch * yy + ch * xx + zz));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
template <class t=""></class>
Shinya Kitaoka 120a6e
T median_filter_(igs::median_filter::pixrender &pixr, const T *image,
Shinya Kitaoka 120a6e
                 const int hh, const int ww, const int ch, const int xx,
Shinya Kitaoka 120a6e
                 const int yy, const int zz) {
Shinya Kitaoka 120a6e
  for (unsigned int ii = 0; ii < pixr.around.size(); ++ii) {
Shinya Kitaoka 120a6e
    pixr.around.at(ii) = static_cast<int>(getter_(</int>
Shinya Kitaoka 120a6e
        pixr, image, hh, ww, ch, xx + pixr.xp.at(ii), yy + pixr.yp.at(ii), zz));
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  std::sort(pixr.around.begin(), pixr.around.end());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  /*	中央値(median)計算は、厳密な定義(wikipediaより)によると
Shinya Kitaoka 120a6e
                  奇数(odd)のときは中央値
Shinya Kitaoka 120a6e
                  偶数(even)のときは中央の二つの値の平均
Shinya Kitaoka 120a6e
          となるが、
Shinya Kitaoka 120a6e
          元のPixel値を変えないポリシーにより、
Shinya Kitaoka 120a6e
          偶数の場合も奇数の計算をそのまま流用する。
Shinya Kitaoka 120a6e
          よって偶数の場合は中央の二つの値の大きいほうとなる。
Shinya Kitaoka 120a6e
          2009-03-24
Shinya Kitaoka 120a6e
  */
Shinya Kitaoka 120a6e
  return static_cast<t>(pixr.around.at(pixr.around.size() / 2));</t>
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Shinya Kitaoka 120a6e
namespace {
Shinya Kitaoka 120a6e
double refchk_(const int src, const int tgt, const double refv) {
Shinya Kitaoka 120a6e
  return (src < tgt) ? (tgt - src + 0.999999) * refv + src
Shinya Kitaoka 120a6e
                     : (src - tgt + 0.999999) * (1.0 - refv) + tgt;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
template <class class="" it,="" rt=""></class>
Toshihiro Shimizu 890ddd
void convert_each_to_all_channels_template_(
Shinya Kitaoka 120a6e
    const IT *in, IT *out, const int hh, const int ww, const int ch
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    ,
Shinya Kitaoka 120a6e
    const RT *ref /* 求める画像(out)と同じ高さ、幅、チャンネル数 */
Shinya Kitaoka 120a6e
    ,
Shinya Kitaoka 120a6e
    const int ref_mode  // R,G,B,A,luminance
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    ,
Shinya Kitaoka 120a6e
    const int zz, const double radius,
Shinya Kitaoka 120a6e
    const igs::median_filter::out_of_image type) {
Shinya Kitaoka 120a6e
  igs::median_filter::pixrender pixr(radius, type);
Shinya Kitaoka 120a6e
  const IT *in_pix = in;
Shinya Kitaoka 120a6e
  IT *out_pix      = out;
Shinya Kitaoka 120a6e
  const int r_max  = std::numeric_limits<rt>::max();</rt>
Shinya Kitaoka 120a6e
  for (int yy = 0; yy < hh; ++yy) {
Shinya Kitaoka 120a6e
    for (int xx = 0; xx < ww; ++xx, in_pix += ch, out_pix += ch) {
Shinya Kitaoka 120a6e
      double refv = 1.0;
Shinya Kitaoka 120a6e
      if (ref != 0) {
Shinya Kitaoka 120a6e
        refv *= igs::color::ref_value(ref, ch, r_max, ref_mode);
Shinya Kitaoka 120a6e
        ref += ch;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      const IT v1 = median_filter_(pixr, in, hh, ww, ch, xx, yy, zz);
Shinya Kitaoka 120a6e
      const IT v2 = static_cast<it>(refchk_(in_pix[zz], v1, refv));</it>
Shinya Kitaoka 120a6e
      for (int zz = 0; zz < ch; ++zz) {
Shinya Kitaoka 120a6e
        out_pix[zz] = v2;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  pixr.clear();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
template <class class="" it,="" rt=""></class>
Toshihiro Shimizu 890ddd
void convert_each_to_each_channel_template_(
Shinya Kitaoka 120a6e
    const IT *in, IT *out, const int hh, const int ww, const int ch
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    ,
Shinya Kitaoka 120a6e
    const RT *ref /* 求める画像(out)と同じ高さ、幅、チャンネル数 */
Shinya Kitaoka 120a6e
    ,
Shinya Kitaoka 120a6e
    const int ref_mode  // R,G,B,A,luminance
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    ,
Shinya Kitaoka 120a6e
    const double radius, const igs::median_filter::out_of_image type) {
Shinya Kitaoka 120a6e
  igs::median_filter::pixrender pixr(radius, type);
Shinya Kitaoka 120a6e
  const IT *in_pix = in;
Shinya Kitaoka 120a6e
  IT *out_pix      = out;
Shinya Kitaoka 120a6e
  const int r_max  = std::numeric_limits<rt>::max();</rt>
Shinya Kitaoka 120a6e
  for (int yy = 0; yy < hh; ++yy) {
Shinya Kitaoka 120a6e
    for (int xx = 0; xx < ww; ++xx, in_pix += ch, out_pix += ch) {
Shinya Kitaoka 120a6e
      double refv = 1.0;
Shinya Kitaoka 120a6e
      if (ref != 0) {
Shinya Kitaoka 120a6e
        refv *= igs::color::ref_value(ref, ch, r_max, ref_mode);
Shinya Kitaoka 120a6e
        ref += ch;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      for (int zz = 0; zz < ch; ++zz) {
Shinya Kitaoka 120a6e
        const IT v1 = median_filter_(pixr, in, hh, ww, ch, xx, yy, zz);
Shinya Kitaoka 120a6e
        out_pix[zz] = static_cast<it>(refchk_(in_pix[zz], v1, refv));</it>
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  pixr.clear();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
#include "igs_median_filter.h"
Toshihiro Shimizu 890ddd
#include "igs_ifx_common.h" /* igs::image::rgba */
Toshihiro Shimizu 890ddd
void igs::median_filter::convert(
Shinya Kitaoka 120a6e
    const unsigned char *in_image, unsigned char *out_image
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    ,
Shinya Kitaoka 120a6e
    const int height, const int width, const int channels, const int bits
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    ,
Shinya Kitaoka 120a6e
    const unsigned char *ref /* 求める画像と同じ高、幅、ch数 */
Shinya Kitaoka 120a6e
    ,
Shinya Kitaoka 120a6e
    const int ref_bits /* refがゼロのときはここもゼロ */
Shinya Kitaoka 120a6e
    ,
Shinya Kitaoka 120a6e
    const int ref_mode /* 0=R,1=G,2=B,3=A,4=Luminance,5=Nothing */
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    ,
Shinya Kitaoka 120a6e
    const int zz  // 0(R),1(G),2(B),3(A),4(EachCh)
Shinya Kitaoka 120a6e
    ,
Shinya Kitaoka 120a6e
    const double radius  // 0...
Shinya Kitaoka 120a6e
    ,
Shinya Kitaoka 120a6e
    const int out_side_type  // 0(Spread),1(Flip),2(bk),3(Repeat)
Shinya Kitaoka 120a6e
    ) {
Shinya Kitaoka 120a6e
  /*--- 指定(zz)から、実際に処理すべき色チャンネル(z2)を得る ---*/
Shinya Kitaoka 120a6e
  int z2 = zz;
Shinya Kitaoka 120a6e
  if (igs::image::rgba::siz == channels) {
Shinya Kitaoka 120a6e
    switch (zz) {
Shinya Kitaoka 120a6e
    case 0:
Shinya Kitaoka 120a6e
      z2 = igs::image::rgba::red;
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    case 1:
Shinya Kitaoka 120a6e
      z2 = igs::image::rgba::gre;
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    case 2:
Shinya Kitaoka 120a6e
      z2 = igs::image::rgba::blu;
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    case 3:
Shinya Kitaoka 120a6e
      z2 = igs::image::rgba::alp;
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    default:
Shinya Kitaoka 120a6e
      z2 = igs::image::rgba::siz;
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else if (igs::image::rgb::siz == channels) {
Shinya Kitaoka 120a6e
    switch (zz) {
Shinya Kitaoka 120a6e
    case 0:
Shinya Kitaoka 120a6e
      z2 = igs::image::rgb::red;
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    case 1:
Shinya Kitaoka 120a6e
      z2 = igs::image::rgb::gre;
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    case 2:
Shinya Kitaoka 120a6e
      z2 = igs::image::rgb::blu;
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    default:
Shinya Kitaoka 120a6e
      z2 = igs::image::rgb::siz;
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else if (1 == channels) {
Shinya Kitaoka 120a6e
    ;
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    throw std::domain_error("Bad channels,Not rgba/rgb/grayscale");
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  igs::median_filter::out_of_image type = igs::median_filter::is_spread_edge;
Shinya Kitaoka 120a6e
  switch (out_side_type) {
Shinya Kitaoka 120a6e
  case 0:
Shinya Kitaoka 120a6e
    type = igs::median_filter::is_spread_edge;
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  case 1:
Shinya Kitaoka 120a6e
    type = igs::median_filter::is_flip_repeat;
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  case 2:
Shinya Kitaoka 120a6e
    type = igs::median_filter::is_black;
Shinya Kitaoka 120a6e
    break; /* 必要か?????? */
Shinya Kitaoka 120a6e
  case 3:
Shinya Kitaoka 120a6e
    type = igs::median_filter::is_repeat;
Shinya Kitaoka 120a6e
    break; /* 必要か?????? */
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  /* 処理 */
Shinya Kitaoka 120a6e
  if ((std::numeric_limits<unsigned char="">::digits == bits) &&</unsigned>
Shinya Kitaoka 120a6e
      ((std::numeric_limits<unsigned char="">::digits == ref_bits) ||</unsigned>
Shinya Kitaoka 120a6e
       (0 == ref_bits))) {
Shinya Kitaoka 120a6e
    if ((0 <= z2) && (z2 < channels)) {
Shinya Kitaoka 120a6e
      convert_each_to_all_channels_template_(in_image, out_image, height, width,
Shinya Kitaoka 120a6e
                                             channels, ref, ref_mode, z2,
Shinya Kitaoka 120a6e
                                             radius, type);
Shinya Kitaoka 120a6e
    } else {
Shinya Kitaoka 120a6e
      convert_each_to_each_channel_template_(in_image, out_image, height, width,
Shinya Kitaoka 120a6e
                                             channels, ref, ref_mode, radius,
Shinya Kitaoka 120a6e
                                             type);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else if ((std::numeric_limits<unsigned short="">::digits == bits) &&</unsigned>
Shinya Kitaoka 120a6e
             ((std::numeric_limits<unsigned char="">::digits == ref_bits) ||</unsigned>
Shinya Kitaoka 120a6e
              (0 == ref_bits))) {
Shinya Kitaoka 120a6e
    if ((0 <= z2) && (z2 < channels)) {
Shinya Kitaoka 120a6e
      convert_each_to_all_channels_template_(
Shinya Kitaoka 120a6e
          reinterpret_cast<const *="" short="" unsigned="">(in_image),</const>
Shinya Kitaoka 120a6e
          reinterpret_cast<unsigned *="" short="">(out_image), height, width,</unsigned>
Shinya Kitaoka 120a6e
          channels, ref, ref_mode, z2, radius, type);
Shinya Kitaoka 120a6e
    } else {
Shinya Kitaoka 120a6e
      convert_each_to_each_channel_template_(
Shinya Kitaoka 120a6e
          reinterpret_cast<const *="" short="" unsigned="">(in_image),</const>
Shinya Kitaoka 120a6e
          reinterpret_cast<unsigned *="" short="">(out_image), height, width,</unsigned>
Shinya Kitaoka 120a6e
          channels, ref, ref_mode, radius, type);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else if ((std::numeric_limits<unsigned short="">::digits == bits) &&</unsigned>
Shinya Kitaoka 120a6e
             (std::numeric_limits<unsigned short="">::digits == ref_bits)) {</unsigned>
Shinya Kitaoka 120a6e
    if ((0 <= z2) && (z2 < channels)) {
Shinya Kitaoka 120a6e
      convert_each_to_all_channels_template_(
Shinya Kitaoka 120a6e
          reinterpret_cast<const *="" short="" unsigned="">(in_image),</const>
Shinya Kitaoka 120a6e
          reinterpret_cast<unsigned *="" short="">(out_image), height, width,</unsigned>
Shinya Kitaoka 120a6e
          channels, reinterpret_cast<const *="" short="" unsigned="">(ref), ref_mode, z2,</const>
Shinya Kitaoka 120a6e
          radius, type);
Shinya Kitaoka 120a6e
    } else {
Shinya Kitaoka 120a6e
      convert_each_to_each_channel_template_(
Shinya Kitaoka 120a6e
          reinterpret_cast<const *="" short="" unsigned="">(in_image),</const>
Shinya Kitaoka 120a6e
          reinterpret_cast<unsigned *="" short="">(out_image), height, width,</unsigned>
Shinya Kitaoka 120a6e
          channels, reinterpret_cast<const *="" short="" unsigned="">(ref), ref_mode,</const>
Shinya Kitaoka 120a6e
          radius, type);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else if ((std::numeric_limits<unsigned char="">::digits == bits) &&</unsigned>
Shinya Kitaoka 120a6e
             (std::numeric_limits<unsigned short="">::digits == ref_bits)) {</unsigned>
Shinya Kitaoka 120a6e
    if ((0 <= z2) && (z2 < channels)) {
Shinya Kitaoka 120a6e
      convert_each_to_all_channels_template_(
Shinya Kitaoka 120a6e
          in_image, out_image, height, width, channels,
Shinya Kitaoka 120a6e
          reinterpret_cast<const *="" short="" unsigned="">(ref), ref_mode, z2, radius,</const>
Shinya Kitaoka 120a6e
          type);
Shinya Kitaoka 120a6e
    } else {
Shinya Kitaoka 120a6e
      convert_each_to_each_channel_template_(
Shinya Kitaoka 120a6e
          in_image, out_image, height, width, channels,
Shinya Kitaoka 120a6e
          reinterpret_cast<const *="" short="" unsigned="">(ref), ref_mode, radius,</const>
Shinya Kitaoka 120a6e
          type);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    throw std::domain_error("Bad bits,Not uchar/ushort");
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}