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