仿射变换
本文件用于实现图像的仿射变换
(*设置目录*)
SetDirectory["/home/autuanliu/learning/mathematica/images/liner/img"];
Clear[img, row, col, M];
img = Import["lena_gray_256.tif", "TIFF"];
M = ImageData[img];
{row, col} = Dimensions[M];
(*函数 getmatrix[] 用于获取输入的变换矩阵*)
getmatrix[flag_Integer] := Module[{matrix3},
If[
1 <= flag <= 6, matrix3 = Input["请输入对应功能的变换矩阵
(3*3),such as {{1,2,3},{4,5,6},{7,8,9}}
或者使用参数传递:"],
(*else*)
Print[flag "is not a valid value,please input again" <>
"无效的输入,请重输"];
];
Return[matrix3];
Print["你输入的变换矩阵为:"];
matrix3 // MatrixForm
];
(*函数 transfer[] 主要用于对原图像进行变换*)
transfer[matrix1_] :=
Module[{r, c, matrix2, i, j, X, x, y, z, T, choice}, {r, c} =
Dimensions[matrix1];
choice = Input["请输入对应功能的编号
{1.旋转 2. 缩放 3.错切 4.平移 5.水平镜像 6.垂直镜像}:"];
T = getmatrix[choice];
matrix2 = Table[0, {i, 1, r}, {j, 1, c}];
For[i = 1, i <= r, i++,
For[j = 1, j <= c, j++,
X = {j, i, 1};
{x, y, z} = Round[T.X];
If[1 <= x <= c && 1 <= y <= r, matrix2[[y, x]] = matrix1[[i, j]
];
];
];
];
Grid[{{img, Image[matrix2]}}] (*生成图像矩阵*)
];
定义变换矩阵也可以不使用这些已经定义好的矩阵,也可以自己输
(*旋转*)
m1 = {{Cos[30 Degree], -Sin[30 Degree], 0}, {Sin[30 Degree],
Cos[30 Degree], 0}, {0, 0, 1}};
(*缩放*)
m2 = {{1, 0, 0}, {0, 0.8, 0}, {0, 0, 1}};(*缩*)
m3 = {{1, 0, 0}, {0, 1.2, 0}, {0, 0, 1}};(*放*)
(*错切*)
m4 = {{1, 0.2, 0}, {1.3, 1, 0}, {0, 0, 1}};
(*平移*)
m5 = {{1, 0, 50}, {0, 1, 15}, {0, 0, 1}};
(*镜像*)
m6 = {{-1, 0, row}, {0, 1, 0}, {0, 0, 1}};(*水平镜像*)
m7 = {{1, 0, 0}, {0, -1, col}, {0, 0, 1}};(*垂直镜像*)
效果演示
(*旋转*)
transfer[M]
(*错切*)
transfer[M]
文中只列出了部分变换,关于缩小放大等类似,不在赘述
本文只用于交流与学习