双线性内插值(精)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档