从 BGR 到灰度的 OpenCV 颜色转换中出现错误



我正在尝试使用以下代码将图像从BGR转换为灰度格式:

img = cv2.imread('path//to//image//file')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

这似乎工作正常:我检查了img变量的数据类型,结果发现它是numpy ndarray,形状是(100,80,3)的。但是,如果我给出具有与cvtColor函数输入相同维度的本机numpy ndarray数据类型的图像,则会给我以下错误:

Error: Assertion failed (depth == 0 || depth == 2 || depth == 5) in cv::cvtColor, file D:BuildOpenCVopencv-3.4.1modulesimgprocsrccolor.cpp, line 11109
cv2.error: OpenCV(3.4.1) D:BuildOpenCVopencv-3.4.1modulesimgprocsrccolor.cpp:11109: error: (-215) depth == 0 || depth == 2 || depth == 5 in function cv::cvtColor

第二种情况的代码是(在此处进行自定义np.ndarray(:

img = np.full((100,80,3), 12)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

谁能澄清此错误的原因是什么以及如何纠正它?

这是因为您的 numpy 数组不是由正确的数据类型组成的。默认情况下,创建一个类型为np.int64(64 位(的数组,但是,cv2.cvtColor()需要 8 位 (np.uint8( 或 16 位 (np.uint16(。要更正此问题,请将np.full()函数更改为包含数据类型:

img = np.full((100,80,3), 12, np.uint8)

以初始图像作为源和dtype=np.uint8初始化新的 numpy 数组可能更容易:

import numpy as np    
img = cv2.imread('path//to//image//file')    
img = np.array(img, dtype=np.uint8)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

发生该错误是因为cv2.imread返回的 numpy 数组的数据类型为uint8,这与np.full()返回的 numpy 数组的数据类型不同。若要使数据类型为 uint8,请添加dtype参数-

img = np.full((100,80,3), 12, dtype = np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

假设你有一个名为preprocessing((的函数,它用cv2预处理你的图像, 如果您尝试将其应用为:

data = np.array(list(map(preprocessing,data)))

它不起作用,并且由于 np.array 创建了 int64 并且您正在尝试为其分配 np.uint8,您应该做的是添加 dtype 参数,如下所示:

data = np.array(list(map(preprocessing,data)), dtype = np.uint8)

最新更新