Как сохранить массив {UINT16, 2} в изображение в Юлии

У меня есть массив {UInt16,2} в Юлии размером 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)

Я использую Юлию 1.4.2

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

TIA!


person Ankur Sharma    schedule 11.07.2020    source источник
comment
разве ваши значения не должны быть между 0 и 1.0?   -  person daycaster    schedule 11.07.2020
comment
Вы предлагаете нормализовать значения до 1.0? И поменять его на тип float?   -  person Ankur Sharma    schedule 11.07.2020
comment
Как насчет img = rand(UInt16, 100, 200); colorview(Gray, img ./ maximum(img))?   -  person daycaster    schedule 11.07.2020
comment
@daycaster, спасибо за указатель. У меня это сработало. Я использовал ту же формулу, которую вы упомянули. Оказывается, его нужно было нормализовать до 1.0, чтобы преобразовать в изображение.   -  person Ankur Sharma    schedule 11.07.2020


Ответы (2)


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

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)

image

person daycaster    schedule 14.07.2020

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

using FixedPointNumbers

img = rand(UInt16, 10, 20)
colorview(Gray, reinterpret(N0f16, img)))
person Oscar Smith    schedule 14.07.2020
comment
Я попытался использовать здесь функцию переинтерпретации, чтобы изменить Unit16 на N0f16, но это привело к пустому изображению, когда я его сохранил. Хотя деление на максимальное значение сохранило изображение, которое я ожидал. Что здесь может быть не так? - person Ankur Sharma; 15.07.2020