0

プロジェクトの一部であるため、カラー画像に arnold 変換を実装する必要があります。MxN 画像に実装する方法を提案してください。

4

1 に答える 1

1

古典的な意味では、連続アーノルド マップは単位正方形で定義されるため、離散バージョンは正方形イメージで定義されます。

画像を 3 つの NxN 行列と考えてください。カラー チャネルごとに 1 つの NxN マトリックス (RGB 画像を扱っていると仮定)。各行列で次の変換を行います。

入力行列の (i,j) 要素を出力行列の ((i + j) mod N, (i + 2j) mod N) 要素にマッピングします。

これは、元の画像の四角形に「ラップアラウンド」された、垂直方向と水平方向のせん断変換の連結です。

アーノルドのマップ

(画像はウィキペディアの該当記事より)

単一のカラー チャネルの擬似コード:

Image arnold(inputImage){
    outputImage = Image(inputImage.width, inputImage.height);

    for(x = 0; x < inputImage.width; x++){
        for(y = 0; y < inputImage.height; y++){
            pixel = inputImage[x][y];
            outputImage[(2*x + y) mod inputImage.width][(x + y) mod inputImage.height] = pixel;
        }
    }
    return outputImage;
}

(通常、行列は (row,column) でインデックス付けされ、画像は (column,row) でインデックス付けされることに注意してください)

これは正方形 (NxN) の画像の場合です。あなたが望むもの (おそらく M != N である MxN 画像の Arnold のマップ) は、Arnold のマップのいくつかの興味深い特性を保持しているかどうかが明確でないという意味で、やや適切ではありません。ただし、それが気にならない場合は、次の方法で MxN 画像のマップを一般化できます。

  1. j 番目の列が j*M/N だけ上に循環的にシフトされるように、ラップアラウンドを使用して垂直せん断を実行します (これにより、最初の列と最後の列が所定の位置に残ることに注意してください) *
  2. i 番目の行が i*N/M だけ循環的に右にシフトされるような方法で、ラップアラウンドを使用して水平せん断を実行します (これにより、最初と最後の行が所定の位置に残ります) *

* : せん断は単に列/行をシフトするだけです

編集:一般化されたMxNケースの回答を更新しました

于 2013-09-21T21:58:08.600 に答える