ImageMetadata.jl
Введение
Объект 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
Все преобразования, которые могут понадобиться, предусмотреть невозможно, но по крайней мере простые перестановки обрабатываются автоматически.