【发布时间】:2017-06-08 10:20:36
【问题描述】:
我尝试编写一段代码,获取方形图像并应用锐化内核。
我确实成功地完成了我的任务,但我对我的程序的运行时间感到失望。模糊图像和锐化图像(500x500)所需的时间大约需要 16 毫秒,我想比这更低,我使用了callgrind 和cachegrind,我确实看到我的缓存未命中率非常低(大约 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