如何将 ArrayFire 图像转换为 Julia 图像?
How do I convert ArrayFire Image to Julia Image?
我想将 Plots.jl 的绘图功能与使用 ArrayFire 的 load_image()
函数加载的图像一起使用。
我有的是:
AFArray: 1000×300×3 Array{Float32,3}
我想要的是:
300×1000 Array{RGB{Any},2} with eltype RGB
我无法在文档中找到直接转换。有什么有效的方法可以做到这一点吗?
我不太了解 ArrayFire 数组,但通常您可以使用 reinterpret
进行此类操作。如果你想让新的数组驻留在cpu上,那就把它复制过来。
然后,理想情况下,您可以这样做
rgb = reinterpret(RGB{Float32}, A)
不幸的是,MxNx3 不是 RGB 阵列的最佳布局,因为您希望按顺序放置 3 个值。所以你应该确保数组有 3xMxN 布局,或者你可以做 permutedims(A, (3, 1, 2))
.
最后,要得到一个矩阵,你必须去掉前导单维,否则你会得到一个 1xMxN 的数组。
所以,
rgb = dropdims(reinterpret(RGB{Float32}, permutedims(A, (3, 1, 2))); dims=1)
我假设你真的想要 RGB{Float32}
而不是 RGB{Any}
。
顺便说一句,如果您想将最终数组保留在 GPU 上,我不确定这将如何工作。
编辑: 您可以考虑 reshape
而不是 dropdims
,它在我的电脑上似乎稍微快一些。
我想将 Plots.jl 的绘图功能与使用 ArrayFire 的 load_image()
函数加载的图像一起使用。
我有的是:
AFArray: 1000×300×3 Array{Float32,3}
我想要的是:
300×1000 Array{RGB{Any},2} with eltype RGB
我无法在文档中找到直接转换。有什么有效的方法可以做到这一点吗?
我不太了解 ArrayFire 数组,但通常您可以使用 reinterpret
进行此类操作。如果你想让新的数组驻留在cpu上,那就把它复制过来。
然后,理想情况下,您可以这样做
rgb = reinterpret(RGB{Float32}, A)
不幸的是,MxNx3 不是 RGB 阵列的最佳布局,因为您希望按顺序放置 3 个值。所以你应该确保数组有 3xMxN 布局,或者你可以做 permutedims(A, (3, 1, 2))
.
最后,要得到一个矩阵,你必须去掉前导单维,否则你会得到一个 1xMxN 的数组。
所以,
rgb = dropdims(reinterpret(RGB{Float32}, permutedims(A, (3, 1, 2))); dims=1)
我假设你真的想要 RGB{Float32}
而不是 RGB{Any}
。
顺便说一句,如果您想将最终数组保留在 GPU 上,我不确定这将如何工作。
编辑: 您可以考虑 reshape
而不是 dropdims
,它在我的电脑上似乎稍微快一些。