Примените MatplotLib или пользовательскую цветовую карту к изображению OpenCV - PullRequest
0 голосов
/ 25 сентября 2018

OpenCV имеет ограниченное количество цветовых карт.MatplotLib имеет гораздо больше цветовых карт, но применить эти цветовые карты к данным изображениям OpenCV непросто.Как применить карты цветов MatplotLib со страницы ниже к изображениям OpenCV при использовании Python API?Это похоже на применение пользовательской карты цветов к данному изображению.

https://matplotlib.org/examples/color/colormaps_reference.html

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

В последних версиях OpenCV (начиная с 3.3) существует перегрузка applyColorMap, которая позволяет вам предоставить пользовательскую цветовую карту (1 или 3 канала).Я изменил код verify.human , чтобы просто создать цветовую карту, подходящую для использования с этой функцией.

Я воспользовался еще несколькими возможностями для упрощения кода:

  • ScalarMappable.to_rgba может возвращать байты (в диапазоне 0-255) напрямую, когда для аргумента bytes установлено значение True.
  • Мы можем использовать индексирование массива с отрицательным значениемразмер шага для удаления альфа-каналов, а также переключения с RGB на BGR за один шаг

Код:

import cv2
import numpy as np
from matplotlib import pyplot as plt


def get_mpl_colormap(cmap_name):
    cmap = plt.get_cmap(cmap_name)

    # Initialize the matplotlib color map
    sm = plt.cm.ScalarMappable(cmap=cmap)

    # Obtain linear color range
    color_range = sm.to_rgba(np.linspace(0, 1, 256), bytes=True)[:,2::-1]

    return color_range.reshape(256, 1, 3)


image_gray = cv2.imread('cage.png', cv2.IMREAD_GRAYSCALE)
image_bgr = cv2.applyColorMap(image_gray, get_mpl_colormap('bwr'))

cv2.imshow('image with colormap', image_bgr)
cv2.waitKey()
0 голосов
/ 03 октября 2018

Для Python> = 2.7, cmapy упаковывает эту функциональность удобным способом.Установите его с помощью:

Python 2.7:

pip install cmapy

Python 3.x:

pip3 install cmapy

Или для Анаконды (из conda-forge ):

conda install -c conda-forge cmapy 

И используйте это так:

import cv2
import matplotlib.pyplot as plt
import cmapy

# Read image.
img = cv2.imread('imgs/woman.png')

# Colorize.
img_colorized = cv2.applyColorMap(img, cmapy.cmap('viridis'))

# Display
plt.imshow(img_colorized)
plt.show()

Различные цветовые карты дают что-то вроде этого:

Просмотреть все доступные цветовые карты в действии здесь .

Отказ от ответственности: я написал cmapy (потому что мне нужна была эта функциональность для другого проекта), и внутренне она работает почти так же, как и другие ответы.

0 голосов
/ 25 сентября 2018

Отвечая на свой вопрос, потому что я не нашел простого решения в StackOverflow:

def apply_custom_colormap(image_gray, cmap=plt.get_cmap('seismic')):

    assert image_gray.dtype == np.uint8, 'must be np.uint8 image'
    if image_gray.ndim == 3: image_gray = image_gray.squeeze(-1)

    # Initialize the matplotlib color map
    sm = plt.cm.ScalarMappable(cmap=cmap)

    # Obtain linear color range
    color_range = sm.to_rgba(np.linspace(0, 1, 256))[:,0:3]    # color range RGBA => RGB
    color_range = (color_range*255.0).astype(np.uint8)         # [0,1] => [0,255]
    color_range = np.squeeze(np.dstack([color_range[:,2], color_range[:,1], color_range[:,0]]), 0)  # RGB => BGR

    # Apply colormap for each channel individually
    channels = [cv2.LUT(image_gray, color_range[:,i]) for i in range(3)]
    return np.dstack(channels)


image_gray = cv2.imread('./lena.jpg', cv2.IMREAD_GRAYSCALE)
image_bgr = apply_custom_colormap(image_gray, cmap=plt.get_cmap('bwr'))

cv2.imshow('image with colormap', image_bgr)
cv2.waitKey(0)

Создает изображение:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...