【问题标题】:Fastest way to find if a number is in range查找数字是否在范围内的最快方法
【发布时间】:2017-06-08 10:20:36
【问题描述】:

我尝试编写一段代码,获取方形图像并应用锐化内核。

我确实成功地完成了我的任务,但我对我的程序的运行时间感到失望。模糊图像和锐化图像(500x500)所需的时间大约需要 16 毫秒,我想比这更低,我使用了callgrindcachegrind,我确实看到我的缓存未命中率非常低(大约 3% ) 所以当我试图缩小问题范围时,我注意到每次我在像素上应用内核时,我都会询问以下是否有任何通道在 [0,255] 范围内。我想知道是否有一种快速的方法来计算数字是否在范围内到目前为止我使用以下宏:

#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))

我的像素结构:

typedef struct {
    unsigned char red;
    unsigned char green;
    unsigned char blue;
} pixel;

和我的计算:

//p is a struct of pixel.
p.red = min(max(sumRed, 0), 255);
p.green = min(max(sumGreen, 0), 255);
p.blue = min(max(sumBlue, 0), 255);

【问题讨论】:

  • sumRed的取值范围是什么,它的类型是什么?
  • 为什么需要询问值是否在 0-255 范围内?如果这是一个 8 位的图像,它应该不是给定的?
  • 您希望通过max(sumRed, 0) 实现什么目标?这些是unsigned 值。
  • sumRed 是一个整数,它是像素红色值的总和,这是我第一次做这样的事情,因为我读到我需要在像素上应用内核,我的信息来自这里:en.wikipedia.org/wiki/Kernel_(image_processing)
  • 应用内核后的值可以是负数,因为内核是 { {-1, -1 , -1} {-1, 9,-1}{-1, -1,-1 }} 所以可以说在应用内核后我得到一个负值我想把一个零因为这样的像素值不存在。

标签: c performance image-processing optimization


【解决方案1】:

您实际上是在寻找一种将值限制在给定范围内的快速方法。

如果您知道值可以采用的最大范围,这可能可以通过使用的算法确定,您可以使用带有偏移量的查找表:

// clamp_table is a table of unsigned char of size maxvalue - minvalue + 1
// initialized this way:
unsigned char clamp_table[maxvalue - minvalue + 1];
for (size_t i = minvalue; i < 0; i++) {
    clamp_table[i - minvalue] = 0;
}
for (size_t i = 0; i < 256; i++) {
    clamp_table[i - minvalue] = i;
}
for (size_t i = 256; i <= maxvalue; i++) {
    clamp_table[i - minvalue] = 255;
}

// clamping becomes a simple table indirection:
r.red = clamp_table[sumRed - minvalue];
r.green = clamp_table[sumGreen - minvalue];
r.blue = clamp_table[sumBlue - minvalue];

minvaluemaxvalue 在编译时应该是已知的,然后可以将 clamp_table 设为静态初始化的 const 数组以提高性能。

【讨论】:

  • 非常感谢!我确实提高了我的运行时间,现在我站在 5 毫秒!
  • 您可以在codereview.stackoverflow.com 上使用过滤器的完整代码提出一个单独的问题,以寻求潜在的改进。过滤器可以大幅调整,例如使用向量内在函数。
猜你喜欢
  • 1970-01-01
  • 2021-06-20
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
相关资源
最近更新 更多