【问题标题】:Changing the way matplotlib reads images改变 matplotlib 读取图像的方式
【发布时间】:2020-01-29 20:40:11
【问题描述】:

我想构建一个 CNN,并且我使用 matplotlib 来读取图像(尝试使用 cv2,但在正确显示图像方面效果不佳,并且 PIL 由于某种原因对我不起作用)无论如何,我可以读取图像,但将其读取为 Image[height][width][channel]。我怎样才能把它改成这样读: Image[channel][height][width] 所以以后对它进行卷积会更容易吗? 当然,我的意思是不运行嵌套 for 循环来从每个通道获取每个值并将它们放入矩阵中,我是在问是否有更好的方法。

感谢所有帮助:)

【问题讨论】:

  • 几乎没有理由为您的目的切换轴的顺序。您绝对可以在不使用循环的情况下使卷积工作——您只需要学习如何处理 numpy 中的广播:)。此外,OpenCV 和 PIL 以及您将使用的几乎任何库都将期望 (h, w, channels) 而不是 (channels, h, w)。我建议坚持使用 OpenCV 进行图像读取,而是更改显示图像的方式以适合您。
  • 我的意思是,我可以,但是将第一个更改为频道更容易,因为它可以让我很容易地通过它来刺激它,而且它不会接受它,这就是我制作它的原因它具有不同形状的克隆,以便我可以更轻松地更改它,我尝试使用 cv2.imshow(image) 在 CV2 中显示图像,但它什么也没做。请问:numpy中的“广播”到底是什么意思?
  • imshow() 烦人地不绘制窗口,你必须使用waitKey()---见here。无论如何,您都不应该遍历一个 numpy 数组,因为它很慢;通常在 numpy 中,您使用 numpy 中的函数在 C 中进行幕后的迭代和计算。 numpy 中的Broadcasting 是您可以一次在多个轴上操作的方式,例如卷积每个通道。

标签: python matplotlib image-processing


【解决方案1】:

您应该能够使用numpy's moveaxis() 到达您想要的位置

img = np.zeros((5,6,3))
img.shape
>> (5, 6, 3)
img2 = np.moveaxis(img, -1, 0)
img2.shape
>> (3, 5, 6)

【讨论】:

  • 非常感谢,这行得通!尽管如此,我需要创建另一个变量来实现它,因为如果我想显示实际图像,我需要保持它的原始形状,但它确实工作得很好,谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多