我已将一些数据记录为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数组?
答案 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()读取:
cv2.imshow(),由ndimage读取的图像:
cv2.imshow(),从RGB转换为BGR后: