Обработка изображений
Основы работы с изображениями
Получение изображений в Engee
Импорт и отображение изображений
cd(@__DIR__);
using Images, ImageShow, ImageTransformations
Задание 1
Вы можете импортировать изображение в память и присвоить его переменной в Engee для последующей обработки, отображения и экспорта.
A = load("imgFile.jpg");
Завершение строки точкой с запятой не позволяет отображать значения, хранящиеся в A, что полезно, поскольку изображения обычно содержат миллионы значений.
IMG_001.jpg в память и присвойте его переменной I.Не забудьте использовать точку с запятой (
;), чтобы значения, хранящиеся в I, не отображались.
Подсказка
Используйте кавычки вокруг имени файла, когда вы используете его в качестве входных данных для функции load.
Решение
I = load("IMG_001.jpg");
Задание 2
При работе с изображениями вы можете отображать и просматривать их внутри среды Engee.
Данные изображений, хранящиеся в A, могут быть отображены при помощи функции simshow.
simshow(A)
I.
Подсказка
Используйте simshow, передав на вход переменную I.
Решение
simshow(I)
Задание 3
Чтобы проверить результаты работы функций и алгоритма масштабирования, вам понадобятся дополнительные изображения для анализа.
IMG_002.jpg в переменную I2 и выведите его на экран. Не забудьте использовать точку с запятой (
;) при чтении файла изображения.
Подсказка
Повторно используйте код из заданий 1 и 2, корректируя входные и выходные данные по мере необходимости.
Решение
I2 = load("IMG_002.jpg");
Задание 4
Обычно удобнее просматривать несколько изображений одновременно. Например, вам может понадобиться сравнить изображение и измененную версию этого изображения.
Вы можете вывести два изображения вместе, используя функцию simshow.
simshow([A1 A2])
I и I2 вместе.
Подсказка
Для вывода обеих переменных их нужно передать функции в квадратных скобках, без запятой между ними.
Решение
simshow([I I2])
Изображения в оттенках серого и цветные изображения
Извлечение цветовых плоскостей и значений интенсивности
Цветовые плоскости
Все изображения в Julia хранятся в трех цветовых плоскостях. Подобно солнечному свету, который состоит из полного спектра цветов, цветовые плоскости объединяются, создавая различные цвета и оттенки.
Задание 5
IMG_003.jpg в переменную I, а затем отобразите ее с помощью simshow.
Подсказка
Используйте функцию load, чтобы загрузить изображение.
Решение
I = load("IMG_003.jpg");
simshow(I)
Задание 6
Размер изображения влияет на многие методы обработки изображений.
Вы можете определить размер массива с помощью функции size.
sz = size(A)
Функция size возвращает массив. Первым элементом в массиве является количество строк в матрице изображения, которое соответствует высоте изображения. Второй элемент – это количество столбцов в матрице, которое соответствует ширине изображения.
I и сохраните результат в sz.
Подсказка
Убедитесь, что входными данными для функции size является переменная I.
Решение
sz = size(I)
Задание 7
Вы можете получить доступ к отдельным цветовым плоскостям изображения, используя методы red, green, blue.
Обратите внимание, оператор . между функцией и передаваемым ей параметром позволяет применить функцию ко всем пикселям изображения.
Ig = green.(I)
Либо используя цикл, выбрав цветовую плоскость, обращаясь к полям структуры изображения: r, g, b.
Ig = [p.g for p in I]
I и сохраните ее в B. Отобразите B с помощью simshow.
Подсказка
Чтобы извлечь синюю плоскость, нужно воспользоваться функцией blue и поставить после нее точку (.) для применения функции к каждому пикселю изображения.
Решение
B = blue.(I);
simshow(B)
Задание 8
Большинство изображений используют тип данных normed unsigned 8-bit integer (uint8), в котором хранятся целые числа от 0 до 255, которые после нормирования переходят в диапазон от 0 до 1. Яркие или ярко окрашенные изображения содержат значения интенсивности пикселей, близкие к 1, в одной или нескольких цветовых плоскостях. Если потребуется обратно перейти к целым числам от 0 до 255, это можно будет сделать, умножив все значения на 255.
На синей плоскости этого изображения есть несколько довольно ярких областей. Как вы думаете, достигают ли какие-либо элементы синей плоскости максимального значения 1?
Вы можете найти наибольшее значение в массиве, используя функцию findmax.
Amax = findmax(A)[1];
println(Amax)
Поскольку функция findmax возвращает 2 аргумента: значение и индекс максимального элемента массива, то для получения только максимума указывается индекс [1].
B, сохраните результат в Bmax и выведите его на экран.
Подсказка
Используйте функцию findmax с параметром B и укажите после нее [1]. Не забудьте вывести результат на экран.
Решение
Bmax = findmax(B)[1]
Задание 9
Темные области содержат значения, близкие к нулю. Основываясь на изображении синей плоскости из задания 7, как вы думаете, есть ли на синей плоскости какие-либо элементы со значением 0?
Вы можете найти наименьшее значение в массиве, используя функцию findmin.
Amin = findmin(A)[1]
Bmin и выведите его на экран.
Подсказка
Используйте функцию findmin с параметром B и укажите после нее [1]. Не забудьте вывести результат на экран.
Решение
Bmin = findmin(B)[1]
Преобразование из цветного в оттенки серого
Зачем преобразовывать в оттенки серого?
- При загрузке в память изображение в оттенках серого занимает треть пространства, необходимого для изображения в формате RGB.
- Поскольку изображение в оттенках серого содержит треть данных, для его обработки требуется меньше вычислительной мощности и время вычислений может сократиться.
- Изображение в оттенках серого концептуально проще, чем изображение RGB, поэтому разработка алгоритма обработки изображения может быть более простой при работе с оттенками серого.
При создании некоторых функций будут использоваться изображения в оттенках серого для повышения производительности.
I = load("IMG_002.jpg");
simshow(I)
Задание 10
Алгоритм, который вы реализуете в этом обучении, будет использовать функции обработки с применением изображений в оттенках серого. Преобразование изображений в оттенки серого устраняет цветопередачу и помогает алгоритму сосредоточиться на контрасте.
Вы можете преобразовать изображение в оттенки серого, используя функцию Gray.
Ags = Gray.(A);
I в изображение в оттенках серого и сохраните результат в gs. Выведите gs.
Подсказка
Используйте функцию Gray для преобразования изображения в оттенки серого. Затем используйте simshow для отображения результата.
Решение
gs = Gray.(I);
simshow(gs)
Задание 11
При обработке изображений в оттенках серого теряется значение каждого из трех оттенков цветовой панели.
Эта незначительная потеря информации имеет преимущество: gs в три раза меньше I и имеет только два измерения вместо трех. Вы можете проверить отличие в размере занимаемой памяти с помощью функций typeof и sizeof.
tp = typeof(A1)
sz = sizeof(A1)
Каждый элемент gs имеет тип Gray{N0f8}, который занимает 1 байт, тогда как каждый элемент I имеет тип RGB{N0f8}, который занимает 3 байта.
I и gs и сохраните значения в tpI, szI и tpgs, szgs соответственно.
Подсказка
Убедитесь в том, что вы передали параметр I в функции typeof и sizeof, присвоив результат переменным tpI и szI. Аналогично для изображения gs.
Решение
tpI = typeof(I);
szI = sizeof(I);
tpgs = typeof(gs);
szgs = sizeof(gs);
println("type of I - " , tpI)
println("size of I - " , szI)
println("type of gs - " , tpgs)
println("size of gs - " , szgs)
Изменение размеров изображения
Задание 12
Размер изображения можно изменить с помощью функции imresize, которая находится в библиотеке ImageTransformations. Например, чтобы уменьшить изображение I в 5 раз, нужно ввести следующую команду:
img_small = imresize(I, ratio=1/5)
Img_001.jpg, уменьшите его размер в 8 раза и сохраните результат в img_small. Выведите на экран исходное и уменьшенное изображения.
Подсказка
Сначала загрузите изображение с помощью функции load. Затем используйте функцию imresize с параметром ratio, равным 1/8. Для вывода изображений на экран используйте функцию simshow.
Решение
I = load("IMG_001.jpg")
simshow(I)
img_small = imresize(I, ratio=1/8);
simshow(img_small)
Задание 13
Если вы хотите увеличить размер изображения, то значение параметра ratio должно быть больше единицы. Например, для увеличения изображения I в 5 раз используется следующая команда:
img_big = imresize(I, ratio=5)
img_small в 2 раза и сохраните результат в img_medium. Выведите на экран увеличенное изображение.
Подсказка
Используйте функцию imresize с параметром ratio, равным 2. Для вывода изображения на экран используйте функцию simshow.
Решение
img_medium = imresize(img_small, ratio=2);
simshow(img_medium)
Поворот изображения
Задание 14
Повернуть изображение I на угол phi по часовой стрелке относительно центральной точки можно с помощью функции imrotate, которая также находится в библиотеке ImageTransformations:
I2 = imrotate(I, phi)
При повороте изображения в направлении против часовой стрелки используется отрицательное значение угла phi.
Img_001.jpg на угол pi/2 против часовой стрелки и сохраните результат в I2. Выведите на экран повернутое изображение.
Подсказка
Воспользуйтесь функцией imrotate с первым аргументом I и вторым аргументом -pi/2.
Решение
I2 = imrotate(I, -pi/2);
simshow(I2)
Тест для получения сертификата
Если вы впервые проходите тестирование на платформе Этюд по ссылке из Engee, то, нажав на ссылку ниже, вы увидите следующее диалоговое окно:
Нажмите на кнопку "Предоставить", чтобы авторизоваться на платформе Этюд с данными вашего профиля Engee ID.
Если вы раньше уже проходили тестирование по ссылке из Engee, то ваша авторизация выполнится автоматически и тестирование начнется сразу же после нажатия на ссылку.