Обработка изображений¶
В данном примере мы продемонстируем, как применять Engee для обработки изображений, разберём отдельные функции для обработки изображений, рассмотрим возможности обращения к изображениям и методы их обработки и представления.
Начнем с выбора требуемых библиотек функций.
using Images # Библиотека обработки изображений
using ImageShow # Библиотека отрисовки изображений
Загрузка изображения¶
Функция load позволяет сохранить изображения в рабочие пространства в виде матрицы.
I = load("/user/start/examples/image_processing/processing_methods/IMG_001.jpg")
Приведение RGB к оттенкам серого¶
Создадим пользовательскую функцию расчёта средних значений для суммы измерений трёхмерной матрицы формата RGB.
RGB (red, green, blue) — аддитивная цветовая модель, описывающая способ кодирования цвета для цветовоспроизведения с помощью трёх цветов, которые принято называть основными.
function brightness(pixel)
arr = pixel.r + pixel.g + pixel.b;
return sum(arr) / length(arr)
end
После определения функции вызовем её и выполним отрисовку изображения.
Ibright = brightness.(I)
simshow(Ibright)
Как видно из рисунка выше, мы привели изображения к оттенкам серого цвета.
Обнаружение углов¶
Метод обнаружения углов пытается выявить точки на изображении, которые имеют четко определенное положение и могут быть надежно обозначены на нескольких изображениях одной и той же сцены. Очень часто эти точки лежат по углам или краям объектов изображения — отсюда и название метода.
Обнаружение углов полезно в ряде задач компьютерного зрения — регистрация изображений, обнаружение движения и панорамное сшивание. Метод основан на том, что, если расположение одних и тех же точек известно на двух разных изображениях, это дает возможности для выравнивания этих изображений.
Для обнаружения углов воспользуемся функцией imcorner, которая имеет один дополнительный показатель, — это параметр порогового процента обнаружения точек интереса.
corners = imcorner(Ibright, Percentile(98.5));
После обнаружения точек интереса отметим их красным цветом, переведя изображения в оттенках серого в RGB и присвоив первому измерению матрицы значения единицы в точках интереса.
img_copy = RGB.(Ibright)
img_copy[corners] .= RGB(1.0, 0.0, 0.0)
Как мы видим, углы были найдены на самых контрастных объектах изображения. В данном случае это облака и море.
simshow(img_copy)
Обнаружение границ изображенных объектов¶
Ещё одной частой задачей при обработке изображений является нахождение границ объектов. Для этого воспользуемся функцией Kernel.sobel, которая позволяет перевести изображения в частотную область. Далее представлена пользовательская функция обнаружения границ.
function find_energy(image)
energy_y = imfilter(brightness.(image), Kernel.sobel()[1])
energy_x = imfilter(brightness.(image), Kernel.sobel()[2])
return sqrt.(energy_x.^2 + energy_y.^2)
end
Следуюющим шагом применим пользовательскую функцию обнаружения границ объектов к исходному изображению и отобразим результат обработки изображения.
simshow(find_energy(I))
По результатам обработки мы однозначно можем определить границы каждого объекта на изображении, и эти данные впоследствии могут быть применены к дальнейшей обработке изображения.
Вывод¶
Как показал наш пример работы с картиной, Engee отлично подходит для обработки изображений. Учитывая обширную математическую функциональность среды, мы можем описать любой сколь угодно специфический алгоритм обработки, используя пользовательские функции.