灰度插值实验

灰度插值实验

才疏学浅,资历欠佳,难免有误,望有心人批评指正。

本文旨在展示绘图插值

最近邻插值

Clear[T, img, mat, row, col, mat2, x, y, x2, y2, v, v2, img2];
\[Theta] = 30 Degree;
sin = Sin[\[Theta]] // N; cos = Cos[\[Theta]] // N;
T = {{cos, -sin, 0}, {sin, cos, 0}, {0, 0, 1}};
(*T={{2,0,0},{0,1,0},{0,0,1}};*)
iT = Inverse[T];
img = Import["lena_gray_256.tif", "TIFF"];
mat = ImageData[img, "Byte"];
{row, col} = Dimensions[mat];
mat2 = Table[0, {row}, {col}];
For[y = 1, y <= row, y++, For[x = 1, x <= col, x++, v = {x, y, 1};
    v2 = iT.v;(*点积*){x2, y2, t} = Round[v2];(*最近邻*)
    If[1 <= x2 <= col && 1 <= y2 <= row, mat2[[y, x]] = mat[[y2, x2]]
     ]
    ];
  ];
img2 = Image[mat2, "Byte"];
GraphicsRow[{img, img2}, ImageSize -> Medium]


这里写图片描述

双线性插值

affine[img_, T_] :=
  Module[{iT, mat, row, col, mat2, x, y, v2, p, x2, y2, p0, x0, y0, u,
     v, f, f1, f2, img2}, iT = Inverse[T];
   mat = ImageData[img];
   {row, col} = Dimensions[mat];
   mat2 = Table[0, {i, 1, row}, {j, 1, col}];
   f[i_, j_] := If[1 <= i <= row && 1 <= j <= col, mat[[i, j]], 0];
   (*此函数避免了对数组mat的越界访问*)

   For[y = 1, y <= row, y++,
    For[x = 1, x <= col, x++, v2 = iT.{x, y, 1};(*点积*)p = v2[[1 ;; 2]];
      {x2, y2} = p;
      If[1 <= x2 <= col && 1 <= y2 <= row,
       p0 = Floor[p];(*左上角点*){x0, y0} = p0;
       {u, v} = p - p0;
       f1 = (1 - u)*f[y0, x0] + u*f[y0, x0 + 1];
       f2 = (1 - u)*f[y0 + 1, x0] + u*f[y0 + 1, x0 + 1];
       mat2[[y, x]] = (1 - v) f1 + v f2;
       ];
      ];
    ];
   img2 = Image[mat2];
   Return[img2];
   ];


双立方插值

Clear[T, iT, img, mat, row, col, mat2, f, i, j, a, s, x, fA, u, x, y,
  v2, p, x2, y2, p0, x0, y0, u, v, A, B, C1, img2];
T = {{2, 0, 0}, {0, 1, 0}, {0, 0, 1}};
iT = Inverse[T];
img = Import["lena_gray_256.tif", "TIFF"];
mat = ImageData[img];
{row, col} = Dimensions[mat];
mat2 = Table[0, {i, 1, row}, {j, 1, col}];
f[i_, j_] := If[1 <= i <= row && 1 <= j <= col, mat[[i, j]], 0];
(*此函数避免了对数组mat的越界访问*)
a = -0.5;
s[x_] := Piecewise[{{(a + 2) x^3 - (a + 3) x^2 + 1,
     x <= 1}, {a x^3 - 5 a x^2 + 8 a x - 4 a, 1 < x < 2}}, 0];
fA[u_] := {s[1 + u], s[u], s[1 - u], s[2 - u]};
For[y = 1, y <= row, y++,
  For[x = 1, x <= col, x++, v2 = iT.{x, y, 1};(*点积*)p = v2[[1 ;; 2]];
    {x2, y2} = p;
    If[1 <= x2 <= col && 1 <= y2 <= row,
     p0 = Floor[p];(*左上角点*){x0, y0} = p0;
     {u, v} = p - p0;
     A = fA[u];
     C1 = fA[v];
     B = Table[f[i, j], {i, y0 - 1, y0 + 2}, {j, x0 - 1, x0 + 2}];
     mat2[[y, x]] = A.B.C1;
     ];
    ];
  ];
img2 = Image[mat2];
GraphicsRow[{img, img2}, ImageSize -> Medium]


这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值