将rgb图像从numpy数组转换为HSV(opencv)

时间:2018-04-18 14:28:04

标签: python numpy opencv

当我将图像从RGB转换为HSV时,如果图像直接来自opencv,一切都很好:

img = cv2.imread(path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

然而,如果这个图像来自一个numpy数组形状(nb_of_images,224,224,3),则会出现一些复杂情况。

这是我的导入功能:

def import_images(path_list):
    path_len = len(path_list)
    images = numpy.zeros((path_len, 224, 224, 3), dtype = numpy.float64)

    for pos in range(path_len):
        testimg = cv2.imread(path_list[pos])

        if(testimg is not None):
            testimg = cv2.cvtColor(testimg, cv2.COLOR_BGR2RGB)
            testimg = cv2.resize(testimg, (224, 224))
            images[pos, :, :, :] = testimg
    return images

现在,这是我的麻烦:

images = import_images(["./test/dog.jpg"])
img = images[0, :, :, :]
img = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)

控制台出现以下错误:

cv2.error: /io/opencv/modules/imgproc/src/color.cpp:11073: error: (-215) depth == 0 || depth == 2 || depth == 5 in function cvtColor

我尝试更改图片类型:

img.astype(numpy.float32)

但控制台提供相同的错误

我错过了什么?

- 编辑 -

我正在使用 python 3.5

numpy(1.14.2)

opencv-python(3.4.0.12)

1 个答案:

答案 0 :(得分:1)

问题在于images中元素的数据类型。现在是np.float64

让我们看看C++ source code

中的断言
CV_Assert( depth == CV_8U || depth == CV_16U || depth == CV_32F );

翻译为numpy,这意味着元素的数据类型必须为np.uint8np.uint16np.float32才能使cvtColor完全正常工作。对于某些颜色转换还有其他更具体的检查。

正如您所提到的,32位浮点数足以满足您的用例,您可以

images = numpy.zeros((path_len, 224, 224, 3), dtype = numpy.float32)