2010-09-29 9 views
137

Tôi đang cố gắng hiển thị hình ảnh thang độ xám bằng cách sử dụng matplotlib.pyplot.imshow(). Vấn đề của tôi là hình ảnh thang độ xám được hiển thị dưới dạng bản đồ màu. Tôi cần màu xám vì tôi muốn vẽ lên trên cùng của hình ảnh với màu sắc.Hiển thị hình ảnh dưới dạng thang độ xám bằng cách sử dụng matplotlib

Tôi đọc trong hình ảnh và chuyển đổi sang dạng grayscale sử dụng PIL của Image.open(). Chuyển đổi ("L")

image = Image.open(file).convert("L")

Sau đó, tôi chuyển đổi hình ảnh vào một ma trận để tôi có thể dễ dàng làm một số xử lý ảnh sử dụng

matrix = scipy.misc.fromimage(image, 0)

Tuy nhiên, khi tôi làm

figure() 
matplotlib.pyplot.imshow(matrix) 
show()

nó hiển thị hình ảnh bằng cách sử dụng một bản đồ màu (tức là nó không phải màu xám).

Tôi đang làm gì sai ở đây?

Trả lời

213

Đoạn mã dưới đây sẽ được tải một hình ảnh từ một tập tin image.png và sẽ hiển thị nó như là màu xám.

import numpy as np 
import matplotlib.pyplot as plt 
from PIL import Image 

fname = 'image.png' 
image = Image.open(fname).convert("L") 
arr = np.asarray(image) 
plt.imshow(arr, cmap='gray') 
plt.show() 

Nếu bạn muốn hiển thị màu xám nghịch đảo, hãy chuyển cmap thành cmap='gray_r'.

+3

@jay: Mỗi [chuỗi tài liệu này] (http: // matplotlib.org/examples/color/colormaps_reference.html), "Lưu ý rằng bất kỳ bản đồ màu nào được liệt kê ở đây đều có thể được đảo ngược bằng cách thêm' _r'. " – unutbu

+13

Cảnh báo matplotlib điều chỉnh cường độ điểm ảnh nếu bạn không muốn sử dụng: 'plt.imshow (im_gray, cmap = 'xám', vmin = 0, vmax = 255)' – themadmax

19

Hãy thử sử dụng bản đồ màu xám?

Ví dụ: cái gì đó như

imshow(..., cmap=pyplot.cm.binary) 

Đối với một danh sách các colormaps, xem http://scipy-cookbook.readthedocs.org/items/Matplotlib_Show_colormaps.html

+1

Liên kết không hoạt động nữa, nó có tương tự như thế này không? http://scipy-cookbook.readthedocs.org/items/Matplotlib_Show_colormaps.html – Mark

+0

@Mark: Có, đó dường như là URL mới, đã cập nhật câu trả lời của tôi. Đối với phiên bản cũ, hãy xem https://web.archive.org/web/20101121120543/http://www.scipy.org/Cookbook/Matplotlib/Show_colormaps – janneb

7

thử điều này:

import pylab 
from scipy import misc 

pylab.imshow(misc.lena(),cmap=pylab.gray()) 
pylab.show() 
+0

không có 'pylab.grey()', có thể nó đã bị xóa? –

+9

Wow ... Lena được bao gồm trong scipy ... – wlnirvana

+1

không, không phải trong 0,18.0 nữa – IljaBek

10

import matplotlib.pyplot as plt

Bạn cũng có thể chạy một lần trong mã của bạn

plt.gray() 

này sẽ hiển thị các hình ảnh trong màu xám như mặc định

im = array(Image.open('I_am_batman.jpg').convert('L')) 
plt.imshow(im) 
plt.show() 
+2

nó hoạt động, nhưng cuộc gọi là 'màu xám()', phải không? –

+0

Bạn đang sử dụng thư viện nào cho 'gray()' hoặc 'gray()'? – SherylHohman

7

Tôi sẽ sử dụng phương thức get_cmap. Ví dụ:

import matplotlib.pyplot as plt 

plt.imshow(matrix, cmap=plt.get_cmap('gray')) 
+0

Điều này có vẻ đơn giản và hoạt động hoàn hảo. – arsho

0

@ câu trả lời của unutbu khá gần với câu trả lời đúng.

Theo mặc định, plt.imshow() sẽ cố gắng mở rộng dữ liệu mảng (MxN) của bạn thành 0.0 ~ 1.0. Và sau đó ánh xạ tới 0 ~ 255. Đối với hầu hết các hình ảnh được chụp tự nhiên, điều này là tốt, bạn sẽ không thấy sự khác biệt. Nhưng nếu bạn có phạm vi hẹp của hình ảnh có giá trị pixel, pixel tối thiểu là 156 và pixel tối đa là 234. Hình ảnh màu xám sẽ trông hoàn toàn sai. Cách đúng để hiển thị một hình ảnh trong màu xám là

from matplotlib.colors import NoNorm 
... 
plt.imshow(img,cmap='gray',norm=NoNorm()) 
... 

Chúng ta hãy xem một ví dụ:

này là hình ảnh origianl: original

này đang sử dụng thiết lập chuẩn mực defaul, đó là None: wrong pic

điều này đang sử dụng cài đặt NoNorm, là NoNorm(): right pic