图像缩放--双线性内插法
图像缩放--双线性内插法
之前讲过一篇《图像缩放--最近邻插值》最近邻插值,这次讲另外一种方法。
双线性内插法。
其实思想也很简单,之前只考虑与她最近的点,现在要对周围的点加权,权重就看距离的远近。
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