ver*_*man 9 python opencv visualization matplotlib
OpenCV 的颜色图数量有限。MatplotLib 有更多的颜色图,但将这些颜色图应用于给定的 OpenCV 图像并不简单。使用 Python API 时如何将以下页面中的 MatplotLib 颜色映射应用于 OpenCV 图像?这类似于将自定义颜色图应用于给定图像。
https://matplotlib.org/examples/color/colormaps_reference.html
对于 Python >= 2.7,cmapy以方便的方式打包此功能。安装它:
Python 2.7:
pip install cmapy
Run Code Online (Sandbox Code Playgroud)
Python 3.x:
pip3 install cmapy
Run Code Online (Sandbox Code Playgroud)
或者,对于 Anaconda(来自conda-forge):
conda install -c conda-forge cmapy
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
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()
Run Code Online (Sandbox Code Playgroud)
不同的颜色图给出了这样的东西:

在此处查看所有可用的颜色图。
免责声明:我写了 cmapy(因为我需要在另一个项目中使用此功能),并且在内部,它与其他答案几乎相同。
回答我自己的问题,因为我在 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)
Run Code Online (Sandbox Code Playgroud)
产生图像:
在 OpenCV 的最新版本(从 3.3 开始)中,有一个 重载applyColorMap,它允许您提供自定义颜色图(1 或 3 通道)。我已经修改了verify.human的代码以简单地生成适合与此函数一起使用的颜色图。
我已经采取了更多的机会来简化代码:
ScalarMappable.to_rgba当您将bytes参数设置为时,可以直接返回字节(范围 0-255)True。代码:
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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8207 次 |
| 最近记录: |