Julia如何在保持像素顺序的前提下重塑数组?
解决Julia中通道优先RGB数组转通道在后格式的问题
嘿,我完全懂你的困扰——Matplotlib的imshow确实要求图像数组是高度×宽度×通道的格式,而你手里的是通道×高度×宽度的数组,直接用reshape只会打乱像素顺序,根本得不到正确的图像。
你自己写的嵌套循环逻辑是对的,但Julia有更高效、简洁的内置函数可以直接完成这个转换:permutedims,它专门用来重排数组的维度顺序,完全符合你的需求。
具体用法
只需要把你的数组和目标维度顺序传给permutedims就行:
using PyPlot # 假设你的原始图像数组是(3, 64, 64) img = rand(3, 64, 64) # 示例RGB数据 img_reshaped = permutedims(img, (2, 3, 1)) plt.imshow(img_reshaped)
为什么这个能行?
- 原始数组的维度顺序是
(通道, 高度, 宽度),对应索引(1, 2, 3) - 我们需要的目标顺序是
(高度, 宽度, 通道),对应索引(2, 3, 1) permutedims(img, (2, 3, 1))会把数组的维度按照这个顺序重新排列,和你写的三层嵌套循环做的事情完全一致,但效率要高得多(底层是优化过的实现)
为什么reshape不行?
reshape只是改变数组的“形状描述”,不会移动内存里的元素位置。你的原始数据是按通道优先存储的,reshape(img, (64, 64, 3))会直接按内存顺序把元素塞进新形状里,自然会打乱像素的正确位置,所以显示出来的图像是错的。
内容的提问来源于stack exchange,提问作者U2647
相关产品推荐
相关产品推荐

