Не удается отобразить обычное изображение в matplotlib, оно продолжает отображаться с цветовой картой струи

У меня есть код, который отображает области 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 зелеными. Он продолжает возвращаться струей:

введите здесь описание изображения

Даже когда я показываю только изображение, оно все равно возвращает реактивный самолет. Почему нет цветовой карты RGB? А еще лучше, зачем вообще нужна цветовая карта, почему она не может просто показать обычное изображение?


person Rich    schedule 10.07.2016    source источник


Ответы (2)


Ваши данные хранятся в виде 64-битных массивов numpy из документов,

Для изображений 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.версия 1.4.3' и cv2.версия'$Rev: 4557 $'

person Ed Smith    schedule 11.07.2016

Документы imshow говорят, что cmap игнорируется, когда изображение содержит информацию RGB.

Вы можете рассмотреть возможность создания изображения уровня серого

newimg = numpy.sum(img, 2)

затем

ax.imshow(newimg, cmap='gray')
person Aguy    schedule 10.07.2016
comment
Нет, он по-прежнему раскрашен. - person Rich; 10.07.2016
comment
Подождите, и я получил ошибку типа: TypeError: Layout of the output array img is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels) - person Rich; 10.07.2016
comment
Может быть, это тип данных CV. Вы можете попробовать передать img с помощью newimg = np.array(img) - person Aguy; 10.07.2016
comment
Теперь они оба раскрашены. Почему нельзя просто показать изображение? - person Rich; 10.07.2016
comment
Вы использовали как «np.array», так и «np.sum»? - person Aguy; 10.07.2016
comment
Да: newimg = np.array(img1), newimg2 = np.sum(newimg, 2) - person Rich; 10.07.2016
comment
А потом: plot_stuff(newimg2, 'Original', vis, 'MISER Regions') - person Rich; 10.07.2016
comment
Я уже могу сделать исходное изображение серым, я хотел, чтобы выходное изображение было серым, но причины MISER все еще зеленые. Если установить axes[1].imshow(img2, cmap='Greys_r'), то все изображение будет серым: i.imgur.com/mXZ7bRx.png и я не вижу линий. - person Rich; 10.07.2016
comment
Исправление: я имел в виду axes[1].imshow(img2, cmap='Greys_r') - person Rich; 10.07.2016