更快(优化)的图像抽取解决方案 (C++)
A more faster (optimized) solution to image decimation (C++)
我正在寻找一种处理以下 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;
}
}
}
与其每次都在内循环中进行数学运算,不如这样做:
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,但它不会像将计算移出内循环。我假设批量复制功能没有这种递增的灵活性,但如果它们有并且它们使用在所有目标平台上可用的硬件加速,那将是更好的选择。
我还假设像这样的数组访问可以编译成您可以使用的最优化的指针算法。
我正在寻找一种处理以下 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;
}
}
}
与其每次都在内循环中进行数学运算,不如这样做:
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,但它不会像将计算移出内循环。我假设批量复制功能没有这种递增的灵活性,但如果它们有并且它们使用在所有目标平台上可用的硬件加速,那将是更好的选择。
我还假设像这样的数组访问可以编译成您可以使用的最优化的指针算法。