我需要在彩色图像上实现阿诺德转换,因为它是我项目的一部分,请建议如何为 MxN 图像实现它
问问题
2155 次
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 图像的地图:
- 以这样的方式执行带有环绕的垂直剪切,即第 j 列向上循环移动 j*M/N(请注意,这会使第一列和最后一列保持原位)*
- 以这样的方式执行带有环绕的水平剪切,即第 i 行循环右移 i*N/M (这将第一行和最后一行留在原地)*
* :剪切只是移动列/行
编辑:更新了我对广义 MxN 案例的答案
于 2013-09-21T21:58:08.600 回答