灰度插值实验
才疏学浅,资历欠佳,难免有误,望有心人批评指正。
本文旨在展示绘图插值
最近邻插值
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]