1

我正在尋找更快的方式處理下面的C代碼。我有一個640x480的圖像,我想通過刪除圖像中的其他所有行和列來將其大小減少2倍。我在下面附上了代碼。有沒有更好的方法來優化代碼。更快速(優化)的圖像抽取解決方案(C++)

#define INPUT_NUM_ROW 480 
#define INPUT_NUM_COL 640 
#define OUTPUT_NUM_ROW 240 
#define OUTPUT_NUM_COL 320 

unsigned char inputBuf[INPUT_NUM_ROW* INPUT_NUM_COL]; 
unsigned char outputBuf[OUTPUT_NUM_ROW* OUTPUT_NUM_COL]; 

void imageDecimate(unsigned char *outputImage , unsigned char *inputImage) 
{ 
/* Fill in your code here */ 
for (int p = 0; p< OUTPUT_NUM_ROW; p++) { 
    for (int q = 0; q < OUTPUT_NUM_COL; q++) { 
     outputImage[p*OUTPUT_NUM_COL + q] = inputImage[(p*INPUT_NUM_COL+q)*2]; 
     // cout << "The pixel at " << p*OUTPUT_NUM_COL+q << " is " << outputImage[p*OUTPUT_NUM_COL+q] << endl; 
    } 
    } 
} 
+0

大多數圖片都有很多頭字段需要更新。發佈的代碼僅處理實際的數據/像素字段。大多數像素字段(取決於標題信息)長度爲3或4字節。當壓縮圖像時,不要任意消除1/2行和1/2列。一個更好的方法是對行進行平均,然後(在一個單獨的循環中)平均對列,記住每列(一個像素)由3或4個字節組成。另外請記住(在大多數圖像中)一行中的字節數將是4的倍數, – user3629249

+0

您對包含在圖像中的標題字段以及平均像素進行了描述,這些像素反過來使別名不那麼突出。但是,我正在尋找更多的代碼優化。 –

回答

1

而不是每次做數學在內部循環,你可以這樣做:

int outputIndex; 
int inputIndex; 
for (int p = 0; p< OUTPUT_NUM_ROW; p++) { 
    inputIndex = p * INPUT_NUM_COL * 2; 
    outputIndex = p * OUTPUT_NUM_COL; 
    for (int q = 0; q < OUTPUT_NUM_COL; q++) { 
     outputImage[outputIndex] = inputImage[inputIndex]; 
     inputIndex += 2; 
     outputIndex++; 
     // cout << "The pixel at " << p*OUTPUT_NUM_COL+q << " is " << outputImage[p*OUTPUT_NUM_COL+q] << endl; 
    } 
    } 
} 

你可以做的該拷貝賦值直列遞增過了,你也可以只分配inputIndex並outputIndex第一次,但它不會讓你更多的性能提升作爲移動計算出內循環。我假設批量複製功能沒有這種增加的靈活性,但如果他們這樣做,並且他們使用所有目標平臺上可用的硬件加速,那麼這將是一個更好的選擇。

我還假設像這樣的數組訪問編譯到您可以使用的最優化的指針算術。

+0

應該想到這個!謝謝。 +1 –

+0

這沒有考慮到每個像素的實際大小,並沒有垂直減少圖像,也沒有處理每行的「4字節倍數」要求。 – user3629249

+0

@ user3629249 - inputIndex和outputIndex計算之間的差異因數爲2,可實現垂直抽取。如果你的意思是每行的字節總數需要是4個字節的倍數,那麼480和240的常量保證它是。相反,如果您正在討論每個像素的位深度,則沒有說明這是一個每像素32位的圖像,並且每個像素需要4個字節。我只能從這個問題假設它是一個每像素8位的圖像。 –