图像缩放--双线性内插法
之前讲过一篇《
图像缩放--最近邻插值》最近邻插值,这次讲另外一种方法。
双线性内插法。
其实思想也很简单,之前只考虑与她最近的点,现在要对周围的点加权,权重就看距离的远近。
zoomdouble[pic_, fw_, fh_] :=
Block[{data, dataN, w0, h0, w1, h1, col, i, j, x, x1, x2, y, y1, y2},
data = ImageData[pic];
{w0, h0, col} = Dimensions[data];
w1 = w0 * fw;
h1 = h0* fh;
(*计算新的图像的长和宽*)
(*dataN = Table[data[[Round[(w0-1)/(w1-1)*i+(w1-w0)/(w1-1)],
Round[(h0-1)/(h1-1)*j+(h1-h0)/(h1-1)]]],{i,1,w1},{j,1,h1}];*)
dataN = Table[0, {i, 1, w1}, {j, 1, h1}];
For[i = 1, i <= w1, i++,
For[j = 1, j <= h1, j++,
x = N[(w0 - 1)/(w1 - 1)*i + (w1 - w0)/(w1 - 1), 3];
x2 = Ceiling[x];
x1 = Floor[x];
(*横坐标*)
y = N[(h0 - 1)/(h1 - 1)*j + (h1 - h0)/(h1 - 1), 3];
y2 = Ceiling[y];
y1 = Floor[y];
If[x == x1 == x2 && y == y1 == y2,
dataN[[i, j]] = data[[Round[x], Round[y]]],
(*纵坐标*)
dataN[[i, j]] = (1 - (x - x1)*(y - y1))*data[[x1, y1]] +
(1 - (x2 - x)*(y - y1))*data[[x2, y1]] +
(1 - (x - x1)*(y2 - y))*data[[x1, y2]] +
(1 - (x2 - x)*(y2 - y))*data[[x2, y2]]
];
];
];
Image[dataN]
]
看代码应该就能看懂意思。
看一下效果
原图:
放大后的(表示长宽都×5):
可以看到有锯齿,因为这张图只有黑白两色,故加权之后边缘就不是纯色了,所以效果不好。
这次主要是看一下放大缩小的思想,一切都不是想得那么简单的。
当然,mma里有内置的放大缩小的函数
ImageResize[]
以上,所有。
2016/11/12