繁体   English   中英

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

[英]Similar Image shape conversion in Python and 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) (3, 720, 1280)什么区别?

您可以在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)

这些是保存图像数据的常用方法,但是当然,只要您知道如何读取,就可以以任何喜欢的方式保存它。 例如,您可以将其作为一维矢量保持一个长矢量,还可以保留图像的宽度和高度,因此您知道如何将其读取为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] (这是更常见的)。

*有些性能问题取决于您内存中图像数据的实际排列方式,但是我认为您现在不需要关心这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM