gpt4 book ai didi

c++ - C++ 中的快速图像(或矩阵)转置实现

转载 作者:太空宇宙 更新时间:2023-11-03 23:00:50 32 4
gpt4 key购买 nike

post讨论了如何使用 OpenCV 转置图像,在这里我想更进一步:假设图像是灰度图像,使用 C++ 转置它(或矩阵)的最快方法是什么?我的解决方案如下:

        // image data is stored in an image buffer image*buffer_

unsigned char *mem = (unsigned char *) malloc(image.bufferSize_);

int height = image.Height();
int width = image.Width();
for(int i=0; i<height; i++)
{
unsigned char *ptr =image.buffer_+i*width;
for(int j=0; j<width; j++)
*(mem+j*height+i) = *(ptr+j);
}


memcpy(image.buffer_,mem,image.bufferSize_);
free(mem);

上面代码的一些解释:我们创建了一个包含基本图像信息以及图像像素的图像对象(在image.buffer_中)。当图像像素存储在 image.buffer_ 中时,我们假设图像像素是逐行保存的。关于进一步改进上述代码的任何想法?

最佳答案

在不触及 malloc/free 部分的情况下,复制部分可以这样进行:

    size_t len = image.bufferSize_,
len1 = len - 1;

unsigned char *src = image.buffer_,
*dest = mem,
*end = dest + len;

for(size_t i = 0; i < len; i++)
{
*dest++ = *src; // dest moves to next row
src += height; // src moves to next column

// src wraps around and moves to next row
if (src > end) src -= len1;
}

这相当于拥有一个按列的目标迭代器和一个按行的源迭代器。

在没有实际测试的情况下,我觉得这会更快:它在内部循环中有 3 个偏移计算操作,而在您的版本中有 4 个(加上两个版本中的 2 个取消引用操作)。

编辑

再改进,再更正:

    //...
unsigned char *src = image.buffer_,
*src_end = src + len,
*dest = mem,
*dest_end = dest + len;

while (dest != dest_end)
{
*dest++ = *src; // dest moves to next row
src += height; // src moves to next column

// src wraps around and moves to next row
if (src > src_end) src -= len1;
}

这在每次迭代中节省了一个操作(for 循环中的i++)。此外,src 与之前错误的 end 进行了比较。

关于c++ - C++ 中的快速图像(或矩阵)转置实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18869487/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com