Более быстрое (оптимизированное) решение для прореживания изображений (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;
    }
  }
}

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 только в первый раз, но это не принесет вам такой прирост производительности, как перемещение вычисления из внутреннего цикла. Я предполагаю, что функции массового копирования не обладают такой способностью увеличивать гибкость, но если они имеют такую ​​возможность и используют аппаратное ускорение, доступное на всех ваших целевых платформах, то это был бы лучший выбор.

Я также предполагаю, что такой доступ к массиву сводится к самой оптимизированной арифметике указателей, которую вы можете использовать.

Другие вопросы по тегам