1

我正在寻找一种更快的方法来处理以下 C 代码。我有一张 640x480 的图像,我想通过删除图像中的所有其他行和列来将其抽取 2 倍。我在下面附上了代码。有没有更好的方法来优化代码。

#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;
    }
  }
}
4

1 回答 1

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,但它不会像将计算移出内部循环那样为您带来性能提升。我假设批量复制功能不具有这种递增的灵活性,但如果它们这样做并且它们使用所有目标平台上都可用的硬件加速,那么这将是一个更好的选择。

我还假设像这样的数组访问编译为您可以使用的最优化的指针算法。

于 2016-10-21T22:48:47.677 回答