图像放大算法总结及MATLAB源程序_matlab如何放大图像
图像放大算法总结及MATLAB源程序由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“matlab如何放大图像”。
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==0 x = 1;end
if y==0 y = 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(u2)];[C]=[ S(v + 1)S(v + 0)S(v2)];而[B]是周围16个邻点组成的4*4的矩阵;S(x)是对 Sin(x*π)/x 的逼近。
在MATLAB中,可用其自带的函数imresize()来实现双三次插值算法。MATLAB源代码为:
A=imread('F:lena.jpg');%读取原图像
D=imresize(A,8,'bicubic');%双三次插值放大8倍 figure;
T
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=0 A=1-2*w^2+w^3;elseif w>=1&&w
A=0;end
与MATLAB自带函数相比,以上手工编写的MATLAB代码只能完成黑白图像输出,且运行时间远比MATLAB自带函数的运行时间长。手工编写双三次插值算法MATLAB代码的运行结果如图6所示:
图6
2,其他算法简介:
传统的图像放大方法有重复放大线性放大和高次多项式插值放大。重复放大最简单,但会产生明显的方块效应线性放大消除了方块效应,但会造成图像的模糊 高次多项式插值放大效果较好,但运算复杂。由于传统方法的固有缺陷,诞生了新一代图像放大方法,主要有小波放大、邻域交换内插和分形放大等。
下面简单介绍一下增强系数小波放大算法: 算法示意图如图7所示:
图7 通过二维离散小波变换,经分析高通滤波器和分析低通滤波器,可将一幅分辨率为p的二维图像分解为分辨率为p/2的离散逼近信号A1和水平、垂直、对角三个细节信号H1、V1、D1。这四个分量都只有原图像大小的1/4。之后又可以对A1进行同样的分解如图7所示。这个过程可以一直重复下去。通过二维离散小波反变换,用相应的综合高通滤波器和综合低通滤波器可将各分量重构为原图像。
对于一个图像,低频成分包含了基本特征,即原图像的近似,高频成分反应其细节。基于此,我们将原图像作为低频成分A1,其他3个细节部分置0,进行小波重构,便可得到放大4倍的图像。但是由于能量守恒,放大后的图像能量分散会显得较暗。可以将原图像灰度值矩阵乘2,再进行上述变换,便可解决这一问题。小波分解重构是一种全局运算,不会造成重复放大中的方块效应,同时较好地保持图像边缘的清晰。