仿射变换

仿射变换


本文件用于实现图像的仿射变换

(*设置目录*)
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]


这里写图片描述
文中只列出了部分变换,关于缩小放大等类似,不在赘述
本文只用于交流与学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值