图像内插

对于数字图像,f的值仅在整数位置是知道的。使用这些已知的值去估计在非整数值位置的f是内插的典型示例——用离散数据构建连续函数的定义的函数。内插具有很长的历史,很多年来,已经提出了众多的内插方法。在信号处理文献中,内插常常被理解为拥有两个设计步骤的重采样过程:
(1)把连续变换离散化,把拥有连续定义的函数f’转换为在离散域定义的函数f。
(2)在离散位置估计f’的值。
当知道f的取样是有规律的间隔时,这个解释最有用。从离散到连续的变换步骤,可以在缩放和移动过的函数的求和来明确地表达,该函数叫做内插和。
一些常用的内插核:盒状核;三角核;立方核。
盒状核的定义:
h(x)=1(-0.5<=x<=0.5);=0(其他)
三角核的定义:
h(x)=1-|x|(x<=1);=0(其他)
立方核的定义:
h(x)=1.5|x|^3-2.5|x|^2+1(|x|<=1)
=-0.5|x|^3+2.5|x|^2-4|x|+2(1<|x|<=2)
=0(其他)

还有一些其他带有不同系数的立方核。
因为只有连续函数的某些值是实际需要的,所以即使有可能,计算他们的所有值也将是浪费。因此在内插的软件中,整个信号从未明确形成过。作为替代,需要时,我们只计算连续函数的个别值。

用盒状内插和调用最近邻内插技术是的等价的。在最近邻内插中,计算出的连续函数的值就如同在最接近x的y位置处取f(y)的值。如果f(y)是针对y的整数值定义,那么最近邻内插可用简单的舍入操作来实现。

在f(x)的相邻取样之间,在存在较大差别的位置处,立方内插展现了过冲现象。因为这个现象,内插曲线f’(x)可呈现在原始取样范围之外的值。一方面,线性内插从不产生范围之外的值。在图像处理应用中,过冲有时是有益的,由于在视觉上有“清晰”效果,因此可以改进图像的外观。另一方面,过冲有时也可能是不利的,例如在仅期望产生非负值的地方,可能存在产生负值的情况。

关于二维内插:
在图像处理中,最常用的二维内插方法是把问题分成一系列的多个一维内插任务。用一系列的一维线性内插实现二维内插的处理方法被称为双线性内插。类似,双三次内插是用一系列的一维三次内插完成的。
内插方法的比较:
不同内插方法在计算速度和输出质量方面是不同的。由于说明赞成和反对不同内插方法的经典测试是重复旋转。下面的函数用imtransform2围绕中心点旋转30°,接连12次。利用仿射变换的综合特性,函数形成了关于图像中心点的几何变换。在特定的情况下,如果T1和T2是定义两个仿射变换的矩阵,那么矩阵T=T1*T2定义另一个仿射变换,它是两个变换的合成。

function g=reprotate(f,interp_method)
%REPROTATE Rotate image repeatedly
% G=REPROTATE (F,INTERP_METHOD) rotates the input image,F,
% twelve times in succession as a test of different interpolation
% methods.INTERP_METHOD can be one of the strings 'nearest',
% 'billinear', or 'bicubic'.

% From a spatial transformation that rotates the image about its
% center point.The transformation is formed as a composite of 
% three affine transformations:
% 
%From a spatial transformation that rotates the image about its 
%center point.The transformation is formed as a conposite of 
%three affine transformations:
%
%1.Transform the center of the image to the origin.
center = fliplr(1+size(f)/2);
A1=[1 0 0;0 1 0;-center,1];

%2.Rotate 30 degrees about the origin.
theta=30*pi/180;
A2=[cos(theta) -sin(theta) 0;sin(theta) cos(theta) 0;0 0 1];

%3.Transfrom from the origin back to the original center location.
A3=[1 0 0;0 1 0;center 1];
%Compose the three transforms using matrix multiplication.
A=A1*A2*A3;
tform=maketform('affine',A);

%Apply the rotation 12 times in sequence.Use imtransform2 so that 
%each successive transformation is computed using the same location
%and size as the original image.
g=f;
for k=1:12
    g=imtransform2(g,tform,interp_method);
end

针对一些内插方法比较速度和图像质量
这个例子针对最近邻、双线性和双三次内插,用reprotate比较计算速度和图像质量,函数连续旋转输入12次,由调用者指定要使用的内插方法。首先,用timeit记录每一种方法的时间:

f=imread('cameraman.tif');
timeit(@() reprotate(f,'nearest'))

timeit(@() reprotate(f,'bilinear'))

timeit(@() reprotate(f,'bicubic'))

figure(1),imshow(reprotate(f,'nearest'))
figure(2),imshow(reprotate(f,'bilinear'))
figure(3),imshow(reprotate(f,'bicubic'))

图像内插_第1张图片

图像内插_第2张图片

图像内插_第3张图片

最近邻结果显示出很大的“锯齿”边缘失真。双线性内插结果有较为平滑的边缘,但是整个外观有点模糊。双线性内插看起来最好,比起双线性内插有更平滑的边缘和更少的模糊。注意对于重复的12次旋转,只有图像中心处的像素仍属于非边界像素。保留的像素默认是黑色的。

你可能感兴趣的:(matlab,图像处理)