最近邻插值法
其中
- size(g(x))代表图像像素矩阵列宽
- size(g(y))代表图像像素矩阵行高
- scale 代表缩放倍数
\begin{matrix}
f(x)=g(round(x),round(y)) \\
round(x)=\frac {size(g(x))}{ scale}\\
round(y)=\frac {size(g(y))}{ scale}\\
\end{matrix}
Matlab代码
%输入参数 源图像,放大倍数
function dst=imageNearestNeighbor(src,scale)
Row=size(src,1);
Col=size(src,2);%图像行数和列数
max_row=round(scale*Row);%求出变换后的坐标的最大值
max_col=round(scale*Col);
B=zeros(max_row,max_col,3);%定义变换后的图像 3表示3个通道(RGB)
for new_row=1:max_row
for new_col=1:max_col
x=round(new_row/scale);
y=round(new_col/scale);%最小临近法对图像进行插值
%处理边缘
if x==0 x=1;end
if y==0 y=1;end
if x>Row x=Row;end %溢出处理
if y>Col y=Col;end %溢出处理
B(i,j,:)=A(x,y,:); %B(i,j)像素点对应A最近邻点A(x,y)
end
end
B=uint8(B);%将矩阵转换成8位无符号整数
OpenCV代码
//待更新
双线性插值
Matlab代码
%采用双线性内插值对图像进行缩放处理
%参数n表示缩放的倍数
function []=scale2(n)
ima=imread('test.jpg'); %读取原图像
ima=double(ima); %二维矩阵转为双精度类型
swh=size(ima); %获取原图像的宽高
sh=swh(:,1); %获取原图像的高
sw=swh(:,2); %获取原图像的宽
%"加墙"
ima2=zeros(sh+2,sw+2);
ima2(1,2:sw+1)=ima(1,:); %原图像上边加墙,灰度值与边界一致
ima2(sh+2,2:sw+1)=ima(sh,:); %原图像下边加墙,灰度值与边界一致
ima2(2:sh+1,2:sw+1)=ima; %将原图像赋值给中心部分
ima2(:,1)=ima2(:,2); %原图像左边加墙,灰度值与边界一致
ima2(:,sw+2)=ima2(:,sw+1); %原图像右边加墙,灰度值与边界一致
dw=sw*n; %计算缩放后的图像的宽
dh=sh*n; %计算缩放后的图像的高
dw1=round((sw+2)*n); %计算加墙后缩放的图像的宽
dh1=round((sh+2)*n); %计算加墙后缩放的图像的高
resIma1=zeros(dh1,dw1); %创建原图像的矩阵
%从不是“墙”的位置开始计算缩放后的图像的各点灰度值
%考虑缩小图像时,输入的缩放倍数是小数,需进行取整
start=round(n+1);
endI=round(dh+n);
endJ=round(dw+n);
for i=start:endI
for j=start:endJ
tx=i/n; %缩放后的图像坐标在原图像处的位置
ty=j/n;
tdx=tx-floor(tx); %得到小数坐标
tdy=ty-floor(ty);
%确定临近四个角的坐标
%Q11点
Q11x=tx-tdx;
Q11y=ty-tdy;
%Q12点
Q12x=tx-tdx;
Q12y=Q11y+1;
%Q21点
Q21x=Q11x+1;
Q21y=Q11y;
%Q22点
Q22x=Q11x+1;
Q22y=Q11y+1;
%根据双线性内插算法,算出缩放后的图像在(i,j)点处的灰度值
resIma1(i,j)=tdx*tdy*ima2(Q11x,Q11y)+(1-tdx)*tdy*ima2(Q12x,Q12y)+tdx*(1-tdy)*ima2(Q21x,Q21y)+(1-tdy)*(1-tdx)*ima2(Q22x,Q22y);
end
end
resIma=resIma1(n+1:dh+n,n+1:dw+n); %截取除墙外的中心部分
resIma=uint8(resIma);
imshow(resIma); %显示缩放后的图像
end
OpenCV 代码
//待填坑
附上一道很经典的 双线性插值 面试题
已知Q12,Q22,Q11,Q21的坐标如图1,求P点的坐标
双三次插值
//笔者编程能力有限,待笔者好好研究研究。