双线性内插值(精)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三种插值算法
最近邻插值法的
双线性内插值:
对于图像中一个目的像素,设置坐标通过反向变换得到的浮点坐标为
(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-vf(i,j + (1-uvf(i,j+1 + u(1-vf(i+1,j + uvf(i+1,j+1
其中 f(i,j表示源图像 (i,j处的的像素值,以此类推
这就是双线性内插值法。双线性内插值法计算量大,但缩放后图像质量高, 不会出现像素值不连续的的情况。由于双线性插值具有低通滤波器的性质, 使高频分量受损,所以可能会使图像轮廓在一定程度上变得模糊
插值的计算方法有很多, 比较常用的有最近像素插值算法、双线性插值算法、双三次插值算法和分形算法的四种。其中, 最近像素插值算法是最简单的一种插值算法, 这种方法是当图片放大时, 缺少的像素通过直接使用与之最接近的原有像素的颜色生成, 也就是说照搬旁边的像素。如图 1所示,当图片扩大时,要增加 X 点处的像素,由于 X 点与 A 、 B 这两个有效像素中的 B 点最接近,因此 X 点会直接照搬B 点的像素,从而使到 X 点生成的效果与 B 点一样。虽然这种算法简单, 因此处理的速度很快, 但结果通常会产生明显可见的锯齿, 效果往往不佳。
双线性插值算法, 是指输出的图像的每个像素都是原图中四个像素运算的结果, 由于它是从原图四个像素中运算的, 因此这种算法很大程度上消除了锯齿现象, 而且效果也比较好。双三次插值算法是双线性插值算法的改进算法,它输出图像的每个像素都是原图 16个像素运算的结果, 由于效果好, 运算速度也不慢, 因而这种插值方法是一种很常见的算法, 普遍用在图像编辑软件、打印机驱动和数码相机上。
分形算法具有无限的细节和自相似的特点, 它可以使到图形无论如何放大, 看起来都与原图形很相似, 因此得到的图像效果, 跟其他算法相比更清晰、更锐利,但在计算上也相对比其他算法要复杂很多
三次卷积法能够克服以上两种算法的不足, 计算精度高, 但计算亮大, 他考虑一个浮点坐标 (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 ]
┏ f(i-1, j-1 f(i-1, j+0 f(i-1, j+1 f(i-1, j+2 ┓
[B]=┃ f(i+0, j-1 f(i+0, j+0 f(i+0, j+1 f(i+0, j+2 ┃
┃ f(i+1, j-1 f(i+1, j+0 f(i+1, j+1 f(i+1, j+2 ┃
┗ f(i+2, j-1 f(i+2, j+0 f(i+2, j+1 f(i+2, j+2 ┛
┏ S(v + 1 ┓
[C]=┃ S(v + 0 ┃
┃ S(v - 1 ┃
┗ S(v - 2 ┛
┏ 1-2*Abs(x^2+Abs(x^3 , 0<=Abs(x<1
S(x={ 4-8*Abs(x+5*Abs(x^2-Abs(x^3 , 1<=Abs(x<2
┗ 0 , Abs(x>=2
S(x是对 Sin(x*Pi/x 的逼近(Pi 是圆周率——π
最邻近插值 (近邻取样法、双线性内插值、三次卷积法等插值算法对于旋转变换、错切变换、一般线性变换和非线性变换都适用。
程序:
% BILINEAR-INTERPLOT SOUCE-IMAGE TO GET A DESTINATE-IMAGE % MAXIMUM SCALOR == 5.0, MINIMUM SCALOR == 0.2
% read source image into memory, and get the primitive rows and cols
I=imread('111.bmp';
[nrows,ncols]=size(I;
% acquire scale-factor, the range is 0.2-5.0
K = str2double(inputdlg('please input scale factor (must between 0.2 - 5.0', 'INPUT scale factor', 1, {'0.5'};
% Validating
if (K < 0.2 | (K > 5.0
errordlg('scale factor beyond permitted range(0.2 - 5.0', 'ERROR'; error('please input scale factor (must between 0.2 - 5.0';
end
% display source image
imshow(I;
% output image width and height are both scaled by factor K width = K * nrows;
height = K * ncols;
J = uint8(zeros(width,height;
% width scale and height scale
widthScale = nrows/width;
heightScale = ncols/height;
% bilinear interplot
for x = 5:width - 5
for y = 5:height - 5
xx = x * widthScale;
yy = y * heightScale;
if (xx/double(uint16(xx == 1.0 & (xx/double(uint16(xx == 1.0 J(x,y = I(int16(xx,int16(yy;
else % a or b is not integer
a = double(uint16(xx; % (a,
b is the base-dot
b = double(uint16(yy;
x11 = double(I(a,b; % x11 <- I(a,b
x12 = double(I(a,b+1; % x12 <- I(a,b+1
x21 = double(I(a+1,b; % x21 <- I(a+1,b
x22 = double(I(a+1,b+1; % x22 <- I(a+1,b+1