我需要在彩色图像上实现arnold转换,因为它是我项目的一部分,请建议如何为MxN图像实现它
答案 0 :(得分:1)
在经典意义上,连续的Arnold图在单位正方形上定义,因此离散版在方形图像上定义:
将您的图像视为三个NxN矩阵;每个颜色通道有一个NxN矩阵(假设您使用的是RGB图像)。对每个矩阵进行以下转换:
将输入矩阵的(i,j)元素映射到输出矩阵的((i + j)mod N,(i + 2j)mod N)元素。
它是垂直和水平剪切变换的串联,“缠绕”到原始图像矩形:
(图片来自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图像的地图:
*:剪切只是移动列/行
编辑:更新了我对广义MxN案例的回答