Python 里实现双三次插值主要有三条路径:图像处理库(Pillow / OpenCV)、SciPy 数值插值,以及自己手写。下面按常用程度给你梳理。
1. Pillow(最简洁,适合图片缩放)
Image.resize() 的 resample 参数即可指定,可选 Resampling.NEAREST、BOX、BILINEAR、HAMMING、BICUBIC、LANCZOS;若图像模式为 “1” 或 “P”,会强制使用 NEAREST,否则默认即为 BICUBIC。
python
点击查看代码
from PIL import Image, Resampling
im = Image.open("input.jpg")
out = im.resize((im.width * 2, im.height * 2), resample=Resampling.BICUBIC)
out.save("output.jpg")
注意版本兼容问题:旧写法 resample=Image.BICUBIC 会触发 DeprecationWarning,官方提示在 Pillow 10 中移除,应改用 Resampling.BICUBIC。
2. OpenCV(适合数值型图像/批量处理)
通过 cv2.resize() 的 interpolation=cv2.INTER_CUBIC 显式指定。
python
点击查看代码
import cv2
img = cv2.imread("low_res.jpg", cv2.IMREAD_GRAYSCALE)
h, w = img.shape[:2]
hr = cv2.resize(img, (w * 4, h * 4), interpolation=cv2.INTER_CUBIC)
INTER_CUBIC 是 4×4 像素邻域的双三次插值,能有效避免锯齿;但若要缩小图像,INTER_AREA 效果通常更好,放大时才推荐 INTER_CUBIC(速度较慢但效果好)。
3. SciPy(适合科学计算 / 非图像数据)
规则网格:用 scipy.ndimage.zoom,order=3 即三次(双三次)插值:
python
点击查看代码
from scipy.ndimage import zoom
zoomed = zoom(gray_array, 5, order=3) # 放大5倍
多维规则网格插值:interpn 支持 “linear”、“nearest”、“slinear”、“cubic”、“quintic”、“pchip” 等方法,其中 points 各维度必须严格升序或降序。
散乱数据:可用 griddata,method='cubic' 做二维/三维插值。
4. 手写实现(理解原理用)
核心思想是:在目标像素点周围取 4×4(16 个)邻域像素,用分段三次核函数加权拟合估算目标值。一维核通常取 Mitchell-Netravali、Catmull-Rom 等,二维则通过张量积 W(x,y)=W(x)⋅W(y) 实现,遍历 [x−1,x+2]×[y−1,y+2] 邻域累加权重后归一化。单像素需约 16 次浮点乘加,计算量较大但结构规整、易于并行。
选型建议:单纯做图片放大/缩略用 Pillow 最省事;涉及数值矩阵、需要精确控制或与其他 OpenCV 流程衔接就用 cv2.INTER_CUBIC;数据本身是离散采样点而非图像,则走 SciPy 的 interpn / griddata。
浙公网安备 33010602011771号