图像放大算法总结及MATLAB源程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1,插值算法(3种):

(1)最邻近插值(近邻取样法):

最邻近插值的的思想很简单,就是把这个非整数坐标作一个四舍五入,取最近的整数点坐标处的点的颜色。可见,最邻近插值简单且直观,速度也最快,但得到的图像质量不高。

最邻近插值法的MATLAB源代码为:

A=imread('F:\lena.jpg');%读取图像信息

imshow(A);%显示原图

title('原图128*128');

Row=size(A,1);Col=size(A,2);%图像行数和列数

nn=8;%放大倍数

m=round(nn*Row);%求出变换后的坐标的最大值

n=round(nn*Col);

B=zeros(m,n,3);%定义变换后的图像

for i=1:m

for j=1:n

x=round(i/nn);y=round(j/nn);%最小临近法对图像进行插值

if x==0x=1;end

if y==0y=1;end

if x>Row x=Row;end

if y>Col y=Col;end

B(i,j,:)=A(x,y,:);

end

end

B=uint8(B);%将矩阵转换成8位无符号整数

figure;

imshow(B);

title('最邻近插值法放大8倍1024*1024');

运行程序后,原图如图1所示:

图1

用最邻近插值法放大4倍后的图如图2所示:

图2

(2)双线性内插值法:

在双线性内插值法中,对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(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)处的的像素值,以此类推。

这就是双线性内插值法。双线性内插值法计算量大,但缩放后图像质量高,不会出现像素值不连续的的情况。由于双线性插值具有低通滤波器的性质,使高频分量受损,所以可能会使图像轮廓在一定程度上变得模糊。

在MATLAB中,可用其自带的函数imresize()来实现双线性内插值算法。

双线性内插值算法的MATLAB源代码为:

A=imread('F:\lena.jpg');

imshow(A);

title('原图128*128');

C=imresize(A,8,'bilinear');%双线性插值figure;

imshow(C);

title('双线性内插值法放大8倍1024*1024');程序运行后,原图如图3所示:

图3

双线性内插值法放大8倍后的图如图4所示:

图4

(3)双三次插值法:

双三次插值法能够在很大程度上克服以上两种算法的不足,该算法计算精度高,但计算量大,它考虑一个浮点坐标(i+u,j+v)周围的16个邻点。

目的像素值f(i+u,j+v)可由如下插值公式得到:f(i+u,j+v)=[A]*[B]*[C]

其中[A]=[S(u+1)S(u+0)S(u-1)S(u-2)];

[C]=[S(v+1)S(v+0)S(v-1)S(v-2)]T;

而[B]是周围16个邻点组成的4*4的矩阵;S(x)是对Sin(x*π)/x的逼近。

在MATLAB中,可用其自带的函数imresize()来实现双三次插值算法。MATLAB源代码为:

A=imread('F:\lena.jpg');%读取原图像

D=imresize(A,8,'bicubic');%双三次插值放大8倍

figure;

imshow(D);

title('三次卷积法放大8倍1024*1024');

MATLAB自带双三次插值法运行结果如图5所示:

图5

也可以自己编写双三次插值算法MATLAB代码如下:clc,clear;

ff=imread('F:\lena.jpg');%读取图像到ff

k=8;%设置放大倍数

[m,n,color]=size(ff);

f=zeros(m,n);%将彩色图像ff转换为黑白图像f for i=1:m

for j=1:n

f(i,j)=ff(i,j);

end

end

a=f(1,:);c=f(m,:);%将待插值图像矩阵前后各扩展两行两列,共扩展四行四列

b=[f(1,1),f(1,1),f(:,1)',f(m,1),f(m,1)];d=[f(1,n),f(1,n),f(:,n)',f(m,n),f(m,n)];

a1=[a;a;f;c;c];

a1';

b1=[b;b;a1';d;d];

f=b1';f1=double(f);

for i=1:k*m%利用双三次插值公式对新图象所有像素赋值

u=rem(i,k)/k;i1=floor(i/k)+2;

A=[sw(1+u)sw(u)sw(1-u)sw(2-u)];

for j=1:k*n

v=rem(j,k)/k;j1=floor(j/k)+2;

C=[sw(1+v);sw(v);sw(1-v);sw(2-v)];

B=[f1(i1-1,j1-1)f1(i1-1,j1)f1(i1-1,j1+1)f1(i1-1,j1+2)

f1(i1,j1-1)f1(i1,j1)f1(i1,j1+1)f1(i1,j1+2)

f1(i1,j1-1)f1(i1+1,j1)f1(i1+1,j1+1)f1(i1+1,j1+2)

f1(i1+2,j1-1)f1(i1+2,j1)f1(i1+2,j1+1)f1(i1+2,j1+2)];

g1(i,j)=(A*B*C);

end

end

g=uint8(g1);%将矩阵转换成8位无符号整数

imshow(g);

title('自编双三次插值法放大8倍图像');

其中子函数sw代码如下:

function A=sw(w1)

w=abs(w1);

if w<1&&w>=0

A=1-2*w^2+w^3;

elseif w>=1&&w<2

A=4-8*w+5*w^2-w^3;

else

A=0;

end

与MATLAB自带函数相比,以上手工编写的MATLAB代码只能完成黑白图像输出,且运行时间远比MATLAB自带函数的运行时间长。

手工编写双三次插值算法MATLAB代码的运行结果如图6所示:

相关文档
最新文档