|
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 |
}
|