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

ImageMetadata.jl

ImageMetadata (пакет в составе Images) позволяет добавлять метаданные к изображениям, например дату и время, когда они были получены, идентификаторы местоположений или объектов и т. д. Эти метаданные хранятся в виде словаря, а тип ImageMeta объединяет в себе свойства массивов и Dict.

Введение

Объект ImageMeta обычно создается с использованием именованных аргументов:

julia> using Colors, ImageMetadata, Dates

julia> img = ImageMeta(fill(RGB(1,0,0), 3, 2), date=Date(2016, 7, 31), time="high noon")
RGB ImageMeta with:
  data: 3×2 Array{RGB{N0f8},2} with eltype RGB{N0f8}
  properties:
    date: 2016-07-31
    time: high noon

Затем к элементам img можно обращаться по индексам следующим образом:

julia> img[1,2]
RGB{N0f8}(1.0,0.0,0.0)

А свойства можно получать и задавать так:

julia> img.time
"high noon"

julia> img.time = "evening"
"evening"

julia> img
RGB ImageMeta with:
  data: 3×2 Array{RGB{N0f8},2} with eltype RGB{N0f8}
  properties:
    date: 2016-07-31
    time: evening

Извлечь матрицу данных можно с помощью вызова arraydata(img):

julia> arraydata(img)
3×2 Array{RGB{N0f8},2} with eltype RGB{FixedPointNumbers.N0f8}:
 RGB{N0f8}(1.0,0.0,0.0)  RGB{N0f8}(1.0,0.0,0.0)
 RGB{N0f8}(1.0,0.0,0.0)  RGB{N0f8}(1.0,0.0,0.0)
 RGB{N0f8}(1.0,0.0,0.0)  RGB{N0f8}(1.0,0.0,0.0)

а словарь свойств — с помощью properties:

julia> properties(img)
Dict{Symbol, Any} with 2 entries:
  :date => Date("2016-07-31")
  :time => "high noon"

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

При обращении по индексу к скалярной позиции (одному пикселю) img[i,j,...] вернет только значение этого пикселя. Но при обращении по индексам к диапазону вы получите еще один объект ImageMeta:

julia> c = img[1:2, 1:2]
RGB ImageMeta with:
  data: 2×2 Array{RGB{N0f8},2} with eltype RGB{N0f8}
  properties:
    date: 2016-07-31
    time: high noon

При этом копируются как данные (только соответствующие части), так и словарь свойств. Напротив:

julia> v = view(img, 1:2, 1:2)
RGB ImageMeta with:
  data: 2×2 view(::Array{RGB{N0f8},2}, 1:2, 1:2) with eltype RGB{N0f8}
  properties:
    date: 2016-07-31
    time: high noon

имеет общие данные и свойства с исходным изображением img. Изменение значений или свойств в c не влияет на img, но изменение значений или свойств в v влияет.

copyproperties и shareproperties

Два удобных способа создания изображения с «теми же» свойствами — это copyproperties (создает копию словаря свойств) и shareproperties (использует общий словарь свойств).

Между прочим, similar создает копию словаря свойств.

spatialproperties

Иногда свойство может быть связано с пространственными осями изображения. В таких случаях путаницу может вызывать, например, функция permutedims, которая меняет порядок измерений в массиве: если не поменять также порядок соответствующих свойств, может возникнуть хаос.

Определенные свойства можно объявить связанными с пространственными осями с помощью "spatialproperties":

julia> using ImageMetadata

julia> A = reshape(1:15, 3, 5)
3×5 reshape(::UnitRange{Int64}, 3, 5) with eltype Int64:
 1  4  7  10  13
 2  5  8  11  14
 3  6  9  12  15

julia> img = ImageMeta(A, spatialproperties=Set([:maxsum]), maxsum=[maximum(sum(A,dims=1)), maximum(sum(A,dims=2))])
Int64 ImageMeta with:
  data: 3×5 reshape(::UnitRange{Int64}, 3, 5) with eltype Int64
  properties:
    maxsum: [42, 45]
    spatialproperties: Set([:maxsum])

julia> imgp = permutedims(img, (2,1))
Int64 ImageMeta with:
  data: 5×3 Matrix{Int64}
  properties:
    maxsum: [45, 42]
    spatialproperties: Set([:maxsum])

julia> maximum(sum(imgp, dims=1))
45

Все преобразования, которые могут понадобиться, предусмотреть невозможно, но по крайней мере простые перестановки обрабатываются автоматически.