Saya memiliki banyak gambar (kucing) dan ingin memplot salah satunya. Gambar nilai dalam format UInt8 dan berisi 3 pita. Ketika saya mencoba untuk plot menggunakan plot saya mendapatkan kesalahan berikut, ERROR: StackOverflowError.

 Using Plots

# Get data
train_data_x = fid["train_set_x"] |> HDF5.read
#Out >
3×64×64×209 Array{UInt8, 4}:
[:, :, 1, 1] =
0x11  0x16  0x19  0x19  0x1b  …  0x01  0x01  0x01  0x01
0x1f  0x21  0x23  0x23  0x24     0x1c  0x1c  0x1a  0x16
0x38  0x3b  0x3e  0x3e  0x40     0x3a  0x39  0x38  0x33
...

# Reshape to be in the format, no_of_images x length x width x channels
train_data_rsp = reshape(train_data_x, (209,64,64,3))

# Get first image 
first_img = train_data_rsp[1, :, :, :]

plot(first_img)
Out >
ERROR: StackOverflowError:

# I also tried plotting one band and I get a line plot
plot(train_data_rsp[1,:,:,1])
#Out >

enter image description here

Ada ide apa yang salah dengan kode saya?

3
imantha 9 Mei 2021, 10:04

1 menjawab

Jawaban Terbaik

Pertama, saya akan berhati-hati tentang bagaimana Anda reshapeing; Saya pikir ini hanya akan mengatur ulang piksel dalam gambar Anda alih-alih menukar dimensi, yang sepertinya ingin Anda lakukan. Anda mungkin menginginkan train_data_rsp = permutedims(train_data_x, (4, 2, 3, 1)) yang benar-benar akan menukar dimensi di sekitar dan memberi Anda larik 209×64×64×3 dengan semantik piksel milik gambar mana yang diawetkan.

Kemudian, paket Images Julia memiliki colorview fungsi yang memungkinkan Anda menggabungkan saluran R,G,B yang terpisah menjadi satu gambar. Anda harus terlebih dahulu mengonversi larik Anda menjadi N0f8 ( format byte tunggal di mana 0 sesuai dengan 0,0 dan 255 hingga 1,0) format sehingga Images dapat bekerja dengannya. Ini akan terlihat seperti ini:

julia> arr_rgb = N0f8.(first_img / 255)  # rescale UInt8 (0-255) to Float64 (0.0-1.0)
64×64×3 Array{RGB{Float64},3} with eltype RGB{Float64}:
[:, :, 1] =
[...]
julia> img = colorview(RGB, map(i->selectdim(arr_rgb, 3, i), 1:3)...)
64×64 mappedarray(RGB{N0f8}, ImageCore.extractchannels, view(::Array{N0f8,3}, :, :, 1), view(::Array{N0f8,3}, :, :, 2), view(::Array{N0f8,3}, :, :, 3)) with eltype RGB{N0f8}:
[...]

Maka Anda harus dapat memplot gambar ini.

2
BallpointBen 10 Mei 2021, 16:54