最邻近内插、双线性内插、双三次内插的MATLAB实现
(1)最邻近内插
最简单的内插方法,把原图像中最邻近的灰度,赋给了每个新位置。但容易产生失真。
im=imread(text.jpg);%读入图片
%采用最近邻插值对图像进行缩放处理
%参数ratio表示缩放倍数
function out_im = myNearest(im, ratio)
im_size=size(im);%得到原图像的宽高
im_w=im_size(:,2); %得到原图像的宽
im_h=im_size(:,1); %得到原图像的高
nim_w=ceil(im_w*ratio); %得到原图像的宽
nim_h=ceil(im_h*ratio); %得到新图像的高
res_im=zeros(nim_h,nim_w);%新的图像矩阵
for i=1:nim_h
for j=1:nim_w
im_x=round(i/ratio);
im_y=round(j/ratio);%新图像的坐标对应到原图像的位置
if(im_x<1)
im_x=1;
end
if(im_y<1)
im_y=1;
end
if(im_x>im_h)
im_x=im_h;
end
if(im_y>im_w)
im_y=im_w;
end
%%防止坐标越界
res_im(i,j)=im(im_x,im_y);
end
end
out_im = uint8(res_im)
end
备注:
ceil() 向上取
round 四舍五入
floor()向下取整
最后要用uint8()对数组重新编码,才能imshow()
(2)双线性内插
双线性内插的本质是利用线性对所求坐标点的近似。
找到在新图片在原图片中的近似坐标点,并且利用取整,找到最近的四个坐标点。 这里可以知道四个坐标点,横纵坐标相差1,在书中的公式为
V(x,y)=ax + by + cxy + d
通过周围四个点的值,建立方程,求出 a b c d 的值,这种方法计算量比较大。利用凸组合的概念计算比较简单。
双线性插值中,在图像两个方向上的插值没有先后顺序之分。
%采用最近邻插值对图像进行缩放处理
%双线性内插
function out_im=myBilinear(im, ratio)
ratio= ratio_2;
im_size=size(im);%得到原图像的宽高
im_w=im_size(:,2); %得到原图像的宽
im_h=im_size(:,1); %得到原图像的高
nim_w=ceil(im_w*ratio); %得到新图像的宽
nim_h=ceil(im_h*ratio); %得到新图像的高
res_im=zeros(nim_h,nim_w);%新的图像矩阵
for i=1:nim_h
for j=1:nim_w
im_x=i/ratio;
im_y=j/ratio;%新图像的坐标对应到原图像的位置
im_x2=ceil(im_x);
im_x1=floor(im_x);
im_y2=ceil(im_y);
im_y1=floor(im_y);
%双线性插值的四个点
if(im_x1<1)
im_x1=1;
end
if(im_y1<1)
im_y1=1;
end
if(im_x2>im_h)
im_x2=im_h;
end
if(im_y2>im_w)
im_y2=im_w;
end
%%防止坐标越界
q1=im(im_x1,im_y1)*(im_x2-im_x)+im(im_x2,im_y1)*(1-im_x2+im_x);
q2=im(im_x1,im_y2)*(im_x2-im_x)+im(im_x2,im_y2)*(1-im_x2+im_x);%%x方向上的插值
res_im(i,j)=q1*(im_y2-im_y)+q2*(1-im_y2+im_y); %y方向上的插值
end
end
out_im=uint8(res_im);
end