实验5 双线性插值
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五图像的空间变换
一、实验目的
1、学习图像空间变换,并通过实验体会空间变换的效果,对其作出分析。
2、掌握利用最邻近插值和双线性插值算法(灰度插值)实现图像的缩放。
3、掌握MATLAB编程环境中基本的图像处理函数。
二、实验要求
1.读入图像,对其利用最邻近插值和双线性插值法进行缩放变换,要求先使用IPT函数进行变换,然后自己编写函数实现;
2.对比上述得到的结果。
三、实验原理
图像的空间变换,也称几何变换或几何运算,包括图像的平移、旋转、镜像变换、转置、缩放等。几何运算可改变图像中各物体之间的空间关系,这种运算可以看成是将各物体在图像内移动。
空间变换可如下表示:设(u,v)为源图像上的点,(x,y)为目标图像上的点,则空间变换就是将源图像上(u,v)处的像素值与目标图像上(x,y)处的像素值对应起来,并具有以下关系:
x=X(u,v),y=Y(u,v) (即由(u,v)计算对应(x,y))(1.1)
或u=U(x,y),v=V(x,y) (即由(x,y)计算对应(u,v))(1.2) 其中X(u,v)、Y(u,v)、U(x,y)、V(x,y)均为变换。由(1.1)对应的变换称作向前映射法也叫像素移交法,而由(1.2)对应的变换称作向后映射法也叫像素填充法,向后映射法是向前映射法的逆。
最简单的插值算法是最邻近插值,也称为零阶插值。最邻近插值算法简单,在许多情况
下都能得到令人满意的结果,但是当图像中包含像素之间灰度级有变化的细微结构时,最邻近算法会在图像中产生人为加工的痕迹。双线性插值算法计算量比零阶插值大,但缩放后图像质量高,不会出现像素值不连续的的情况,这样就可以获得一个令人满意的结果。最邻近点插值取插值点的4个邻点中距离最近的邻点灰度值作为该点的灰度值。设插值点(i,j)到周边4个邻点fk(i,j)(k =1,2,3,4)的距离为dk(k =1,2,3,4),则:g(i,j)=fk(i,j),dl =min{d1,d2,d3,d4},l=1,2,3,4 。
双线性插值是利用了需要处理的原始图像像素点周围的四个像素点的相关性,通过双线插值算法计算得出的。对于一个目的坐标,通过后映射法得到其在原始图像的对应的浮点坐标(i+u,j+v),其中i,j均为非负整数,u,v为[0,l]区间的浮点数,则这个像素的值f(i+u,j+v)可由原图像中坐标为(i,j)、(i+l,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即:f(i+u,j+v)=(1-u)×(1-v)×f(i,j)+(1-u)×v×f(i,j+1)+u×(1-v)×f(i+l,j)+u×v×f(i+l,j+1),其中f(i,j)表示源图像(i,j)处的的像素值,以此类推,这就是双线性内插值法。
如下图所示,已知(0,0)、(0,1)、(1,0)、(1,1)四点的的灰度,可以由相邻像素的灰度值f(0,0)和f(1,0)在X方向上线性插值求出(x,0)的灰度f(x,0),由另外两个相邻像素f(0,1)和f(1,1)在X方向上线性插值可求出(x,1)的灰度f(x,1),最后由f(x,0),f(x,1)在Y 方向上进行线性插值就可以得到(x,y)的灰度f(x,y)。
四、实验代码
注:利用最邻近插值实现图像的放大代码在实验四报告中附,本实验中只有利用双线性插值进行放大的程序
clear all
clc
N=input('输入放大倍数:');%输入放大倍数
I=imread('lena1.bmp');%读入256*256的lena图像
G=rgb2gray(I); imshow(G);%转为灰度图像并显示
[m,n]=size(G);%计算图像大小
m_new=m*N; n_new=n*N;%计算放大后的图形大小
J=[];%用于存放放大后图像中各像素点的灰度值
for i=1:m
for j=1:n
J(N*i,N*j)=G(i,j);%将原图像各像素点的灰度值赋值给放大后图像中的对应点end
end
%-----进行双线性插值----
%-----i/N,j/N分别为放大后的像素点对应在原图像中的横纵坐标
for i=1:m_new
for j=1:n_new
if(J(i,j)==0)
a=floor(i/N);b=floor(j/N); %计算i/N,j/N的整数部分
u=(i/N)-a;v=(j/N)-b; %计算i/N,j/N的小数部分
if((a>0)&&(a+1<=m)&&(b>0)&&(b+1<=n))
%进行双线性插值
J(i,j)=(1-u)*(1-v)*G(a,b)+(1-u)*v*G(a,b+1)+u*(1-v)*G(a+1,b)+u*v*G(a,b);
end
end
end
end
figure imshow(uint8(J));显示放大后的图像
五、实验结果及分析
注:放大倍数为2
1、本实验中放大后的效果:
2、利用上次实验中最邻近插值进行放大实现的效果:
3、利用Matlab中imresize()函数分别进行最邻近插值和双线性插值后的结果如下(左侧图
像为最邻近插值,右侧图像为双线性插值):
实验结果分析:有上述对比可知,利用双线性插值对图像进行放大后的效果优于利用最邻近插值放大的效果,主要是因为最邻近插值法事实上只利用了当前像素点周围四个像素点中的一个像素点的灰度值,而双线性插值法则是对当前像素点周围四个像素点的灰度值进行了加权平均,最终得到的灰度值更加连续自然,因而效果也更优。