双线性插值
原理
- 根据目标图像和原始图像的宽高比例,确定目标图像中每个像素对应的原始图像的四个最邻近像素。
2.对于目标图像中的每个像素,根据其在原始图像中的位置和邻近像素的灰度值,进行插值计算。
优点
- 比最近邻插值更精确:双线性插值考虑了目标像素周围的邻近像素,通过加权平均的方式计算插值结果,使得插值后的图像更加平滑自然,减少了锯齿状的伪像。
- 适用于缩放和旋转:双线性插值不仅可以用于图像缩放,还可以用于图像旋转等仿射变换。在这些变换中,双线性插值可以处理变换后每个像素的值,使得变换后的图像保持平滑。
- 可扩展性:双线性插值算法可以应用于不同分辨率的图像,适用于各种缩放比例和图像大小。
不足
- 计算复杂度较高:相比于最近邻插值,双线性插值需要进行更复杂的计算,因此相对较慢。
- 处理锐利边缘不佳:双线性插值可能导致锐利边缘的模糊和细节丢失。
代码
import numpy as np
from PIL import Image
def bilinear_interpolation(input_image, target_width, target_height):
input_array = np.asarray(input_image)
height, width, _ = input_array.shape
x_ratio = float(width - 1) / target_width
y_ratio = float(height - 1) / target_height
output_array = np.zeros((target_height, target_width, 3), dtype=np.uint8)
for y in range(target_height):
for x in range(target_width):
x_origin = int(x_ratio * x)
y_origin = int(y_ratio * y)
x_diff = (x_ratio * x) - x_origin
y_diff = (y_ratio * y) - y_origin
top_left = input_array[y_origin, x_origin]
top_right = input_array[y_origin, x_origin + 1]
bottom_left = input_array[y_origin + 1, x_origin]
bottom_right = input_array[y_origin + 1, x_origin + 1]
output_array[y, x] = (
top_left * (1 - x_diff) * (1 - y_diff) +
top_right * x_diff * (1 - y_diff) +
bottom_left * (1 - x_diff) * y_diff +
bottom_right * x_diff * y_diff
)
output_image = Image.fromarray(output_array)
return output_image
# 载入原始图像
input_image = Image.open("1.png")
# 设定目标图像的宽高
target_width = 300
target_height = 350
# 进行双线性插值
output_image = bilinear_interpolation(input_image, target_width, target_height)
# 保存插值后的图像
output_image.save("2_output_1.png")
原始图像
双线性插值之后的图像: