c++ - 沿非连续维度对图像进行装箱的最快方法

标签 c++ image image-processing

我有一张 700x2000 uint8 的图像。现在我要进行分箱,也就是对内存中不连续的每4行求和。

现在我正在为这条线的总和分配一个新数组并将每一行添加到它。

float* binnedLine = new float[lineSize];
char* binnedLineInt = new char[lineSize];

for (int j = 0; j < nlines; j++) 
{
    if (j % binsize == 0) 
    {
        for (int i = 0; i < lineSize; i++) 
        {
            binnedLine[i] = (static_cast<float> (static_cast<char>(data[j*lineSize + i]))) / binsize;
            binnedLineInt[i] = static_cast<char>(binnedLine[i]);
        };
    }
    else 
    {
        for (int i = 0; i < lineSize; i++) 
        {
            binnedLine[i] += (static_cast<float> (static_cast<char>(data[j*lineSize + i]))) / binsize;
            binnedLineInt[i] = static_cast<char>(binnedLine[i]);
        };
    }

    ...
}

但是性能并不足以满足我的目的(每帧需要 3 毫秒)。有没有更有效的方法?

最佳答案

您将 float 值转换为 char 4 次,但只保留最后一次转换。同时,我们将删除 if%,并避免多余的除法。试试这个:

float* binnedLine = new float[lineSize];
char* binnedLineInt = new char[lineSize];

for (int j = 0; j < nlines; j += binsize) 
{
    for (int i = 0; i < lineSize; ++i) 
    {
        binnedLine[i] = static_cast<float>(data[j*lineSize + i]);
    };
    for (int k = 1; k < binsize; ++k)
    {
        for (int i = 0; i < lineSize; ++i) 
        {
            binnedLine[i] += static_cast<float>(data[(j+k)*lineSize + i]);
        };
    }
    for (int i = 0; i < lineSize; ++i) 
    {
        binnedLineInt[i] = static_cast<char>(binnedLine[i] / binsize);
    }
    ...
}

但是作为@MSalters said in a comment ,您最好一次访问四行,因为这样可以避免保留和写入额外的浮点缓冲区:

char* binnedLineInt = new char[lineSize];

for (int j = 0; j < nlines; j += binsize) 
{
    for (int i = 0; i < lineSize; ++i) 
    {
        float sum = static_cast<float>(data[j*lineSize + i]);
        for (int k = 1; k < binsize; ++k)
        {
            sum += static_cast<float>(data[(j+k)*lineSize + i]);
        }
        binnedLineInt[i] = static_cast<char>(sum / binsize);
    }
    ...
}

此外,较短的代码更容易正确和维护。

关于c++ - 沿非连续维度对图像进行装箱的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54571960/

相关文章:

c++ - 如何最小化模板代码?

c++ - 如何在堆栈上创建一个 int 指针?

python - 如何在 python 3 中获得 jpeg 分辨率,而不需要任何外来库?

java - 绘制缓冲图像时 Java 2D 的性能问题

matlab - LMDB文件以及它们如何用于caffe深度学习网络

c++ - 多态和通过带指针的结构进行转换

javascript - 如何打开图像并打印?

image-processing - 将 EXR 图像序列转换为 .MOV

python - 如何检测边缘上的轮廓或 Blob ?

c++ - 矩阵(dis)分配