如何在装配中转置图像?

时间:2010-05-21 17:46:22

标签: image-processing assembly x86 masm

我正在研究一个项目,我需要根据图像的行和列来计算某些东西。获取图像行的位很容易。但是,为了获取每列的位,我需要转置图像,使列成为行。

我正在使用BMP图片作为输入。 BMP图片中有多少行X列?我想在可能的情况下看到伪代码或其他东西。

2 个答案:

答案 0 :(得分:2)

听起来你想要执行一个与旋转有点不同的矩阵转置。在旋转中,行可以成为列,但是行或列将根据旋转方向以相反的顺序。换位维护行和列的原始顺序。

我认为使用正确的算法比使用汇编或只是C更重要。旋转90度或换位真的归结为移动记忆。如果你使用像这样的天真算法,最重要的是缓存未命中的影响:

for(int x=0; x<width; x++)
{
    for(y=0; y<height; y++)
        out[x][y] = in[y][x];
}

这会导致很多缓存未命中,因为你在内存中跳了很多次。使用基于块的方法更有效。 Google用于“缓存高效矩阵转置”。

您可以获得一些收益的一个地方是使用SSE指令一次移动多个数据。这些可在汇编和C中使用。另请查看this link。大约一半时间他们有一个关于计算快速矩阵转置的部分。

修改 我刚刚看到你的评论说你正在为集会中的一个班级做这个,所以你可能会忽略我所说的大部分内容。我认为你在使用装配时想要挤出最佳性能。

答案 1 :(得分:1)

它有所不同。 BMP可以具有任何大小(最大限制),它们也可以采用不同的格式(32位RBG,24位RBG,16位调色板,8位调色板,1位单色),依此类推

与大多数其他问题一样,最好先用您选择的高级语言编写解决方案,然后根据需要将部分或全部转换为ASM。

但是,对于这项任务的最简单形式,即32位RGB格式,以90度的多倍旋转将像旋转二维阵列一样。