双三次插值
本文将未做插值的原始图像称作源图像,源图像插值缩放K倍后的图像称作目标图像。
以下标识符的意义:

- 算法
如下图,双三次插值就是通过对周边16个点(A,B,C,…N,O,P)进行加权计算得到目标像素点的值,
(dstX/K,dstY/K)归一化后为(dstX/K,dstY/K),可推得:
srcX=floor(dstX/K);
srcY=floor(dstY/K);
v=dstX/K-srcX;
u=dstY/K-srcY;
这样,就能得到16个点的位置。
加权系数的计算方法有很多种,我采用基于BiCubic基函数的方法,该函数形式如下:

其中,x,y为周围16个源像素点到(dstX/K,dstY/K)的行列方向的距离,
那么,目标像素点的值应为:

- 实现
本程序是matlab写的一个my_bicubic函数,与matlab自有的imresize的bicubic型函数相对应。可以实现任意倍数的放大。
matlab代码:
function [output]=my_bicubic(src,K)
%
%输入:源图像src,放大倍数K
%输出:目标图像矩阵dst
[srcM,srcN,srcC]=size(src);%源图像元素点的行列数及色板数
dstM=round(K*srcM);%该处仍要确保当放大倍数K非整数时目标图像大小为整数
dstN=round(K*srcN);
%使用class将数据类型统一,目标图像初始化
dst=ones(dstM,dstN,srcC,class(src));
%逐像素点赋值
for dstX=1:dstM
for dstY=1:dstN
X=dstX/K;
Y=dstY/K;
if X<2||X>srcM-2||Y<2||Y>srcN-2 %在边界采用最近邻插值
for dstC=1:srcC
srcX=round(dstX/K);
srcY=round(dstY

本文介绍了一种图像放大算法——双三次插值,通过基于BiCubic基函数的加权计算,对图像进行放大处理。算法实现了对周边16个像素点的加权平均,以获得目标像素点的值,适用于Matlab环境。
最低0.47元/天 解锁文章
1110





