Обрезка, изменение размера и масштабирование
В этой демонстрации показано, как использовать операции обрезки, изменения размера и масштабирования изображения в Julia с помощью ImageTransformations.jl.
using Images, TestImages, OffsetArrays
# ImageTransformations экспортируется вместе с пакетом Images.
# загружаем пример изображения
img_source = testimage("lighthouse")
Операция обрезки
Обрезка — одна из простейших операций обработки фотографий. Она служит для удаления ненужных объектов или шума на краях фотографии, изменения соотношения сторон или улучшения композиции.
Сначала проверим размер изображения.
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])]
Давайте проверим размер обрезанного изображения:
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))
Операция изменения размера
Эта операция служит для изменения размера изображения до заданной формы выходного изображения. Она отличается от масштабирования, при котором для обработки изображения применяется коэффициент масштабирования.
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)
Масштабирование
Операция масштабирования изменяет размер на заданный коэффициент масштабирования. Коэффициент масштабирования может представлять собой либо одиночное значение с плавающей запятой, либо набор значений — по одному для каждой оси. Масштабирование изображения — это процесс изменения размера изображения с сохранением исходного соотношения сторон.
Масштабирование на процентное значение
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)
Новый размер вычисляется путем умножения размера на масштаб с последующим усечением до формата 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)
Масштаб изменяется на процентное значение с целью динамического вычисления масштаба в процентах исходя из изменения одного из измерений. Помните, что 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)
Эта страница была создана с помощью DemoCards.jl и Literate.jl.