首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在卤化物中使用C++随机函数?

如何在卤化物中使用C++随机函数?
EN

Stack Overflow用户
提问于 2016-10-13 22:45:58
回答 2查看 634关注 0票数 1

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

该实现尝试使用C++随机数发生器产生正态分布噪声,使用Halide Func在每个像素处产生依赖于信号的噪声标准差,然后将噪声添加到象素中。下面我展示了这些函数的布局。

代码语言:javascript
运行
复制
// 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;
}

这对我来说是有意义的,但不幸的是,当我试图编译时,我收到了以下错误:

代码语言:javascript
运行
复制
../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));  
                                                                ^

因此,似乎不能将Func的输出提供给C++函数。作为卤化物的一个限制,我想这是有意义的,但我并没有看到实现信号相关的正态分布噪声的替代方案。在Halide中是否有其他使用外部C++函数的方法?我见过人们谈论使用"extern“,但不幸的是,关于该功能的文档似乎很轻,我无法找到我需要的东西。

EN

Stack Overflow用户

发布于 2016-10-14 01:04:39

您还可以使用Halide的RNG以及对高斯的二项式近似:

代码语言:javascript
运行
复制
Expr gaussian_random(Expr sigma) {
  return (random_float() + random_float() + random_float() - 1.5f) * 2 * sigma;
}

添加更多的randomFloat实例,以接近真正的正态分布。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40032237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档