0

我需要在彩色图像上实现阿诺德转换,因为它是我项目的一部分,请建议如何为 MxN 图像实现它

4

1 回答 1

1

在经典意义上,连续的阿诺德图是在单位正方形上定义的,因此离散版本是在正方形图像上定义的:

将您的图像视为三个 NxN 矩阵;每个颜色通道都有一个 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)图像。你想要的(MxN 图像的阿诺德地图,可能 M != N)在某种意义上有点不适,因为尚不清楚它是否保留了阿诺德地图的一些有趣属性。但是,如果这不打扰您,您可以通过以下方式概括 MxN 图像的地图:

  1. 以这样的方式执行带有环绕的垂直剪切,即第 j 列向上循环移动 j*M/N(请注意,这会使第一列和最后一列保持原位)*
  2. 以这样的方式执行带有环绕的水平剪切,即第 i 行循环右移 i*N/M (这将第一行和最后一行留在原地)*

* :剪切只是移动列/行

编辑:更新了我对广义 MxN 案例的答案

于 2013-09-21T21:58:08.600 回答