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

MrY*_*ath 1 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
Run Code Online (Sandbox Code Playgroud)

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

我的问题:这种观察是否暗示图像阵列已经是BGR格式?还是这意味着cv2.imshow()默认情况下会将数组解释为BGR数组?

DrM*_*DrM 5

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)
Run Code Online (Sandbox Code Playgroud)

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

img data type: <type 'numpy.ndarray'> shape (225, 225, 3)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

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