2011-10-05 28 views
14

Tôi có một số (27) hình ảnh được trình bày trong mảng 2D mà tôi đang xem với imshow(). Tôi cần phải phóng to trên cùng một vị trí chính xác trong mọi hình ảnh. Tôi biết tôi có thể tự zoom, nhưng điều này là tẻ nhạt và không đủ chính xác. Có cách nào để lập trình chỉ định một phần cụ thể của hình ảnh để hiển thị thay vì toàn bộ nội dung không?Chức năng zoom Matplotlib imshow?

Trả lời

11

Bạn có thể sử dụng plt.xlimplt.ylim để thiết lập khu vực này có thể vẽ:

import matplotlib.pyplot as plt 
import numpy as np 

data=np.arange(9).reshape((3,3)) 
plt.imshow(data) 
plt.xlim(0.5, 1.5) 
plt.ylim(0.5,1.5) 
plt.show() 
+0

Cảm ơn! Tôi nhận ra tôi cũng có thể cắt các mảng trước khi hiển thị, nhưng phương pháp của bạn bảo tồn phần còn lại của mảng. – Andruf

+0

Trong phần giới thiệu tuyệt vời * [Bắt đầu với Python cho khoa học] (http://scipy-lectures.github.io/) *, đây là phần matplotlib, * [1.4. Matplotlib: vẽ đồ thị, 1.4.2.4. Đặt giới hạn] (http://scipy-lectures.github.io/intro/matplotlib/matplotlib.html#setting-limits) *. –

3

Nếu bạn không cần phần còn lại của hình ảnh của bạn, bạn có thể xác định một chức năng mà cắt hình ảnh tại tọa độ bạn muốn và sau đó hiển thị hình ảnh đã cắt.

Lưu ý: ở đây 'x' và 'y' là hình ảnh x và y (trục ngang và trục dọc trên hình ảnh tương ứng), có nghĩa là nó được đảo ngược so với x thực (hàng) và y (cột)) của mảng NumPy.

import scipy as sp 
import numpy as np 
import matplotlib.pyplot as plt 

def crop(image, x1, x2, y1, y2): 
    """ 
    Return the cropped image at the x1, x2, y1, y2 coordinates 
    """ 
    if x2 == -1: 
     x2=image.shape[1]-1 
    if y2 == -1: 
     y2=image.shape[0]-1 

    mask = np.zeros(image.shape) 
    mask[y1:y2+1, x1:x2+1]=1 
    m = mask>0 

    return image[m].reshape((y2+1-y1, x2+1-x1)) 

image = sp.lena() 
image_cropped = crop(image, 240, 290, 255, 272) 

fig = plt.figure() 
ax1 = fig.add_subplot(121) 
ax2 = fig.add_subplot(122) 

ax1.imshow(image) 
ax2.imshow(image_cropped) 

plt.show() 
Các vấn đề liên quan