查找数字是否在

时间:2017-01-23 19:40:05

标签: c performance image-processing optimization

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

我确实成功完成了我的任务,但我对程序的运行时间感到失望。模糊图像并将其锐化(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);

1 个答案:

答案 0 :(得分:3)

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

如果您知道值可以采用的最大范围(可以根据使用的算法确定),则可以使用带偏移量的查找表:

// 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数组,以提高性能。