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

标签 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;
    }
  }
}

最佳答案

您可以这样做,而不是每次都在内循环中进行数学运算:

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

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

关于c - 更快(优化)的图像抽取解决方案 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40186216/

相关文章:

java - ubuntu (C) 和 windows (Java) 之间的 TCP/IP 连接

java - 如何在函数式分而治之 Java 算法中实现函数 "divide"?

php - 将jpg保存为png会增加尺寸

c - C中的内存起始位置

将 C 变量的内容复制到寄存器 (GCC)

php - 类似于Axis X, Y - 需要检查多个值,怎么办?

c++ - STL 排序 - 严格弱排序

Android:BitmapFactory.decodeByteArray 给出像素化位图

android - 为什么 OpenCV4Android 的 pointPolygonTest() 方法为每个像素返回-1?

c - 为什么会导致执行错误呢?