6

私はプロジェクトに取り組んでおり、画像の行と列に基づいて何かを計算する必要があります。画像の行のビットを取得するのは簡単です。ただし、各列のビットを取得するには、列が行になるように画像を転置する必要があります。

入力として BMP 画像を使用しています。BMP 画像には何行 X 列ありますか? できれば疑似コードか何かも見たいです。

4

2 に答える 2

2

回転とは少し異なる行列転置を実行したいようです。ローテーションでは、行が列になる場合がありますが、ローテーションの方向に応じて、行または列のいずれかが逆の順序になります。転置は、行と列の元の順序を維持します。

アセンブリを使用するか、Cだけを使用するかよりも、適切なアルゴリズムを使用することがはるかに重要だと思います。90度の回転または転置は、実際にはメモリを移動するだけです。考慮すべき最大のことは、次のような単純なアルゴリズムを使用した場合のキャッシュミスの影響です。

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

これにより、メモリ内を頻繁にジャンプするため、多くのキャッシュミスが発生します。ブロックベースのアプローチを使用する方が効率的です。「キャッシュ効率の高い行列転置」のためのGoogle。

いくつかの利益を得ることができるかもしれない1つの場所は、一度に複数のデータを移動するためにSSE命令を使用することです。これらはアセンブリおよびCで利用できます。このリンクも確認してください。約半分のところに、高速行列転置の計算に関するセクションがあります。

編集: 私はあなたがアセンブリのクラスのためにこれをしているというあなたのコメントを見たので、おそらく私が言ったことのほとんどを無視することができます。アセンブリを使用していたので、最高のパフォーマンスを引き出すことを検討していると思いました。

于 2010-05-21T18:19:58.413 に答える
1

それは異なります。BMP は (制限まで) 任意のサイズにすることができ、さまざまな形式 (32 ビット RBG、24 ビット RBG、16 ビット パレット、8 ビット パレット、1 ビット モノクロ) などにすることもできます。 .

他のほとんどの問題と同様に、最初に選択した高級言語でソリューションを作成し、必要に応じてその一部またはすべてを ASM に変換することをお勧めします。

しかし、はい、このタスクの最も単純な形式 (32 ビット RGB 形式) では、90 度の倍数で回転することは、2 次元配列を回転するようなものです。

于 2010-05-21T18:00:52.587 に答える