【问题标题】:Can't display a normal image in matplotlib, it keeps displaying with the jet colormap无法在 matplotlib 中显示正常图像,它一直使用 jet 颜色图显示
【发布时间】:2023-12-20 23:19:01
【问题描述】:

我有显示图像 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 线显示为绿色。它不断返回喷气机:

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

【问题讨论】:

    标签: python opencv matplotlib rgb colormap


    【解决方案1】:

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

    可以考虑创建灰度图

    newimg = numpy.sum(img, 2)
    

    然后

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

    【讨论】:

    • 不,它仍然是彩色映射的。
    • 等等,我得到一个类型错误:TypeError: Layout of the output array img is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)
    • 可能是 CV 数据类型。您可以尝试通过newimg = np.array(img) 投射 img
    • 现在它们都是彩色映射的。为什么不能只显示图片?
    • 你是否同时使用了'np.array'和'np.sum'?
    【解决方案2】:

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

    对于 RGB 和 RGBA 图像,matplotlib 支持 float32 和 uint8 数据类型

    您要么需要这种格式,要么需要指定颜色图。似乎另一个问题是“cv2.polylines”返回图像,这意味着您不能分别设置线条和背景的颜色。解决这个问题的方法是使用相同大小的空白透明图像来绘制 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')
    

    对我来说返回,

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

    【讨论】: