python - 蟒蛇 | 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 数组?
解决方案
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() 读取:
cv2.imshow(),ndimage读取的图像:
cv2.imshow(),从RGB转换为BGR后:
推荐阅读
- c# - 使用 linq 进行复杂提取
- bash - 如何安全地查找和删除目录?
- pandas - 日期时间范围和时间范围之间的重叠(以秒为单位)
- vue.js - 可以直接在脚本标签上使用 vuetify-dialog 吗?
- python - python opencv waitKey(1)没有响应Mac上的输入
- javascript - API调用和mongodb的问题
- ios - 试图观察 UserDefaults 中的字符串,但遇到编译错误
- python - 如何导入在Odoo第三方模块中声明的Python纯类?
- scala - 为什么伴随对象的应用方法中不允许使用 var/val 声明字段
- flutter - 错误:参数类型“对象?” 不能分配给参数类型“字符串”