Tôi có một hình ảnh có kích thước 1GB (.tif), với chiều rộng và chiều cao 94000x71680. Tôi muốn chia hình ảnh này thành các viên gạch 20000X20000 để tôi có thể xử lý chúng.
Tôi có thể làm cái này như thế nào?
Tôi có một hình ảnh có kích thước 1GB (.tif), với chiều rộng và chiều cao 94000x71680. Tôi muốn chia hình ảnh này thành các viên gạch 20000X20000 để tôi có thể xử lý chúng.
Tôi có thể làm cái này như thế nào?
Câu trả lời:
Tôi đề xuất hai giải pháp: giải pháp thứ nhất sử dụng QGIS, giải pháp thứ hai sử dụng Python (GDAL).
Trong QGIS bạn có thể tạo khảm VRT.
Vui lòng làm theo quy trình này (xem hình ảnh bên dưới):
Save As...
;Create VRT
tùy chọn;OK
nút.Ví dụ: việc sử dụng các tham số trong hộp thoại trên trên raster mẫu này (các tham số tôi đặt được chọn ngẫu nhiên):
sẽ tạo ra 100 ô trong đường dẫn được chỉ định ở bước 4:
Đang tải chúng trong QGIS, chúng trông như thế này:
Như @ bugmenot123 đã nói chính xác trong các bình luận, kết quả có vẻ kỳ lạ chỉ vì phong cách của mỗi hình ảnh phù hợp với phân phối giá trị trên mỗi hình ảnh (nhưng dữ liệu hoàn toàn tốt).
Một cách khác để có được kết quả tương tự là sử dụng GDAL ( gdal_translate ).
Với tham chiếu đến ví dụ tương tự được mô tả ở trên, bạn có thể sử dụng tập lệnh này:
import os, gdal
in_path = 'C:/Users/Marco/Desktop/'
input_filename = 'dtm_5.tif'
out_path = 'C:/Users/Marco/Desktop/output_folder/'
output_filename = 'tile_'
tile_size_x = 50
tile_size_y = 70
ds = gdal.Open(in_path + input_filename)
band = ds.GetRasterBand(1)
xsize = band.XSize
ysize = band.YSize
for i in range(0, xsize, tile_size_x):
for j in range(0, ysize, tile_size_y):
com_string = "gdal_translate -of GTIFF -srcwin " + str(i)+ ", " + str(j) + ", " + str(tile_size_x) + ", " + str(tile_size_y) + " " + str(in_path) + str(input_filename) + " " + str(out_path) + str(output_filename) + str(i) + "_" + str(j) + ".tif"
os.system(com_string)
Bạn rõ ràng cần phải điều chỉnh các giá trị cho trường hợp cụ thể của bạn.
Đừng chia tay
Bạn gdalbuildvrt , bạn có thể tạo các ô ảo sẽ chỉ sử dụng một vài byte trên đĩa của bạn. Sau đó, bạn có thể sử dụng hầu hết các phần mềm sẽ lấy vrt của bạn làm đầu vào để thực hiện xử lý.
Ngoài ra, tôi thà tìm một công cụ có thể hoạt động với hình ảnh 1Gb hơn là phân tách và hợp nhất một hình ảnh. Chẳng hạn, OTB có hầu hết các khả năng xử lý hình ảnh tiêu chuẩn (và đôi khi là nâng cao) với hình ảnh lớn. Bạn có thể gói OTB cho Python hoặc chạy nó từ QGIS hoặc từ các dòng lệnh.
Sử dụng công cụ Split Raster , bạn có thể chia raster thành các ô dựa trên một vài phương pháp phân chia bao gồm kích thước của mỗi ô hoặc số ô .
Đồng thời xem phần Chia tách Raster trong ArcGIS
Một giải pháp khác sử dụng GDAL là công cụ gdal_retile.py :
mkdir image_tiles
gdal_retile.py -v -r bilinear -levels 1 -ps 20000 20000 -co "TILED=YES" -co "COMPRESS=JPEG" -targetDir image_tiles big_input_image.tif
Để biết thêm thông tin, hãy xem: http://www.gdal.org/gdal_retile.html