31 int cell_w,
int cell_h,
32 T invalid_value, T kappa1, T kappa2, T kappa3,
33 T rtol,
size_t max_iter): m_image(image),
34 m_cell_w(cell_w), m_cell_h(cell_h),
35 m_invalid(invalid_value),
36 m_kappa1(kappa1), m_kappa2(kappa2), m_kappa3(kappa3),
37 m_rtol(rtol), m_max_iter(max_iter) {
52 for (
int y = 0;
y <
m_mode->getHeight(); ++
y) {
53 for (
int x = 0;
x <
m_mode->getWidth(); ++
x) {
60 for (
int y = 0;
y <
m_mode->getHeight(); ++
y) {
61 for (
int x = 0;
x <
m_mode->getWidth(); ++
x) {
93 auto atol = (ref_bin.second - ref_bin.first) * 0.1;
95 T mean, median, sigma;
97 T prev_sigma = sigma * 10;
101 for (
size_t iter = 0; iter < m_max_iter && sigma >
atol && std::abs(sigma / prev_sigma - 1.0) > m_rtol; ++iter) {
102 histo.
clip(median - sigma * m_kappa3, median + sigma * m_kappa3);
109 if (std::abs(sigma) == 0) {
113 else if (std::abs((mean - median) / sigma) < 0.3) {
114 mode = 2.5 * median - 1.5 * mean;
126 int off_x =
x * m_cell_w;
127 int off_y =
y * m_cell_h;
131 auto img_chunk_ptr = img.
getChunk(off_x, off_y, w, h);
132 auto& img_chunk = *img_chunk_ptr;
137 for (
int y = 0;
y < h; ++
y) {
138 for (
int x = 0;
x < w; ++
x) {
139 auto v = img_chunk.getValue(
x,
y);
145 if (filtered.
size() /
static_cast<float>(w * h) < 0.5) {
151 std::tie(mode, sigma) = getBackGuess(filtered);
std::tuple< VarType, VarType, VarType > getStats() const
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > x
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > y
void clip(VarType min, VarType max)
std::pair< VarType, VarType > getBinEdges(size_t i) const
T emplace_back(T... args)