首页 > 解决方案 > 蟒蛇 | cv2.imshow() 将数组加载为 BGR?

问题描述

我已经将一些数据记录为 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 数组?

标签: pythonopencvnumpy-ndarray

解决方案


Matplotlib 和 Numpy 将图像读入 RGB 并将它们处理为 RGB。OpenCV 将图像读入 BGR 并将它们作为 BGR 处理。任何一个系统都可以识别一系列输入类型,可以在几乎任何类型的颜色空间之间进行转换,并支持各种图像处理任务。

这提供了三种不同的方式来加载图像(plt.imread()ndimage.imread()cv2.imread()),两种用于处理数据的系统(Numpy 和 CV2),以及两种显示图像的方式(plt .imshow()cv2.imshow()),实际上,如果您想将图像视为 2-d 中的数字数据以及每种颜色的另一个维度,还有第三种使用 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(),由 ndimage() 读取

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

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

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

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


推荐阅读