2013-02-16 10 views
5

Mam bardzo duże obrazy. Nie chcę załadować całego obrazu do pamięci, chcę tylko wykonać pojedyncze przejście przez obraz w kolejności rzędów. Czy można to zrobić w Pythonie/scipy?Czy potrafisz przeglądać piksele w obrazie bez ładowania całego obrazu?

EDYCJA: Używam .PNG, ale mógłbym przekonwertować je na PPM, BMP lub coś innego bezstratnego.

+1

W wielu przypadkach tak, ale zależy to od formatu obrazu i biblioteki, której używasz do jej odczytania. W jakim formacie są twoje obrazy? –

+0

Używam formatu pliku .PNG. – nickponline

+1

TIFF sprawiłoby, że byłoby to szczególnie łatwe, ale nie sądzę, że PIL obsługuje czytanie TIFF-ów przez zespoły. – Jaime

Odpowiedz

2

GDAL (z powiązaniami w Pythonie) oferuje bardzo dobre sterowniki do tego. Mimo, że jest to pakiet geoprzestrzenny, działa na przykład z BMP i PNG. Ten przykład pokazuje, jak załadować PNG wiersz po wierszu:

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 

To daje tablicę NumPy w wyniku, więc gotowy na przetwórstwo. Możesz napisać dowolny wynik w podobny sposób.

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]]] 

Zainstalowanie pakietu przeznaczonego do odczytu może być nieco przesadzone, jeśli PIL lub coś innego może to zrobić. Ale jest to solidna opcja, mam przetworzone obrazy o wielkości 30000 * 30000 pikseli w ten sposób.

Powiązane problemy