Документация 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 Code