Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用C++;卤化物中的随机函数?_C++_Halide - Fatal编程技术网

C++ 如何使用C++;卤化物中的随机函数?

C++ 如何使用C++;卤化物中的随机函数?,c++,halide,C++,Halide,我的目标是能够在卤化物中模拟信号相关的高斯噪声。我有一个内置在OpenCV中的模型,我现在正在将其移植到Halide。挑战在于卤化物的随机数发生器不是正态分布的,所以我需要使用一个外部函数来产生噪声值 实现尝试使用C++随机数发生器产生正常分布的噪声,卤素FUNC产生每个像素的噪声的信号相关标准偏差,然后将噪声添加到RealISE中的像素。下面我展示了函数的布局 // Note: This is an implementation of the noise model found in the

我的目标是能够在卤化物中模拟信号相关的高斯噪声。我有一个内置在OpenCV中的模型,我现在正在将其移植到Halide。挑战在于卤化物的随机数发生器不是正态分布的,所以我需要使用一个外部函数来产生噪声值

实现尝试使用C++随机数发生器产生正常分布的噪声,卤素FUNC产生每个像素的噪声的信号相关标准偏差,然后将噪声添加到RealISE中的像素。下面我展示了函数的布局

// Note: This is an implementation of the noise model found in the paper below:
// "Noise measurement for raw-data of digital imaging sensors by 
// automatic segmentation of non-uniform targets"
float get_normal_dist_rand( float mean, float std_dev ) {
  std::default_random_engine generator;
  std::normal_distribution<float> distribution(mean,std_dev);
  float out = distribution(generator);
  return out;
}

Func make_get_std_dev( Func *in_func ) {
  Var x, y, c;
  float q = 0.0060;
  float p = 0.0500;
  // std_dev = q * sqrt(unnoised_pixel - p)
  Func get_std_dev("get_std_dev");
    get_std_dev(x,y,c) = q * sqrt( (*in_func)(x,y,c) - p );
  return get_std_dev;
}

Func make_renoise( Func *in_func, Func *std_dev ) {
  Var x, y, c;
  // Noise parameters
  // noised_pixel = unnoised_pixel + 
  //                  gaussian_rand( std_dev = q * sqrt(unnoised_pixel - p) )
  // q and p values do not vary between channels
  Func renoise("renoise");
    renoise(x,y,c) = (*in_func)(x,y,c) +  
                       get_normal_dist_rand(0,(*std_dev)(x,y,c));   
  return renoise;
}
//注意:这是本文中噪声模型的实现:
//数字成像传感器原始数据的噪声测量
//“非均匀目标的自动分割”
浮点获取正常距离随机数(浮点平均值、浮点标准偏差){
std::默认随机引擎生成器;
标准:正态分布(平均值,标准偏差);
浮出=分配(发电机);
返回;
}
Func make\u get\u std\u dev(Func*in\u Func){
变量x,y,c;
浮动q=0.0060;
浮球p=0.0500;
//标准偏差=q*sqrt(无噪声像素-p)
Func get_std_dev(“get_std_dev”);
get_std_dev(x,y,c)=q*sqrt((*in_func)(x,y,c)-p);
返回get_std_dev;
}
Func make\u renoise(Func*in\u Func,Func*std\u dev){
变量x,y,c;
//噪声参数
//有噪像素=无噪像素+
//高斯随机(标准偏差=q*sqrt(无噪声像素-p))
//q和p值在通道之间不变化
Func renoise(“renoise”);
renoise(x,y,c)=(*in_func)(x,y,c)+
获得正常距离(0,(*std_-dev)(x,y,c));
回归理性;
}
这对我来说很有意义,但不幸的是,我在尝试编译时收到以下错误:

../common/pipe_stages.cpp: In function 'Halide::Func make_renoise(Halide::Func*, Halide::Func*)':
../common/pipe_stages.cpp:223:64: error: cannot convert 'std::enable_if<true, Halide::FuncRef>::type {aka Halide::FuncRef}' to 'float' for argument '2' to 'float get_normal_dist_rand(float, float)'
                        get_normal_dist_rand(0,(*std_dev)(x,y,c));  
                                                                ^
。/common/pipe\u stages.cpp:在函数“Halide::Func make\u renoise(Halide::Func*,Halide::Func*)”中:
../common/pipe_stages.cpp:223:64:错误:无法将参数“2”的“std::enable_if::type{aka Halide::FuncRef}”转换为“float”,以“float get_normal_dist_rand(float,float)”表示
获得正常距离(0,(*std_-dev)(x,y,c));
^

所以,似乎FUNC的输出不能提供给C++函数。我想这是卤化物的一个限制,但我真的看不到实现依赖信号的正态分布噪声的替代方案。是否有另一种方法在卤化物中使用外部C++函数?我看到人们谈论使用“Extn”,但遗憾的是,文档的功能似乎很轻,我无法找到我需要的。

< p>您需要使用我们的一个外部机制来绑定C++代码。Halidextern_*是两者中比较容易的一个,它可以让你打电话一次获取一个随机数。唉,test/correction/c_function.cpp就是一个直接的例子,这会有所帮助,但可能会更清楚

我希望出于效率考虑,您希望一次请求一个随机数缓冲区。这可以通过define_extern机制完成。C++函数必须参与边界推断,所以它有点牵涉。这方面的测试是正确性/extern_producer.cpp


我希望将随机数转换成适当的分布,或者在Halide中实现随机数生成算法是实现真正快速生成代码的正确方法,但这可能比您最初想要做的工作要多。

您也可以使用卤化物的RNG以及高斯分布的二项式近似:

Expr gaussian_random(Expr sigma) {
  return (random_float() + random_float() + random_float() - 1.5f) * 2 * sigma;
}

添加更多的randomFloat实例,使其越来越接近真实的正态分布。

此外,请随时在内置的randomFloat支持上提出问题,该支持不提供您需要的功能。我现在有点赶时间,所以我不确定这里的答案是否正确,但这似乎应该变得更容易。