更快(优化)的图像抽取解决方案(C ++)

时间:2016-10-21 22:20:28

标签: c algorithm image-processing optimization image-optimization

我正在寻找一种更快捷的方式来处理以下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;
    }
  }
}

1 个答案:

答案 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,但它不会为您提供与将计算移出的相同的性能提升。内循环。我认为批量复制功能不具备这种递增灵活性,但如果他们这样做并且他们使用所有目标平台上可用的硬件加速,那么这将是更好的选择。

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