guided filter: further small reduction of peak memory usage
This commit is contained in:
@@ -32,7 +32,8 @@
|
|||||||
#include "boxblur.h"
|
#include "boxblur.h"
|
||||||
#include "rescale.h"
|
#include "rescale.h"
|
||||||
#include "imagefloat.h"
|
#include "imagefloat.h"
|
||||||
|
#define BENCHMARK
|
||||||
|
#include "StopWatch.h"
|
||||||
namespace rtengine {
|
namespace rtengine {
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
@@ -78,6 +79,7 @@ int calculate_subsampling(int w, int h, int r)
|
|||||||
|
|
||||||
void guidedFilter(const array2D<float> &guide, const array2D<float> &src, array2D<float> &dst, int r, float epsilon, bool multithread, int subsampling)
|
void guidedFilter(const array2D<float> &guide, const array2D<float> &src, array2D<float> &dst, int r, float epsilon, bool multithread, int subsampling)
|
||||||
{
|
{
|
||||||
|
BENCHFUN
|
||||||
const int W = src.width();
|
const int W = src.width();
|
||||||
const int H = src.height();
|
const int H = src.height();
|
||||||
|
|
||||||
@@ -135,16 +137,6 @@ void guidedFilter(const array2D<float> &guide, const array2D<float> &src, array2
|
|||||||
const array2D<float> &p = src;
|
const array2D<float> &p = src;
|
||||||
array2D<float> &q = dst;
|
array2D<float> &q = dst;
|
||||||
|
|
||||||
AlignedBuffer<float> blur_buf(I.width() * I.height());
|
|
||||||
const auto f_mean =
|
|
||||||
[&](array2D<float> &d, array2D<float> &s, int rad) -> void
|
|
||||||
{
|
|
||||||
rad = LIM(rad, 0, (min(s.width(), s.height()) - 1) / 2 - 1);
|
|
||||||
float **src = s;
|
|
||||||
float **dst = d;
|
|
||||||
boxblur<float, float>(src, dst, blur_buf.data, rad, rad, s.width(), s.height());
|
|
||||||
};
|
|
||||||
|
|
||||||
const auto f_subsample =
|
const auto f_subsample =
|
||||||
[=](array2D<float> &d, const array2D<float> &s) -> void
|
[=](array2D<float> &d, const array2D<float> &s) -> void
|
||||||
{
|
{
|
||||||
@@ -153,8 +145,18 @@ void guidedFilter(const array2D<float> &guide, const array2D<float> &src, array2
|
|||||||
|
|
||||||
const auto f_upsample = f_subsample;
|
const auto f_upsample = f_subsample;
|
||||||
|
|
||||||
const int w = W / subsampling;
|
const size_t w = W / subsampling;
|
||||||
const int h = H / subsampling;
|
const size_t h = H / subsampling;
|
||||||
|
|
||||||
|
AlignedBuffer<float> blur_buf(w * h);
|
||||||
|
const auto f_mean =
|
||||||
|
[&](array2D<float> &d, array2D<float> &s, int rad) -> void
|
||||||
|
{
|
||||||
|
rad = LIM(rad, 0, (min(s.width(), s.height()) - 1) / 2 - 1);
|
||||||
|
float **src = s;
|
||||||
|
float **dst = d;
|
||||||
|
boxblur<float, float>(src, dst, blur_buf.data, rad, rad, s.width(), s.height());
|
||||||
|
};
|
||||||
|
|
||||||
array2D<float> I1(w, h);
|
array2D<float> I1(w, h);
|
||||||
array2D<float> p1(w, h);
|
array2D<float> p1(w, h);
|
||||||
@@ -203,6 +205,9 @@ void guidedFilter(const array2D<float> &guide, const array2D<float> &src, array2
|
|||||||
apply(SUBMUL, b, a, meanI, meanp);
|
apply(SUBMUL, b, a, meanI, meanp);
|
||||||
DEBUG_DUMP(b);
|
DEBUG_DUMP(b);
|
||||||
|
|
||||||
|
meanI.free(); // frees w * h * 4 byte
|
||||||
|
meanp.free(); // frees w * h * 4 byte
|
||||||
|
|
||||||
array2D<float> &meana = a;
|
array2D<float> &meana = a;
|
||||||
f_mean(meana, a, r1);
|
f_mean(meana, a, r1);
|
||||||
DEBUG_DUMP(meana);
|
DEBUG_DUMP(meana);
|
||||||
@@ -211,7 +216,7 @@ void guidedFilter(const array2D<float> &guide, const array2D<float> &src, array2
|
|||||||
f_mean(meanb, b, r1);
|
f_mean(meanb, b, r1);
|
||||||
DEBUG_DUMP(meanb);
|
DEBUG_DUMP(meanb);
|
||||||
|
|
||||||
blur_buf.resize(0); // frees W * H * 4 byte
|
blur_buf.resize(0); // frees w * h * 4 byte
|
||||||
|
|
||||||
array2D<float> meanA(W, H);
|
array2D<float> meanA(W, H);
|
||||||
f_upsample(meanA, meana);
|
f_upsample(meanA, meana);
|
||||||
|
Reference in New Issue
Block a user