Как сохранить массив {UINT16, 2} в изображение в Julia - PullRequest
2 голосов
/ 11 июля 2020

У меня есть массив {UInt16,2} в Julia размером 5328 × 3040. Я хочу сохранить его в формате png.

Я пробовал следующее:

save("gray.png", colorview(Gray, img))

Но получил следующую ошибку:

ERROR: TypeError: in Gray, in T, expected T<:Union{Bool, AbstractFloat, FixedPoint}, got Type{UInt16}
Stacktrace:
 [1] ccolor_number at C:\Users\ankushar\.julia\packages\ImageCore\KbJyT\src\convert_reinterpret.jl:60 [inlined]
 [2] ccolor_number at C:\Users\ankushar\.julia\packages\ImageCore\KbJyT\src\convert_reinterpret.jl:57 [inlined]
 [3] colorview(::Type{Gray}, ::Array{UInt16,2}) at C:\Users\ankushar\.julia\packages\ImageCore\KbJyT\src\colorchannels.jl:104
 [4] top-level scope at REPL[16]:1
caused by [exception 3]
IOError: symlink: operation not permitted (EPERM)

Я использую Julia 1.4 .2

Не могли бы вы предложить хороший способ хранения этих массивов в виде изображений в Julia?

TIA!

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Более быстрое и более точное решение - переинтерпретировать ваш массив как массив N0f16, который является типом из FixedPointNumbers, который в основном представляет собой Uint16, масштабируемый между 0 и 1. Это позволит избежать ошибок округления, но также избавит от необходимости делать копию.

using FixedPointNumbers

img = rand(UInt16, 10, 20)
colorview(Gray, reinterpret(N0f16, img)))
1 голос
/ 14 июля 2020

Вы можете нормализовать значения пикселей перед сохранением.

using Images

img = rand(UInt16, 10, 20)

img[1:3]

# => 3-element Array{UInt16,1}:
 0x7fc2
 0x057e
 0xae79

gimg = colorview(Gray, img ./ typemax(UInt16))

gimg[1:3] |> channelview

# => 3-element reinterpret(Float64, ::Array{Gray{Float64},1}):
 0.4990615701533532
 0.02145418478675517
 0.6815442130159457

save("gray.png", gimg)

образ

...