【问题标题】:OpenCV encode CHW(Channel, Height, Width) format image failedOpenCV 编码 CHW(Channel, Height, Width) 格式图像失败
【发布时间】:2021-01-25 01:51:31
【问题描述】:

我正在使用 OpenCV python API,图像最初是 HWC(默认情况下),我使用

img = cv2.imread(image_path)
image_bytes = cv2.imencode(".jpg", img)[1]

效果很好,img 变量是一个具有 HWC(height, width, channel) 格式的 ndarray,形状为 [224, 224, 3]

然后我将图像转置为 CHW(channel, height, width) 格式并导致 [3, 224, 224] ndarray 因为我的机器学习模型采用这种数组形状,但模型在另一台机器上,所以我想使用编码来减小大小,但是另一台机器被保留用于纯粹的机器学习,所以我不想在那台机器上进行转置,我想在解码后立即获得我需要的 ndarray。所以我使用

img = img.transpose((2, 0, 1))
image_bytes = cv2.imencode(".jpg", img)[1]

它引发了错误

Traceback:
  File "..."
    image_bytes = cv2.imencode(".jpg", img)[1]
cv2.error: OpenCV(4.1.0) /io/opencv/modules/imgcodecs/src/loadsave.cpp:871: error: (-215:Assertion failed) channels == 1 || channels == 3 || channels == 4 in function 'imencode'

图像编码是否支持 CHW?如何正确操作?

【问题讨论】:

  • 您是否考虑过 imencode 函数如何知道图像是 HWC 或 CHW 格式?
  • @Dr.Snoopy 似乎现在将第一个维度作为通道。代码是cpp原生的,我得去看源码。
  • @Dr.Snoopy 代码是#define CV_MAT_CN(flags) ((((flags) & CV_MAT_CN_MASK) >> CV_CN_SHIFT) + 1)。评论中的 flag 是维度,所以似乎只有其他 2 个变量很重要
  • 什么是 CHW 格式,谁想要/需要它?您似乎认为您可以任意交换图像中轴的顺序,这是没有意义的。除了 TIFF,几乎没有任何图像格式(JPEG、PNG、GIF、BMP、TGA、PNM)允许 1、3 或 4 个通道以外的任何图像格式。
  • @MarkSetchell 是通道、高度、宽度的布局。添加在描述中

标签: python opencv


【解决方案1】:

没有正常(常规)图像格式支持 CHW 编码。它们几乎都基于最终维度中有 1、2、3 或 4 个通道,如下所示:

  • 1 通道:假定灰度或深度图
  • 2 通道:灰度+alpha 或灰度+深度图
  • 3 通道:RGB 或 CMY
  • 4 通道:RGBA 或 RGB+深度图或 CMYK

值得注意的例外是 TIFF,它在某些变体中支持更多通道,但我的印象是图像查看器并没有那么广泛地理解它。

【讨论】:

  • 我觉得可能我的表达不太好。我的意思是,编码 CHW 布局图像,编码仍然是 RGB 通道,但通道在 ndarray 布局的第一维。希望这个解释是正确的?您对编辑这个问题有什么建议吗?
  • 问题不在于渠道为先。问题是宽度是最后的。所以一旦宽度超过 4 个像素,它就会变得不安。
  • 我不知道术语打乱,基本上是不是意味着编码CHW内存布局不合理?
  • 我不认为这是合理的,但你实际上并没有给出任何理由/理由想要这样或说什么应用程序想要这样的数据。我也看不出像您已经演示的那样简单地重新订购它有什么问题。可能有一些很好的理由,每天都有成千上万的人这样做,但我不知道......
  • 我已经添加了原因,请检查是否合理的场景
猜你喜欢
  • 1970-01-01
  • 2017-10-11
  • 2018-07-08
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多