Документация Engee

Обрезка, изменение размера и масштабирование

В этой демонстрации показано, как использовать операции обрезки, изменения размера и масштабирования изображения в Julia с помощью ImageTransformations.jl.

using Images, TestImages, OffsetArrays
# ImageTransformations экспортируется вместе с пакетом Images.
# загружаем пример изображения
img_source = testimage("lighthouse")
ydxfwuv

Операция обрезки

Обрезка — одна из простейших операций обработки фотографий. Она служит для удаления ненужных объектов или шума на краях фотографии, изменения соотношения сторон или улучшения композиции.

Сначала проверим размер изображения.

img_size = size(img_source)
(512, 768)

В результате получаем (512,768). Это означает, что изображение img_source имеет высоту 512 и ширину 768. В Julia изображения как многомерные массивы хранятся по столбцам, то есть первый индекс соответствует вертикальной оси (столбцу), а второй — горизонтальной оси (строке).

С порядком хранения в памяти связана проблема производительности индексирования. Дополнительные сведения см. в разделе Советы по производительности.

Давайте обрежем изображение по бокам на 1/8 от размера img_source, а сверху и снизу оставим его как есть.

Проще всего сделать это с помощью индексов: img_source[y1:y2, x1:x2]

Область интереса: [y1, y2] задает диапазон для оси y, а [x1, x2] — для оси x исходного изображения.

img_cropped = @view img_source[ :,floor(Int, 1/8*img_size[2]) : floor(Int, 7/8*img_size[2])]
jmjizdj

Давайте проверим размер обрезанного изображения:

size(img_cropped)
(512, 577)

Можно также выполнить обрезку изображения с сохранением размера, заменив содержимое изображения белыми или прозрачными пикселями с помощью PaddedView:

img_padded = PaddedView(
    zero(eltype(img_source)),
    OffsetArray(img_cropped, OffsetArrays.Origin(1, floor(Int, 1/8*img_size[2]))),
    axes(img_source))
lhjfqyj

Операция изменения размера

Эта операция служит для изменения размера изображения до заданной формы выходного изображения. Она отличается от масштабирования, при котором для обработки изображения применяется коэффициент масштабирования.

img_square = imresize(img_source, (400, 400));
img_small = imresize(img_source, ratio=1/4);
img_medium = imresize(img_small, size(img_small).*2);
mosaicview(img_source, img_square, img_small, img_medium; nrow=1)
kosqxvo

Масштабирование

Операция масштабирования изменяет размер на заданный коэффициент масштабирования. Коэффициент масштабирования может представлять собой либо одиночное значение с плавающей запятой, либо набор значений — по одному для каждой оси. Масштабирование изображения — это процесс изменения размера изображения с сохранением исходного соотношения сторон.

Масштабирование на процентное значение

percentage_scale = 0.6
new_size = trunc.(Int, size(img_source) .* percentage_scale)
img_rescaled = imresize(img_source, new_size);
mosaicview(img_source, img_rescaled; nrow=1)
mjqqoji

Новый размер вычисляется путем умножения размера на масштаб с последующим усечением до формата Int.

Масштабирование по определенному измерению

new_width = 200
percentage_scale = new_width / size(img_source,2);
new_size = trunc.(Int, size(img_source) .* percentage_scale);
img_rescaled = imresize(img_source, new_size);
mosaicview(img_source, img_rescaled; nrow=1)
ycmkepb

Масштаб изменяется на процентное значение с целью динамического вычисления масштаба в процентах исходя из изменения одного из измерений. Помните, что size(sourceimage) == (height, width).

Масштабирование в два раза с помощью функции restrict

rescaled_both = restrict(img_source); # обе стороны
rescaled_height = restrict(img_source, 1); # dims=1, то есть измерение по высоте
rescaled_width = restrict(img_source, 2); # dims=2, то есть измерение по ширине
mosaicview(img_source, rescaled_both, rescaled_height, rescaled_width; nrow=1)
dgympsc

Эта страница была создана с помощью DemoCards.jl и Literate.jl.