Engee 文档
Notebook

使用双线性插值的图像放大

此示例演示使用双线性插值方法的图像放大。

导言

双线性插值是一种在保持中间像素值的同时增加或减少图像大小的方法。 它用于确保图像不会丢失质量,并且在缩放时不会看起来"像素化"。 该算法通过基于最近像素的加权平均值计算新像素值来工作。 在这个例子中,我们使用Julia库实现了一个给定缩放级别的图像放大函数,用于处理图像和插值。

In [ ]:
# Установка необходимых пакетов
import Pkg; Pkg.add(["Images", "FileIO", "Interpolations"])
In [ ]:
# Подключение необходимых библиотек
using Images      # Для работы с изображениями
using FileIO      # Для загрузки и сохранения изображений
using Interpolations # Для интерполяции данных, в данном случае — билинейной

主要部分

图像放大功能

声明图像缩放函数

该函数采用像素矩阵(图像)和缩放级别

In [ ]:
function enlarge(A::Matrix, factor::AbstractFloat)
    # Получаем исходные размеры изображения
    lx, ly = size(A)

    # Вычисляем новые размеры изображения, умножая старые на коэффициент и округляя до целых чисел
    nx, ny = round.(Int, factor .* (lx, ly))

    # Создаем линейные диапазоны для координат по x и y для нового изображения
    # LinRange создает равномерно распределенные точки между 1 и размером изображения по соответствующей оси
    vx, vy = LinRange(1, lx, nx), LinRange(1, ly, ny)

    # Создаем интерполятор для исходного изображения с использованием билинейной интерполяции
    # BSpline(Linear()) задаёт линейный сплайн, что соответствует билинейной интерполяции в 2D
    itp = interpolate(A, BSpline(Linear()))

    # Применяем интерполятор к новым координатам и возвращаем увеличенное изображение
    return itp(vx, vy)
end
Out[0]:
enlarge (generic function with 1 method)

图像加载和处理

我们从文件下载图像并将其转换为类型的像素矩阵 RGB{Float64}

这对于处理彩色图像和支持插值是必要的。

In [ ]:
img_s = load(joinpath(@__DIR__,"legio.jpg")) |> Matrix{RGB{Float64}};

调用因子为1.6的图像放大函数

In [ ]:
Alarge = enlarge(img_s, 1.6);

将放大的图像保存到文件中

In [ ]:
save(joinpath(@__DIR__,"LEGIO.jpg"), Alarge);
img_b = load(joinpath(@__DIR__,"LEGIO.jpg")) |> Matrix{RGB{Float64}};
In [ ]:
println("Начальный размер: $(size(img_s)), конечный размер: $(size(img_b))")
Начальный размер: (85, 85), конечный размер: (136, 136)

结论

在这个例子中,我们研究了Julia编程语言中图像放大的双线性插值算法的实现。 我们使用外部库加载/保存图像并执行插值。 因此,脚本加载图像,使用双线性插值将其放大1.6倍,并将结果保存到新文件中。 当您需要在不损失质量的情况下提高图像分辨率时,这对于处理图形非常有用。

该示例是使用[Rosetta代码]的材料开发的(https://rosettacode.org/wiki/Bilinear_interpolation