双三次插值法
1. 双三次插值(BiCubic)法介绍
双三次插值又叫双立方插值,用于在图像中“插值”(Interpolating)或增加“像素”(Pixel)数量/密度的一种方法。在这种方法中,函数f在点 (x,y) 的值可以通过矩形网格中最近的十六个采样点的加权平均得到,在这里需要使用两个多项式插值三次函数,每个方向使用一个。Adobe Photoshop CS 为用户提供了两种不同的双三次插值方法:双三次插值平滑化和双三次插值锐化。通过双三次插值可以得到一个连续的插值函数,它的一阶偏导数连续,并且交叉导数处处连续。它能比占主导地位的双线性滤波算法保留更好的细节质量。
2. 公式介绍
常用的双三次插值函数有Bicubic、Mitchell、Lanczos等。这里介绍用的比较多的Bicubic函数:
W参数X为所求像素点到附近点的距离(包括x方向与y方向)。 a值一般取1或-0.5。该函数的波形如下图所示:
对于插值的像素点(x,y)(x,y可为浮点数),选择附近的4x4个点进行加权求和。按如下公式进行计算:
3. 优缺点
优点在于具有一阶、二阶导数收敛的性质,插值得到的结果更加平滑,缺点是运算量较大。
4. 代码测试
此处像最近邻与双线性插值自己实现。这里借助opencv库函数直接看效果。
import cv2 as cv srcimg=cv.imread('songshu.jpg') #print(srcimg.shape)#打印出来是(300,300,3) #srcimg.shape[0]、[1]、[2]分别表示高度,宽度,通道数
disimg=cv.resize(srcimg,(int(1.5*srcimg.shape[1]),int(1.5*srcimg.shape[0])),interpolation=cv.INTER_CUBIC) cv.imshow('srcimg',srcimg) cv.imshow('disimg',disimg) #使用无损的方式保存成PNG格式 cv.imwrite('songshudist.png', disimg, [cv.IMWRITE_PNG_COMPRESSION, 0]) cv.waitKey(0)
5. 效果
下图分别是原图与放大1.5倍后的图像,效果不错。
不足之处望指正,谢谢!