Hiển thị hình ảnh dưới dạng thang độ xám bằng matplotlib


231

Tôi đang cố gắng hiển thị hình ảnh thang độ xám bằ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 một bản đồ màu. Tôi cần thang độ 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.

Tôi đọc trong ảnh và chuyển đổi sang thang độ xám bằng PIL's Image.open (). Convert ("L")

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

Sau đó, tôi chuyển đổi hình ảnh thành ma trận để tôi có thể dễ dàng thực hiện một số xử lý hình ảnh bằng cách 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 là thang độ xám).

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

Câu trả lời:


368

Đoạn mã sau sẽ tải một hình ảnh từ một tệp image.pngvà sẽ hiển thị nó dưới dạng thang độ 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', vmin=0, vmax=255)
plt.show()

Nếu bạn muốn hiển thị thang độ xám ngược, hãy chuyển cmap sang cmap='gray_r'.


4
@jay: Mỗi chuỗi tài liệu này , "Lưu ý rằng bất kỳ bản đồ màu nào được liệt kê ở đây có thể được đảo ngược bằng cách nối thêm _r."
unutbu

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


17

import matplotlib.pyplot as plt

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

plt.gray()

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

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

Bạn đang sử dụng thư viện nào cho gray()hay grey()?
SherylHohman

@SherylHohman, đó là gray... màu xám là cách đánh vần chuẩn của người Mỹ và màu xám là cách viết của người Anh cho cùng một màu.
Đám mây Cho

12

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'))

11

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 chia tỷ lệ 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 khác. Nhưng nếu bạn có phạm vi hình ảnh giá trị pixel hẹp, giả sử 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ị hình ảnh màu xám là

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

Hãy xem một ví dụ:

đây là hình ảnh gốc : nguyên bản

đây là sử dụng cài đặt định mức mặc định, không có gì: sai pic

đây là sử dụng cài đặt NoNorm, đó là NoNorm (): đúng pic


9

thử cái này:

import pylab
from scipy import misc

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

Không có pylab.grey(), có lẽ nó đã được gỡ bỏ?
Lyndon White

4

Sử dụng không nội suy và đặt thành màu xám.

import matplotlib.pyplot as plt
plt.imshow(img[:,:,1], cmap='gray',interpolation='none')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.