我正在做一个项目,我需要根据图像的行和列计算一些东西。很容易获取图像行的位。但是,要获取每列的位,我需要转置图像,使列变为行。
我使用 BMP 图片作为输入。BMP图片中有多少行X列?如果可能的话,我也想看看伪代码或其他东西。
我正在做一个项目,我需要根据图像的行和列计算一些东西。很容易获取图像行的位。但是,要获取每列的位,我需要转置图像,使列变为行。
我使用 BMP 图片作为输入。BMP图片中有多少行X列?如果可能的话,我也想看看伪代码或其他东西。
听起来您想要执行与旋转略有不同的矩阵转置。在旋转中,行可能会变成列,但根据旋转方向,行或列的顺序会相反。转置保持行和列的原始顺序。
我认为使用正确的算法比使用汇编还是只使用 C 更重要。旋转 90 度或换位实际上归结为只是移动内存。如果您使用这样的简单算法,需要考虑的最重要的事情是缓存未命中的影响:
for(int x=0; x<width; x++)
{
for(y=0; y<height; y++)
out[x][y] = in[y][x];
}
这将导致很多缓存未命中,因为您在内存中跳来跳去很多。使用基于块的方法更有效。谷歌“缓存高效矩阵转置”。
您可能会获得一些收益的一个地方是使用 SSE 指令一次移动多个数据。这些在汇编和 C 中都可用。还请查看此链接。大约一半的时候,他们有一节关于计算快速矩阵转置。
编辑: 我刚刚看到你的评论,你正在为一个装配类做这个,所以你可能会忽略我所说的大部分内容。我假设您正在寻找自使用汇编以来的最佳性能。
它因人而异。BMP 可以有任何大小(有限制),它们也可以是不同的格式(32 位 RBG、24 位 RBG、16 位调色板、8 位调色板、1 位单色)等等.
与大多数其他问题一样,最好先用您选择的高级语言编写解决方案,然后根据需要将其部分或全部转换为 ASM。
但是,是的,对于这个任务最简单的形式,即 32 位 RGB 格式,以 90 度的倍数旋转就像旋转二维数组一样。