2013-09-25 37 views
20

Tôi đang sử dụng Pillow and numpy, nhưng có vấn đề với việc chuyển đổi giữa đối tượng Pillow Image và mảng numpy.Chuyển đổi giữa đối tượng Pillow Image và thay đổi mảng numpy kích thước

khi tôi thực thi mã sau, kết quả là lạ.

im = Image.open(os.path.join(self.img_path, ifname)) 
print im.size 
in_data = np.asarray(im, dtype=np.uint8) 
print in_data.shape 

kết quả là

(1024, 768) 
(768, 1024) 

Tại sao chiều được thay đổi?

Trả lời

16

im lẽ cột lớn mảng trong khi ở NumPy là hàng-lớn

làm in_data = in_data.T để transpose mảng python

lẽ nên kiểm tra in_data với matplotlib 's imshow để đảm bảo hình ảnh có vẻ đúng.

Nhưng bạn có biết rằng matplotlib đi kèm với các chức năng tải riêng của nó, cung cấp cho bạn các mảng gọn gàng trực tiếp? Xem: http://matplotlib.org/users/image_tutorial.html

+0

'np.asarray (im, order = 'F')' cũng có thể [https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.asarray.html # numpy.asarray) –

5

Nếu hình ảnh của bạn là tông màu xám làm:

in_data = in_data.T 

nhưng nếu bạn đang làm việc với RBG hình ảnh mà bạn muốn chắc chắn hoạt động chuyển vị của bạn là cùng chỉ có hai trục:

in_data = np.transpose(in_data, (1,0,2)) 
0

thực sự điều này là bởi vì hầu hết các thư viện hình ảnh cung cấp cho bạn những hình ảnh được transpozed so với mảng numpy. đây là (tôi nghĩ) bởi vì bạn viết từng tệp hình ảnh, vì vậy chỉ số đầu tiên (giả sử là x) là số dòng (vì vậy x là trục thẳng đứng) và chỉ mục thứ hai (y) là pixel tiếp theo line (vì vậy y là trục ngang), điều này chống lại tọa độ hàng ngày của chúng ta.

Nếu bạn muốn xử lý nó một cách chính xác bạn cần phải nhớ để viết:

image = library.LoadImage(path) 
array = (library.FromImageToNumpyArray(image)).T 

và hậu quả là:

image = library.FromNumpyArrayToImage(array.T) 
library.WriteImage(image, path) 

nào cũng làm việc cho hình ảnh 3D. Nhưng tôi không hứa hẹn điều này là trường hợp cho tất cả các thư viện hình ảnh - chỉ là những tôi làm việc với.

Các vấn đề liên quan