Увеличение изображения с помощью билинейной интерполяции
Этот пример демонстрирует увеличение изображения с использованием метода билинейной интерполяции.
Введение
Билинейная интерполяция — это метод увеличения или уменьшения размера изображения с сохранением промежуточных значений пикселей. Она используется для того, чтобы при масштабировании изображение не теряло качество и не выглядело "пиксельным". Алгоритм работает, вычисляя новые значения пикселей на основе взвешенного среднего значений ближайших пикселей. В данном примере мы реализуем функцию увеличения изображения с заданным коэффициентом масштабирования, используя библиотеки Julia для работы с изображениями и интерполяцией.
# Установка необходимых пакетов
import Pkg; Pkg.add(["Images", "FileIO", "Interpolations"])
# Подключение необходимых библиотек
using Images # Для работы с изображениями
using FileIO # Для загрузки и сохранения изображений
using Interpolations # Для интерполяции данных, в данном случае — билинейной
Основная часть
Функция увеличения изображения
Объявление функции увеличения изображения
Функция принимает матрицу пикселей (изображение) и коэффициент масштабирования
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
Загрузка и обработка изображения
Загружаем изображение из файла и преобразуем его в матрицу пикселей типа RGB{Float64}
Это необходимо для работы с цветными изображениями и поддержки интерполяции
img_s = load(joinpath(@__DIR__,"legio.jpg")) |> Matrix{RGB{Float64}};
Вызываем функцию увеличения изображения с коэффициентом 1.6
Alarge = enlarge(img_s, 1.6);
Сохраняем увеличенное изображение в файл
save(joinpath(@__DIR__,"LEGIO.jpg"), Alarge);
img_b = load(joinpath(@__DIR__,"LEGIO.jpg")) |> Matrix{RGB{Float64}};
println("Начальный размер: $(size(img_s)), конечный размер: $(size(img_b))")
Заключение
В данном примере мы рассмотрели реализацию алгоритма билинейной интерполяции для увеличения изображения в языке программирования Julia. Мы использовали внешние библиотеки для загрузки/сохранения изображений и выполнения интерполяции. В результате скрипт загружает изображение, увеличивает его в 1.6 раза с помощью билинейной интерполяции и сохраняет результат в новый файл. Это полезно для работы с графикой, когда необходимо увеличить разрешение изображения без потери качества.
Пример разработан с использованием материалов Rosetta Code