Python手动实现双线性的图像插值
时间: 2023-11-29 09:29:25 浏览: 71
双线性插值是一种图像缩放的方法,通过对原始图像中像素的加权平均来生成新的像素值,从而得到更高分辨率的图像。下面是 Python 的双线性插值实现:
```python
import numpy as np
from PIL import Image
def bilinear_interpolation(img, H, W):
"""
双线性插值实现图像缩放
:param img: 原始图像
:param H: 缩放后的高度
:param W: 缩放后的宽度
:return: 缩放后的图像
"""
ori_H, ori_W, channels = img.shape
x_ratio = float(ori_W - 1) / (W - 1)
y_ratio = float(ori_H - 1) / (H - 1)
output = np.zeros((H, W, channels), dtype=np.uint8)
for i in range(H):
for j in range(W):
x = x_ratio * j
y = y_ratio * i
x1 = int(x)
y1 = int(y)
x2 = x1 + 1 if x1 < ori_W - 1 else x1
y2 = y1 + 1 if y1 < ori_H - 1 else y1
f11 = img[y1, x1]
f12 = img[y2, x1]
f21 = img[y1, x2]
f22 = img[y2, x2]
output[i, j] = [int((f11[k] * (x2 - x) * (y2 - y) +
f21[k] * (x - x1) * (y2 - y) +
f12[k] * (x2 - x) * (y - y1) +
f22[k] * (x - x1) * (y - y1)) / ((x2 - x1) * (y2 - y1))) for k in range(channels)]
return output
```
其中,`img` 是原始图像,`H` 和 `W` 分别是缩放后的高度和宽度。该函数首先计算出缩放比例 `x_ratio` 和 `y_ratio`,然后遍历缩放后的图像像素坐标,对于每个像素,计算它在原始图像中的坐标 `(x, y)`,并找到离它最近的四个像素点 `(x1, y1)`、`(x1, y2)`、`(x2, y1)`、`(x2, y2)`。然后,根据这四个像素点的值,按照双线性插值公式计算出该像素点的值,并将其赋值给输出图像的对应位置。
例如,将一张 5x5 的图像缩放为 10x10 的图像:
```python
# 读入原始图像
img_path = 'lena.png'
img = np.array(Image.open(img_path))
# 缩放图像
H, W = 10, 10
output = bilinear_interpolation(img, H, W)
# 显示结果
Image.fromarray(output).show()
```
运行结果如下图所示:
![bilinear_interpolation](https://img-blog.csdnimg.cn/20211103171600112.png)
阅读全文