2013-02-16 35 views
5

Tôi có một số hình ảnh rất lớn. Tôi không muốn tải toàn bộ hình ảnh vào bộ nhớ, tôi chỉ muốn thực hiện một lần đi qua hình ảnh theo thứ tự hàng. Có thể thực hiện điều này bằng Python/scipy không?Bạn có thể lặp qua các pixel trong một hình ảnh mà không cần tải toàn bộ hình ảnh không?

CHỈNH SỬA: Tôi đang sử dụng .PNG, nhưng tôi có thể chuyển đổi chúng thành PPM, BMP hoặc một số thứ khác không bị mất.

+1

Trong nhiều trường hợp, có, nhưng nó phụ thuộc vào định dạng của hình ảnh và thư viện bạn đang sử dụng để đọc nó. Định dạng của bạn là gì? –

+0

Tôi đang sử dụng định dạng tệp .PNG. – nickponline

+1

TIFF sẽ làm cho nó đặc biệt dễ dàng, nhưng tôi không nghĩ rằng PIL hỗ trợ đọc TIFFs bởi các ban nhạc. – Jaime

Trả lời

2

GDAL (với ràng buộc Python) cung cấp một số trình điều khiển rất tốt cho việc này. Mặc dù nó là một gói không gian địa lý, nó hoạt động tốt với BMP và PNG chẳng hạn. Ví dụ này cho thấy cách tải hàng PNG theo hàng:

import gdal 

# only loads the dataset 
ds = gdal.Open('D:\\my_large_image.png') 

# read 1 row at the time 
for row in range(ds.RasterYSize): 
    row_data = ds.ReadAsArray(0,row,ds.RasterXSize,1) 

ds = None # this closes the file 

Nó mang lại cho bạn một mảng kết quả, sẵn sàng cho việc xử lý. Bạn có thể viết bất kỳ kết quả nào theo cách tương tự.

print type(row_data) 
<type 'numpy.ndarray'> 

print row_data.shape 
(3, 1, 763) 

print row_data 
[[[ 0 0 255 ..., 230 230 0]] 

[[ 0 0 252 ..., 232 233 0]] 

[[ 0 0 252 ..., 232 233 0]]] 

Cài đặt gói dành riêng cho việc đọc có thể hơi quá mức nếu PIL hoặc một thứ khác có thể thực hiện. Nhưng nó là một lựa chọn mạnh mẽ, tôi đã xử lý hình ảnh của 30000 * 30000 pixel như thế này.

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