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数组?
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()读取:
cv2.imshow(),由ndimage读取的图像:
从RGB转换为BGR后的cv2.imshow():
| 归档时间: |
|
| 查看次数: |
1607 次 |
| 最近记录: |