图像放缩 (matlab实现,不用自带的函数)

来源:互联网 发布:淘宝订单总是自动关闭 编辑:程序博客网 时间:2024/06/10 19:06

 

双线性插值图像放大程序
 
         1.使用说明
此程序写得很简单,既可以用于放大,也可以用于缩小。
程序使用的图像文件名为moon.tif,你也可以换成其它的图像文件。但是要注意,程序不能处理彩色图像或灰度图像,只能处理二值图象,切记。此程序使用了的MATLAB的图像处理工具箱进行开发,所用的MATLAB版本为7.0。
2.原理解析:
首先,介绍一个双线性内插值。
其基础基于的基本思想就是双线性方程,f(x,y)=ax+by+cxy+d,来定义一个双曲抛物面与4个已知点的拟合,a到d四个值由已知的4个顶点的f(x,y)值来确定。
具体说就是,对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(i+u,j+v),其中i、j均为非负整数,u、v为[0,1)区间的浮点数,则这个像素得值 f(i+u,j+v) 可由原图像中坐标为 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即:
    f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)
其中f(i,j)表示源图像(i,j)处的的像素值,以此类推
         这种算法对于缩放比例较小的情况是完全可以接受的,令人信服的。一般的,缩小0.5倍以上或放大3.0倍以下,对任何图像都是可以接受的。 这就是双线性内插值法。双线性内插值法计算量大,但缩放后图像质量高,不会出现像素值不连续的的情况。但由于双线性插值具有低通滤波器的性质,使高频分量受损,所以可能会使图像轮廓在一定程度上变得模糊。
  
3.实验步骤:
 a.在matlab 中添加一个.m函数,命名为imagezoom.m.代码如下:
    function g=imagezoom(f,a)    %f 为一个图像,a放大倍数
    [m,n]=size(f);                             %读取原图像的大小
    M=fix(m*a);                                 %确定放大后的大小
    N=fix(n*a);
   g=double(zeros(M,N));              %开辟一块内存,大小为M*N
   for x=5:M-5                                   %利用双线性内插值法循环填充每个新像素,保存在g(x,y)中
      for y=5:N-5                                %因为在matlab中矩阵从(1,1)开如始的,为了避免读f(1,0)所以从5开始
         u=x/a;
         v=y/a;
         w=fix(u);
         z=fix(v);
         dw=u-w;
         dz=v-z;
         g(x,y)=[f(w+1,z)-f(w,z)]*dw+[f(w,z+1)-f(w,z)]*dz+[f(w+1,z+1)+f(w,z)-f(w,z+1)-f(w+1,z)]*x*y+ f(w,z);
      end
   end
   输入代码后,保存.
b.测试此函数。
在命令窗口中仿效输入如下命令:
 
I=imread(‘moon.tif’);
B=im2bw(I);          %转化为二值图像
C=imagezoom(B,0.5);                                %缩小为原来的0.5倍
imshow(B),title(‘原图’);
figure
imshow(C),title(‘修改图’);
如果输入无误的话就会出现两副大小相差两倍的“月亮”了。
原创粉丝点击