2017-01-23 105 views
0

我嘗試編寫一段代碼,該代碼需要一個正方形圖像並應用銳化內核。查找數字是否在範圍內的最快方法

我確實設法在我的任務中取得成功,但我對我的程序運行時間感到失望。模糊圖像和銳化它需要的時間(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); 
+0

'sumRed'的值範圍是什麼?它的類型是什麼? – chux

+0

爲什麼您需要詢問數值是否在0-255的範圍內?如果這是一個8位的圖像,它應該是一個給定的不是? –

+1

你希望用max(sumRed,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設置爲靜態初始化的常量數組以提高性能。

+0

非常感謝!我確實提高了我的跑步時間,現在我站在5毫秒! –

+1

您可以在http://codereview.stackoverflow.com上詢問您的過濾器完整代碼的單獨問題,以尋求潛在的改進。過濾器可以大幅調整,例如使用矢量內在函數。 – chqrlie

相關問題