2017-02-04 39 views
6

Có cách nào thành ngữ hơn để hiển thị lưới hình ảnh như trong ví dụ dưới đây không?Cách đơn giản hơn để hiển thị hình ảnh trong một ô lưới có hình khối

import numpy as np 

def gallery(array, ncols=3): 
    nrows = np.math.ceil(len(array)/float(ncols)) 
    cell_w = array.shape[2] 
    cell_h = array.shape[1] 
    channels = array.shape[3] 
    result = np.zeros((cell_h*nrows, cell_w*ncols, channels), dtype=array.dtype) 
    for i in range(0, nrows): 
     for j in range(0, ncols): 
      result[i*cell_h:(i+1)*cell_h, j*cell_w:(j+1)*cell_w, :] = array[i*ncols+j] 
    return result 

Tôi đã thử sử dụng hstackreshape v.v. nhưng không thể có được hành vi phù hợp.

Tôi quan tâm đến việc sử dụng gọn gàng để thực hiện việc này vì có giới hạn về số lượng hình ảnh bạn có thể vẽ với các cuộc gọi matplotlib tới subplotimshow.

Nếu bạn cần dữ liệu mẫu để kiểm tra bạn có thể sử dụng webcam của bạn như vậy:

import cv2 
import matplotlib.pyplot as plt 
_, img = cv2.VideoCapture(0).read() 

plt.imshow(gallery(np.array([img]*6))) 
+0

Hình dạng 'mảng' là gì? – Divakar

+0

4 kích thước của nó (chỉ mục, hàng, cột, cường độ). Ở đâu cường độ = 3. –

+0

Tôi không thể chạy nó. Bạn có thể gửi một mẫu/thử nghiệm nó ra ở cuối của bạn? – Divakar

Trả lời

7
import numpy as np 
import matplotlib.pyplot as plt 

def gallery(array, ncols=3): 
    nindex, height, width, intensity = array.shape 
    nrows = nindex//ncols 
    assert nindex == nrows*ncols 
    # want result.shape = (height*nrows, width*ncols, intensity) 
    result = (array.reshape(nrows, ncols, height, width, intensity) 
       .swapaxes(1,2) 
       .reshape(height*nrows, width*ncols, intensity)) 
    return result 

def make_array(): 
    from PIL import Image 
    return np.array([np.asarray(Image.open('face.png').convert('RGB'))]*12) 

array = make_array() 
result = gallery(array) 
plt.imshow(result) 
plt.show() 

mang enter image description here


Chúng tôi có một loạt các hình dạng (nrows*ncols, height, weight, intensity). Chúng tôi muốn một mảng có hình dạng (height*nrows, width*ncols, intensity).

Vì vậy, ý tưởng ở đây là lần đầu tiên sử dụng reshape để tách ra trục đầu tiên vào hai trục, một trong những chiều dài nrows và một chiều dài ncols:

array.reshape(nrows, ncols, height, width, intensity) 

Điều này cho phép chúng ta sử dụng swapaxes(1,2) để sắp xếp lại các trục để hình dạng trở thành (nrows, height, ncols, weight, intensity). Lưu ý rằng địa điểm này nrows bên cạnh heightncols bên cạnh width.

Kể từ reshape does not change the raveled order dữ liệu, reshape(height*nrows, width*ncols, intensity) bây giờ tạo ra mảng mong muốn.

Đây là (theo tinh thần) giống như ý tưởng được sử dụng trong unblockshaped function.

3

Một cách khác là sử dụng view_as_blocks. Sau đó, bạn tránh trao đổi các trục bằng tay:

from skimage.util import view_as_blocks 

def refactor(im_in,ncols=3): 
    n,h,w,c = im_in.shape 
    dn = (-n)%ncols # trailing images 
    im_out = (empty((n+dn)*h*w*c,im_in.dtype) 
      .reshape(-1,w*ncols,c)) 
    view=view_as_blocks(im_out,(h,w,c)) 
    for k,im in enumerate(list(im_in) + dn*[0]): 
     view[k//ncols,k%ncols,0] = im 
    return im_out 
Các vấn đề liên quan