18 #ifndef PIC_FILTERING_FILTER_BILATERAL_2DAS_HPP 19 #define PIC_FILTERING_FILTER_BILATERAL_2DAS_HPP 23 #include "../base.hpp" 24 #include "../util/std_util.hpp" 25 #include "../util/precomputed_gaussian.hpp" 26 #include "../filtering/filter_sampling_map.hpp" 27 #include "../point_samplers/sampler_random_m.hpp" 154 this->
sigma_r_sq_2 = this->sigma_r * this->sigma_r * 2.0f;
166 }
else if(mult < 0) {
198 std::mt19937 m(
seed);
200 for(
int i = box->
y0; i < box->y1; i++) {
201 float x = float(i) / dst->
heightf;
203 for(
int j = box->
x0; j < box->x1; j++) {
206 float *dst_data = (*dst)(j, i);
207 float *edge_data = (*edge)(j, i);
214 float y = float(j) / dst->
widthf;
217 float tmpValOut = 1.0f - valOut;
218 float levelVal =
CLAMPi(tmpValOut, 0.0
f, 0.9
f) * float(ps->
levelsR.size());
220 int levelInt = int(floorf(levelVal));
221 int nSamples = ps->
levelsR[levelInt];
223 int levelsRsize = int(ps->
levelsR.size()) - 1;
224 if(levelInt < levelsRsize) {
225 if((levelVal -
float(levelInt)) > 0.0f) {
226 nSamples += int(
float(ps->
levelsR[levelInt + 1] - ps->
levelsR[levelInt]) *
227 (levelVal -
float(levelInt)));
231 if((nSamples % 2) == 1) {
238 for(
int k = 0; k < nSamples; k += 2) {
250 float *cur_edge = (*edge)(cj, ci);
259 float weight = G1 * G2;
263 float *base_data_ci_cj = (*base)(cj, ci);
265 for(
int l = 0; l < channels; l++) {
266 dst_data[l] += base_data_ci_cj[l] * weight;
274 float *base_data = (*base)(j, i);
The BBox class manages the creation of bounding boxes for images.
Definition: bbox.hpp:29
float sigma_r_sq_2
Definition: filter_bilateral_2das.hpp:37
The FilterSamplingMap class.
Definition: filter_sampling_map.hpp:34
int channels
Definition: image.hpp:80
T * delete_s(T *data)
delete_s
Definition: std_util.hpp:123
Image * samplingMap
Definition: filter_bilateral_2das.hpp:41
std::vector< Image * > ImageVec
ImageVec an std::vector of pic::Image.
Definition: image_vec.hpp:29
The FilterBilateral2DAS class.
Definition: filter_bilateral_2das.hpp:34
int x0
Definition: bbox.hpp:32
The MRSamplers class.
Definition: sampler_random_m.hpp:34
MRSamplers< 2 > * ms
Definition: filter_bilateral_2das.hpp:43
void update(float sigma_s, float sigma_r, int mult, SAMPLER_TYPE type)
update
Definition: filter_bilateral_2das.hpp:148
The Filter class.
Definition: filter.hpp:50
Definition: point_samplers.hpp:51
ImageSamplerBilinear isb
Definition: filter_bilateral_2das.hpp:39
virtual Image * Process(ImageVec imgIn, Image *imgOut)
Process.
Definition: filter.hpp:390
float heightf
Definition: image.hpp:84
std::string signature()
Signature.
Definition: filter_bilateral_2das.hpp:101
Image * setupAux(ImageVec imgIn, Image *imgOut)
setupAux
Definition: filter_bilateral_2das.hpp:85
float * coeff
Definition: precomputed_gaussian.hpp:67
Vec< 2, int > Vec2i
Vec2i.
Definition: vec.hpp:829
static T distanceSq(T *data0, T *data1, int n)
distanceSq
Definition: array.hpp:195
float sigma_r
Definition: filter_bilateral_2das.hpp:37
int y0
Definition: bbox.hpp:32
int seed
Definition: filter_bilateral_2das.hpp:40
RandomSampler< N > * getSampler(std::mt19937 *m)
getSampler gets a sampler at a given level
Definition: sampler_random_m.hpp:139
Image * Process(ImageVec imgIn, Image *imgOut)
Process.
Definition: filter_npasses.hpp:310
float sigma_s
Definition: filter_bilateral_2das.hpp:37
Image * allocateOutputMemory(ImageVec imgIn, Image *imgOut, bool bDelete)
allocateOutputMemory
Definition: filter_radial_basis_function.hpp:217
std::string genBilString(std::string type, float sigma_s, float sigma_r)
genBilString
Definition: string.hpp:366
#define PIC_INLINE
Definition: base.hpp:33
SAMPLER_TYPE
Definition: point_samplers.hpp:51
FilterBilateral2DAS()
FilterBilateral2DAS.
Definition: filter_bilateral_2das.hpp:122
std::vector< int > samplesR
Definition: sampler_random.hpp:53
~FilterBilateral2DAS()
Definition: filter_bilateral_2das.hpp:141
float widthf
Definition: image.hpp:84
static Image * execute(Image *imgIn, Image *imgOut, float sigma_s, float sigma_r)
execute
Definition: filter_bilateral_2das.hpp:114
void SampleImage(Image *img, float x, float y, float *vOut)
SampleImage samples an image in normalized coordiantes (0,1).
Definition: image_sampler_bilinear.hpp:42
#define MIN(a, b)
Definition: math.hpp:69
The Image class stores an image as buffer of float.
Definition: image.hpp:60
PrecomputedGaussian * pg
Definition: filter_bilateral_2das.hpp:38
static void div(T *data, int size, T value)
div
Definition: array.hpp:353
The PrecomputedGaussian class.
Definition: precomputed_gaussian.hpp:30
int halfKernelSize
Definition: precomputed_gaussian.hpp:66
virtual void f(FilterFData *data)
f
Definition: filter_radial_basis_function.hpp:69
Definition: point_samplers.hpp:51
#define CLAMPi(x, a, b)
Definition: math.hpp:81
PIC_INLINE ImageVec Single(Image *img)
Single creates an std::vector which contains img; this is for filters input.
Definition: image_vec.hpp:36
Definition: bilateral_separation.hpp:25
static T * assign(T *data, int size, T *ret)
assign
Definition: array.hpp:464
The RandomSampler class.
Definition: sampler_random.hpp:43
void ProcessBBox(Image *dst, ImageVec src, BBox *box)
ProcessBBox.
Definition: filter_bilateral_2das.hpp:174
bool bDelete
Definition: filter_radial_basis_function.hpp:120
float * getMaxVal(BBox *box, float *ret)
getMaxVal computes the maximum value for the current Image.
The ImageSamplerBilinear class.
Definition: image_sampler_bilinear.hpp:28
The Vec class.
Definition: vec.hpp:35
std::vector< int > levelsR
Definition: sampler_random.hpp:57