如何实现图像的arnold变换

时间:2013-09-21 21:34:12

标签: transformation

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

1 个答案:

答案 0 :(得分:1)

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

将您的图像视为三个NxN矩阵;每个颜色通道有一个NxN矩阵(假设您使用的是RGB图像)。对每个矩阵进行以下转换:

将输入矩阵的(i,j)元素映射到输出矩阵的((i + j)mod N,(i + 2j)mod N)元素。

它是垂直和水平剪切变换的串联,“缠绕”到原始图像矩形:

Arnold map

(图片来自corresponding Wikipedia article

单色通道的伪代码:

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;
}

(请注意,我们通常按(行,列)和图像(列,行)索引矩阵)

这就是方形(NxN)图像。你想要什么(Arnold的MxN图像地图,可能是M!= N)在某种程度上是不合适的,因为它不清楚它是否保留了Arnold地图的some interesting properties。但是,如果这不打扰您,您可以通过以下方式概括MxN图像的地图:

  1. 以这种方式进行环绕式垂直剪切,使第j列向上循环移动j * M / N(注意这会留下第一列和最后一列就位)* < / LI>
  2. 以这样的方式执行水平剪切,使第i行循环右移i * N / M(这使得第一行和最后一行就位)*
  3. *:剪切只是移动列/行

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