Пост

Использование matplotlib для визуализации изображений

Matplotlib является мощной библиотекой визуализации данных для Python, которая также предоставляет функциональность для отображения изображений. Однако при совместном использовании с OpenCV возникают особенности, связанные с различными цветовыми пространствами, которые требуют понимания и корректной обработки.

Использование matplotlib для визуализации изображений

Введение

Matplotlib является мощной библиотекой визуализации данных для Python, которая также предоставляет функциональность для отображения изображений. Однако при совместном использовании с OpenCV возникают особенности, связанные с различными цветовыми пространствами, которые требуют понимания и корректной обработки.

Визуализация изображений в оттенках серого

При работе с полутоновыми изображениями, загруженными через OpenCV, визуализация в Matplotlib осуществляется напрямую:

1
2
3
4
5
6
7
8
9
10
11
import cv2
import matplotlib.pyplot as plt

# Чтение изображения в оттенках серого
img = cv2.imread('/home/pi/dataset/4.2.03.tiff', 0)

# Визуализация с Matplotlib
plt.imshow(img, cmap='gray')
plt.title('stormtrooper')
plt.axis('off')
plt.show()

Визуализация полутонового изображения в Matplotlib

Проблема цветовых пространств

OpenCV использует цветовое пространство BGR (Blue-Green-Red), в то время как Matplotlib ожидает RGB (Red-Green-Blue). При прямой визуализации BGR-изображения в Matplotlib цвета отображаются некорректно:

1
2
3
4
5
6
7
8
# Чтение цветного изображения в BGR
img_bgr = cv2.imread('/home/pi/dataset/4.2.03.tiff', 1)

# НЕПРАВИЛЬНО: прямое отображение BGR в Matplotlib
plt.imshow(img_bgr)
plt.title('stormtrooper')
plt.axis('off')
plt.show()

Изображение с инвертированными цветами из-за BGR/RGB

Корректное преобразование BGR в RGB

Для правильного отображения цветных изображений необходимо преобразовать цветовое пространство из BGR в RGB:

1
2
3
4
5
6
7
8
# Преобразование BGR в RGB для корректного отображения
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)

# ПРАВИЛЬНО: отображение после преобразования
plt.imshow(img_rgb)
plt.title('stormtrooper')
plt.axis('off')
plt.show()

Изображение с правильными цветами после преобразования

Сравнение различных цветовых карт для полутоновых изображений

Matplotlib предоставляет различные цветовые карты для визуализации полутоновых изображений:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Создание подграфиков для сравнения цветовых карт
fig, axes = plt.subplots(2, 2, figsize=(10, 8))

# Оригинальное полутоновое изображение
axes[0, 0].imshow(img, cmap='gray')
axes[0, 0].set_title('Gray')
axes[0, 0].axis('off')

# Различные цветовые карты
axes[0, 1].imshow(img, cmap='viridis')
axes[0, 1].set_title('Viridis')
axes[0, 1].axis('off')

axes[1, 0].imshow(img, cmap='hot')
axes[1, 0].set_title('Hot')
axes[1, 0].axis('off')

axes[1, 1].imshow(img, cmap='plasma')
axes[1, 1].set_title('Plasma')
axes[1, 1].axis('off')

plt.tight_layout()
plt.show()

Сравнение цветовых карт для полутонового изображения

Полный рабочий процесс визуализации

Комплексный пример демонстрирует полный цикл работы с изображениями:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import cv2
import matplotlib.pyplot as plt

def visualize_image(image_path):
    # Чтение изображения
    img_bgr = cv2.imread(image_path, 1)
    img_gray = cv2.imread(image_path, 0)
    
    # Преобразование цветового пространства
    img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
    
    # Создание комплексной визуализации
    fig, axes = plt.subplots(1, 3, figsize=(15, 5))
    
    # BGR (некорректные цвета)
    axes[0].imshow(img_bgr)
    axes[0].set_title('BGR - Некорректно')
    axes[0].axis('off')
    
    # RGB (корректные цвета)
    axes[1].imshow(img_rgb)
    axes[1].set_title('RGB - Корректно')
    axes[1].axis('off')
    
    # Полутоновое изображение
    axes[2].imshow(img_gray, cmap='gray')
    axes[2].set_title('Оттенки серого')
    axes[2].axis('off')
    
    plt.tight_layout()
    plt.show()

# Использование функции
visualize_image('/home/pi/dataset/4.2.03.tiff')

Типичные проблемы и решения

Проблема: Искаженные цвета при отображении цветных изображений Решение: Всегда преобразовывайте BGR в RGB с помощью cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

Проблема: Слишком темное или светлое изображение Решение: Используйте параметр vmin и vmax в imshow() для управления диапазоном интенсивностей

Проблема: Низкое качество отображения Решение: Увеличьте DPI при сохранении: plt.savefig('image.png', dpi=300, bbox_inches='tight')

Проблема: Медленная визуализация больших изображений Решение: Используйте plt.imshow() с параметром interpolation='nearest' для ускорения

Правильное использование Matplotlib для визуализации изображений OpenCV требует понимания различий в цветовых пространствах. Преобразование BGR в RGB является обязательным шагом для корректного отображения цветных изображений. Возможности Matplotlib по настройке цветовых карт и созданию комплексных визуализаций делают его ценным инструментом для анализа и демонстрации результатов обработки изображений в проектах компьютерного зрения на Raspberry Pi.

Авторский пост защищен лицензией CC BY 4.0 .

© evdokimoff. Некоторые права защищены.

Использует тему Chirpy для Jekyll