【发布时间】: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 是通道、高度、宽度的布局。添加在描述中