2014-09-02 21 views
6

Próbuję nauczyć OpenCV użyciem Pythona i natknąłem tego kodu poniżej:Matplotlib: Jaka jest funkcja cmap w imshow?

import cv2 
import numpy as np 
from matplotlib import pyplot as plt 

BLUE = [255,0,0] 

img1 = cv2.imread('opencv_logo.png') 
replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE) 
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT) 
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101) 
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP) 
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE) 

plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL') 
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE') 
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT') 

plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101') 
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP') 
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT') 

plt.show() 

źródło: http://docs.opencv.org/master/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html#exercises

Co plt.imshow (img1, 'szary') zrobić? Próbowałem przeszukać Google i wszystko co mogłem zrozumieć, to że "szary" argument był mapą kolorów. Ale mój obraz (pic znajduje się na stronie, patrz link) nie jest wyświetlany w skali szarości. Próbowałem usunąć drugi argument. Kod był więc podobny do plt.imshow (img1). Wykonuje. Obraz pozostaje taki sam jak wcześniej. Więc co robi drugi argument "szary"? Czy ktoś może mi to wszystko wyjaśnić? Każda pomoc doceniona. Dzięki.

PS. Jestem zupełnie nowy w matplotlib

Odpowiedz

9

Kiedy img1 ma kształt (M,N,3) lub (M,N,4), wartości w img1 są interpretowane jako wartości RGB lub RGBA. W tym przypadku cmap jest ignorowany. Za the help(plt.imshow) docstring:

CMAP: ~matplotlib.colors.Colormap, opcjonalnie, domyślnie: Żaden

Jeśli None, domyślna wartość RC image.cmap. cmap jest ignorowana podczas X ma RGB (a) informacji

Jeśli jednak img się szereg kształcie (M,N), wówczas cmap steruje colormap wykorzystywane do wyświetlania wartości.


import numpy as np 
import matplotlib.pyplot as plt 
import mpl_toolkits.axes_grid1 as axes_grid1 
np.random.seed(1) 

data = np.random.randn(10, 10) 

fig = plt.figure() 
grid = axes_grid1.AxesGrid(
    fig, 111, nrows_ncols=(1, 2), axes_pad = 0.5, cbar_location = "right", 
    cbar_mode="each", cbar_size="15%", cbar_pad="5%",) 

im0 = grid[0].imshow(data, cmap='gray', interpolation='nearest') 
grid.cbar_axes[0].colorbar(im0) 

im1 = grid[1].imshow(data, cmap='jet', interpolation='nearest') 
grid.cbar_axes[1].colorbar(im1) 
plt.savefig('/tmp/test.png', bbox_inches='tight', pad_inches=0.0, dpi=200,) 

enter image description here

+0

Dzięki. Czy możesz wyjaśnić, do czego służy cmap? Dlaczego używamy map kolorów? – Clive

+1

Colormap to słownik, który mapuje liczby do kolorów. Matplotlib udostępnia wiele [wbudowanych map kolorów] (http://wiki.scipy.org/Cookbook/Matplotlib/Show_colormaps). Kiedy masz tablicę 2D, taką jak "dane" powyżej, wartości w każdym punkcie siatki są wartościami zmiennymi między 0 a 1. Barwna "colormap" odwzorowuje 0 na czarny i 1 na biały. Colormap 'jet' mapuje 0 na niebieski i 1 na czerwony. Zobacz link do wizualnego wyświetlania kolorów pomiędzy. – unutbu

+0

dziękuję bardzo – Clive