双线性内插python代码
时间: 2023-07-22 20:27:39 浏览: 80
双线性内插是一种图像处理中常用的技术,可以将一个低分辨率的图像放大到高分辨率。以下是一个简单的 Python 代码示例:
```python
import numpy as np
from PIL import Image
def bilinear_interpolation(img, new_size):
# 获取原始图像的尺寸
old_size = img.shape[:2]
# 计算缩放比例
scale_x = float(old_size[1]) / float(new_size[1])
scale_y = float(old_size[0]) / float(new_size[0])
# 创建一个新的图像数组
new_img = np.zeros((new_size[0], new_size[1], img.shape[2]), dtype=np.uint8)
# 遍历新图像的每个像素
for y in range(new_size[0]):
for x in range(new_size[1]):
# 计算原始图像中对应的像素位置
x_old = int(x * scale_x)
y_old = int(y * scale_y)
# 计算在原始图像中的四个最近邻像素
x1 = min(x_old, old_size[1]-2)
x2 = min(x1+1, old_size[1]-1)
y1 = min(y_old, old_size[0]-2)
y2 = min(y1+1, old_size[0]-1)
# 计算四个最近邻像素的加权平均值
dx = float(x * scale_x - x_old)
dy = float(y * scale_y - y_old)
weight1 = (1.0 - dx) * (1.0 - dy)
weight2 = dx * (1.0 - dy)
weight3 = (1.0 - dx) * dy
weight4 = dx * dy
for c in range(img.shape[2]):
new_img[y, x, c] = weight1 * img[y1, x1, c] + weight2 * img[y1, x2, c] + weight3 * img[y2, x1, c] + weight4 * img[y2, x2, c]
return new_img
# 加载图像
img = np.array(Image.open('test.jpg'))
# 缩小图像
small_img = bilinear_interpolation(img, (img.shape[0]//2, img.shape[1]//2))
# 放大图像
new_img = bilinear_interpolation(small_img, img.shape)
# 显示结果图像
Image.fromarray(new_img).show()
```
该代码使用了 NumPy 和 PIL 库,可以实现对任意大小的图像进行双线性内插。
阅读全文