Python | cv2.imshow()将数组作为BGR加载吗?

时间:2019-01-30 14:26:14

标签: python opencv numpy-ndarray

我已将一些数据记录为npy文件。然后,我尝试对图像(data[0]进行显示,以检查下面的代码是否有意义

import numpy as np
import cv2

train_data = np.load('c:/data/train_data.npy')

for data in train_data:
    output = data[1]
    # only take the height, width and channels of the 4 dimensional array
    image = data[0][0, :, :, :]
    # image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    cv2.imshow('test', image)
    print('output {}'.format(output))
    if cv2.waitKey(25) & 0xFF == ord('q'):
        cv2.destroyAllWindows()
        break

但是,如果我显示的图像没有行image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB),则这些图像似乎是基于BGR的。如果我将此行注释为代码,则图像将正确显示。

  

我的问题:这个观察结果是否暗示图像阵列已经是BGR格式?还是暗示cv2.imshow()通过   默认将数组解释为BGR数组?

1 个答案:

答案 0 :(得分:2)

Matplotlib和Numpy将图像读取为RGB并将其处理为RGB。 OpenCV将图像读入BGR并将其作为BGR处理。两种系统都可以识别多种输入类型,具有在几乎任何类型的色彩空间之间进行转换的方式,并提供对各种图像处理任务的支持。

这提供了三种不同的图像加载方式( plt.imread() ndimage.imread() cv2.imread() >),两个用于处理数据的系统(Numpy和CV2)以及两种显示图像的方式( plt.imshow() cv2.imshow()),实际上,如果要将图像当作二维数据中的数值数据,再加上每种颜色的另一维,则可以使用pyplot显示图像的第三种方法。

下面是一些简单的代码来演示其中的一些内容。

#!/usr/bin/python

import matplotlib.pyplot as plt
from scipy.ndimage import imread
import numpy as np
import cv2

img = imread('index.jpg')
print( "img data type: %s shape %s"%( type(img), str( img.shape) ) )

plt.imshow( img )
plt.title( 'pyplot as read' )
plt.savefig( 'index.plt.raw.jpg' )

cv2.imshow('cv2, read by numpy', img)
cv2.imwrite('index.cv2.raw.jpg',img)

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

cv2.imshow('after conversion', img)
cv2.imwrite('index.cv2.bgr2rgb.jpg',img)

这将生成以下文本行和以下三个示例图像文件。

img data type: <type 'numpy.ndarray'> shape (225, 225, 3)

正确的图像的上方圆圈为红色。我们使用ndimage.imread()将图像读取到一个numpy数组中,并使用Pyplot的imshow()进行显示,以获取正确的图像。然后,我们使用cv2.imshow()显示它,然后看到红色通道被解释为蓝色通道,反之亦然。然后我们转换色彩空间,然后看到cv2.imshow()现在可以正确解释结果了。

plt.imshow(),由ndimage()读取:

plt.imshow(), as read by ndimage()

cv2.imshow(),由ndimage读取的图像:

cv2.imshow(), the image as read by ndimage

cv2.imshow(),从RGB转换为BGR后:

cv2.imshow(), after converting from RGB to BGR