Python和OpenCV中的类似图像形状转换

时间:2015-10-19 10:11:08

标签: python opencv

我是Python新手,很难理解Python中的图像形状转换。

在Python代码中,图像I has I.shape

ipdb> I.shape
(720, 1280, 3)

在Python中运行此命令会将I's shape转换为存储到h5_image

 h5_image = np.transpose(I, (2,0,1)).reshape(data_shape)

data_shape是:

 ipdb> p data_shape
 (1, 3, 720, 1280)
  1. OpenCV的相似功能是什么?它具有相同的输出?

  2. (1, 3, 720, 1280)中,1是什么意思?

  3. (3, 720, 1280)(720, 1280, 3)有什么区别?

1 个答案:

答案 0 :(得分:3)

你可以在python / numpy中查看图像(I)作为具有N维的矩阵。

  • 如果您有灰度图像,则每行和每列都会有单个值。这意味着2个维度,形状将是:I.shape --> (rows, cols)
  • 使用RGB图像,您有3个频道,红色,绿色,蓝色。因此,您总共有3个维度:I.shape --> (rows, cols, 3)
  • 使用RGBA图像,您有4个通道,红色,绿色,蓝色,alpha。还有3个维度:I.shape --> (rows, cols, 4)

这些是保存图像数据的常用方法,但当然您可以以任何您喜欢的方式保留它,只要您知道如何阅读它。例如,您可以将其保持为1维中的一个长向量,并保持图像的宽度和高度,以便您知道如何将其读取为2D格式。

有关更具体的问题:

  1. 我不确定您要查找的输出是什么。您也可以在OpenCV中执行transpose()flip()
  2. (1, 3, 720, 1280)仅表示您有一个额外的退化维度。要访问每个像素,您必须编写I[1,channel,row,col]1是不必要的,并且它不是保持图像数组的常用方法。你为什么要这样做?您想以特定格式保存吗? (HDF5?)
  3. 唯一的区别在于您的数据安排。例如,在(3, 720, 1280)的情况下,要获取红色通道,您需要编写:red = I[0,:,:]。在(720, 1280, 3)的情况下,你需要写:red = I[:,:,0](这是更常见的)。
  4. *有一些性能问题取决于您记忆中图像数据的实际布局,但我认为您现在不需要关心这一点。