Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将MatplotLib或自定义颜色映射应用于OpenCV图像_Python_Opencv_Matplotlib_Visualization - Fatal编程技术网

Python 将MatplotLib或自定义颜色映射应用于OpenCV图像

Python 将MatplotLib或自定义颜色映射应用于OpenCV图像,python,opencv,matplotlib,visualization,Python,Opencv,Matplotlib,Visualization,OpenCV的颜色贴图数量有限。MatplotLib有更多的颜色贴图,但将这些颜色贴图应用于给定的OpenCV图像并不简单。在使用Python API时,如何将下面页面中的MatplotLib颜色映射应用于OpenCV图像?这类似于对给定图像应用自定义颜色贴图 回答我自己的问题,因为我没有找到关于StackOverflow的简单解决方案: def apply_custom_colormap(image_gray, cmap=plt.get_cmap('seismic')): asser

OpenCV的颜色贴图数量有限。MatplotLib有更多的颜色贴图,但将这些颜色贴图应用于给定的OpenCV图像并不简单。在使用Python API时,如何将下面页面中的MatplotLib颜色映射应用于OpenCV图像?这类似于对给定图像应用自定义颜色贴图


回答我自己的问题,因为我没有找到关于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)
生成图像:


在OpenCV的最新版本(从3.3开始)中,有一个重载,允许您提供自定义颜色映射(1或3通道)。我修改了的代码,只生成了一个适合此函数使用的颜色映射

我还利用了一些机会来简化代码:

  • bytes
    参数设置为
    True
    时,可以直接返回字节(范围0-255)
  • 我们可以使用负步长的数组索引来删除alpha通道,并在一步中从RGB切换到BGR
代码:

对于Python>=2.7,以方便的方式打包此功能。安装时请使用:

Python 2.7:

pip install cmapy
Python3.x:

pip3 install 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()
不同的颜色贴图提供如下内容:

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(因为我需要在另一个项目中使用此功能),在内部,它的功能与其他答案基本相同。

到目前为止,这是最简单的方法。我花了很长时间试图用LUT在cv2中定义我自己的颜色映射,但一无所获。然后我切换到MatplotLib的cmaps和cmapy,几乎立刻就完成了。我真的无法推荐这一点。通过指出彩色地图应该有(256,1,3)的形状来拯救我的一天!
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()