无法在 matplotlib 中显示正常图像,它一直使用 jet colormap 显示

Can't display a normal image in matplotlib, it keeps displaying with the jet colormap

我有显示图像 MISER 区域的代码:

import numpy as np
import cv2
import sys
import matplotlib.pyplot as plt

imp1 = sys.argv[1]
img1 = cv2.imread(imp1)

mser = cv2.MSER()
gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
vis = img1.copy()

regions = mser.detect(gray, None)
hulls = [cv2.convexHull(p.reshape(-1, 1, 2)) for p in regions]
cv2.polylines(vis, hulls, 1, (0, 255, 0))

def plot_stuff(img1, img1_name, img2, img2_name):
    fig,axes = plt.subplots(1,2,figsize=(15,6))


    axes[0].imshow(img1, cmap='Greys_r')
    axes[0].set_title(img1_name)


    axes[1].imshow(img2)
    axes[1].set_title(img2_name)

    fig.suptitle("All Images")
    plt.show()

plot_stuff(img1, 'Original', vis, 'MISER Regions')

它工作正常,除了它是蓝色的:

这就是我被困的地方。因为无论我做什么,我都无法将图像显示为灰色,将 MISER 线显示为绿色。它不断返回射流:

即使我只显示图像,它仍然 returns 喷射。为什么没有 RGB 颜色图?更好的是,为什么必须有一个颜色图,为什么它不能只显示正常图像?

imshow 文档说当图像有 RGB 信息时 cmap 被忽略。

可以考虑制作灰度图

newimg = numpy.sum(img, 2)

然后

ax.imshow(newimg, cmap='gray')

您的数据存储为 64 位 numpy 数组,来自 docs

For RGB and RGBA images, matplotlib supports float32 and uint8 data types

您要么需要这种格式,要么需要指定颜色图。似乎另一个问题是 'cv2.polylines' returns 图像,这意味着您不能单独设置线条和背景的颜色。解决这个问题的方法是使用相同大小的空白透明图像绘制 mser (MISER!?) 曲线,然后将它们绘制在同一轴上,

import numpy as np
import cv2
import sys
import matplotlib.pyplot as plt

imp1 = sys.argv[1]
img1 = cv2.imread(imp1)

mser = cv2.MSER()
gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
vis = np.zeros([img1.shape[0],img1.shape[1],4]) 

regions = mser.detect(gray, None)
hulls = [cv2.convexHull(p.reshape(-1, 1, 2)) for p in regions]
cv2.polylines(vis, hulls, 1, (0, 255, 0))
vis = np.array(vis, dtype=np.uint8)

#Copy green channel data to (alpha) transparent channel
vis[:,:,3] = vis[:,:,1]

def plot_stuff(img1, img1_name, img2, img2_name):
    fig,axes = plt.subplots(1,2,figsize=(15,6))

    print(img1.shape)
    axes[0].imshow(np.sum(img1,2), cmap='Greys_r')
    axes[0].set_title(img1_name)

    axes[1].imshow(np.sum(img1,2), cmap='Greys_r')
    axes[1].imshow(img2)
    axes[1].set_title(img2_name)

    fig.suptitle("All Images")
    plt.show()

plot_stuff(img1, 'Original', vis, 'MISER Regions')

对我来说 returns,

使用 matplotlib.version 1.4.3' 和 cv2.version'$Rev: 4557 $'