图像重采样的依据是辛克(SINC)函数。但由于辛克函数是定义在无穷域上的,又包括三角函数的计算,实际使用不方便,因此人们采用了一些近似函数代替它,据此产生了三种常用的重采样方法:最邻近像元采样法、双线性内插法和双三次卷积重采样法。
①最邻近像元采样法
该法的实质是取距离被采样点最近的已知像素元素的灰度作为采样灰度。
最邻近像元采样法最简单,辐射保真度较好,但它将造成像点在一个像素范围内的位移,其几何精度较其他两种方法差。
最邻近像元采样法函数如下:
% 最邻近插值function [Img_0] = NearestPixelSampling(Img,Scale)[r,c,l] = size(Img);r0 = floor(r*Scale);c0 = floor(c*Scale);Img_0 = uint8(zeros(r0,c0,l));for i = 1:1:r0 for j = 1:1:c0 ii = round(i/Scale); jj = round(j/Scale); if ii < 1 ii = 1; end if ii > r ii = r; end if jj < 1 jj = 1; end if jj > c jj = c; end Img_0(i,j,:) = Img(ii,jj,:); endend
同一张原始影像采用不同的缩放比例,重采样结果如下图所示:
②双线性内插法
该法的重采样函数是对辛克函数的更粗略近似,其线性函数表达形式为:
该算法较为简单,具有一定的采样精度,是实践中常用的方法,但图像略变模糊。
% 双线性插值function [Img_0] = BilinearPixelSampling(Img,Scale)% 获取原始图像的尺寸[r,c,l] = size(Img);% 计算新图像的尺寸r0 = floor(r*Scale);c0 = floor(c*Scale);% 创建一张新的空白图像Img_0 = uint8(zeros(r0,c0,l));for i = 2:1:r0 for j = 1:1:c0 ii = (i-0.5)/Scale; jj = (j-0.5)/Scale; i0 = floor(ii - 0.5)+1 ;i1 = floor(ii + 0.5)+1 ; j0 = floor(jj - 0.5)+1 ;j1 = floor(jj + 0.5)+1 ; if i0 >= 1 && i0 <= r && i1 >= 1 && i1 <= r && j0 >= 1 && j0 <= c && j1 >= 1 && j1 <= c Wx(1,1) = mod(ii,1);Wx(1,2) = 1 - mod(ii,1); I(1,1,:) = double(Img(i0,j0,:)); I(1,2,:) = double(Img(i0,j1,:)); I(2,1,:) = double(Img(i1,j0,:)); I(2,2,:) = double(Img(i1,j1,:)); Wy(1,1) = mod(jj,1);Wy(2,1) = 1 - mod(jj,1); Img_0(i,j,1) = Wx*I(:,:,1)*Wy; Img_0(i,j,2) = Wx*I(:,:,2)*Wy; Img_0(i,j,3) = Wx*I(:,:,3)*Wy; end endend
同一张原始影像采用不同的缩放比例,重采样结果如下图所示:
③双三次卷积重采样法
该方法用一个三次重采样函数来近似表示辛克函数:
双三次卷积的内插精度较高,但计算量大。
% 双三次卷积插值function [Img_0] = CubicDoubleConvolutionPixelSampling(Img,Scale)% 获取原始图像的尺寸[r,c,l] = size(Img);% 计算新图像的尺寸r0 = floor(r*Scale);c0 = floor(c*Scale);% 创建一张新的空白图像Img_0 = uint8(zeros(r0,c0,l));for i = 1:1:r0 for j = 1:1:c0 ii = (i-0.5)/Scale; jj = (j-0.5)/Scale; iTab = [floor(ii - 0.5),floor(ii - 0.5)+1,floor(ii + 0.5)+1,floor(ii + 0.5)+2]; jTab = [floor(jj - 0.5),floor(jj - 0.5)+1,floor(jj + 0.5)+1,floor(jj + 0.5)+2]; a1 = min(iTab); a2 = max(iTab); a3 = min(jTab); a4 = max(jTab); if min(iTab) > 0 && min(jTab) > 0 && max(iTab) <= r && max(jTab) <= c dx = mod(ii,1);dy = mod(jj,1); Wx = [-dx + 2*dx*dx - dx*dx*dx,1 - 2*dx*dx + dx*dx*dx,dx + dx*dx - dx*dx*dx,-dx*dx + dx*dx*dx]; Wy = [-dy + 2*dy*dy - dy*dy*dy;1 - 2*dy*dy + dy*dy*dy;dy + dy*dy - dy*dy*dy;-dy*dy + dy*dy*dy]; for k = 1:1:4 for l = 1:1:4 I(k,l,:) = double(Img(iTab(k),jTab(l),:)); end end Img_0(i,j,1) = Wx*I(:,:,1)*Wy; Img_0(i,j,2) = Wx*I(:,:,2)*Wy; Img_0(i,j,3) = Wx*I(:,:,3)*Wy; end endend
同一张原始影像采用不同的缩放比例,重采样结果如下图所示:
采用不同方法缩小图像:
采用不同方法放大图像:
图像放大后的局部显示效果:
效果评价:上图可以看出,双线性插值采样结果图像边界模糊;另外两种方法结果边界清晰!
版权声明:本文为weixin_36475451原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。