一
双线性插值图像放大程序
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倍以下,对任何图像都是可以接受的。 这就是双线性内插值法。双线性内插值法计算量大,但缩放后图像质量高,不会出现像素值不连续的的情况。但由于双线性插值具有低通滤波器的性质,使高频分量受损,所以可能会使图像轮廓在一定程度上变得模糊。
这种算法对于缩放比例较小的情况是完全可以接受的,令人信服的。一般的,缩小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(‘修改图’);
如果输入无误的话就会出现两副大小相差两倍的“月亮”了。