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 ():
cv2.imshow (), изображение, прочитанное ndimage:
cv2.imshow (),после преобразования из RGB в BGR: