图像缩放--双线性内插法

图像缩放--双线性内插法

  之前讲过一篇《图像缩放--最近邻插值》最近邻插值,这次讲另外一种方法。

  双线性内插法。

  其实思想也很简单,之前只考虑与她最近的点,现在要对周围的点加权,权重就看距离的远近。

 
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

posted on 2016-11-12 16:58  WMN7Q  阅读(801)  评论(0编辑  收藏  举报

导航