Питон |cv2.imshow () загружает массивы как BGR? - PullRequest
0 голосов
/ 30 января 2019

Я записал некоторые данные в файл 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?

1 Ответ

0 голосов
/ 30 января 2019

Matplotlib и Numpy считывают изображения в RGB и обрабатывают их как RGB.OpenCV считывает изображения в BGR и обрабатывает их как BGR.Любая система распознает диапазон типов ввода, имеет способы преобразования между цветовыми пространствами практически любого типа и предлагает поддержку различных задач обработки изображений.

Это дает три различных способа загрузки изображения ( plt.imread () , ndimage.imread () и cv2.imread () ), две системы для обработки данных (Numpy и CV2) и два способадля отображения изображения ( plt.imshow () и cv2.imshow () ), и действительно, существует третий способ отображения изображения с помощью pyplot, если вы хотите обработатьизображение в виде числовых данных на 2-м уровне плюс еще одно измерение для каждого цвета.

Вот простой код, демонстрирующий некоторые из них.

#!/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 () и показываем его с помощью imshow () Pyplot и получаем правильное изображение.Затем мы показываем это с помощью cv2.imshow () и видим, что красный канал интерпретируется как синий канал, и наоборот.Затем мы конвертируем цветовое пространство и видим, что cv2.imshow () теперь правильно интерпретирует результат.

plt.imshow (), как прочитано ndimage ():

plt.imshow(), as read by ndimage()

cv2.imshow (), изображение, прочитанное ndimage:

cv2.imshow(), the image as read by ndimage

cv2.imshow (),после преобразования из RGB в BGR:

cv2.imshow(), after converting from RGB to BGR

...