Tách hình ảnh .tif thành nhiều ô? [đóng cửa]


13

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?


Anup, github.com/mapbox/rasterio sẽ cung cấp cho bạn (các) mảng dữ liệu đầu vào của bạn. Bạn có thể phân tách bằng cách sử dụng các phương thức numpy o scipy và lưu từng phần vào một tệp mới một cách dễ dàng. Giải pháp như vậy có đủ điều kiện? Nếu vậy, bạn cần nói cách xử lý "các bit không đồng đều" (71680 không chia hết cho 20000).
bugmenot123

Câu trả lời:


23

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).


Giải pháp sử dụng QGIS

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):

  1. Tải raster trong Bảng điều khiển Lớp ;
  2. Nhấp chuột phải vào nó và chọn Save As...;
  3. Kiểm tra Create VRTtùy chọn;
  4. Chọn thư mục lưu kết quả đầu ra của bạn;
  5. Đặt phạm vi (nếu bạn muốn làm việc trên toàn bộ raster, đừng sửa đổi bất cứ điều gì);
  6. Chọn nếu sử dụng độ phân giải hiện tại (tôi đề nghị để mặc định như mặc định);
  7. Đặt số lượng cột và hàng tối đa (trong trường hợp của bạn, nó phải là 20000 cột và 2000 hàng);
  8. Nhấn OKnút.

nhập mô tả hình ảnh ở đây

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):

nhập mô tả hình ảnh ở đây

sẽ tạo ra 100 ô trong đường dẫn được chỉ định ở bước 4:

nhập mô tả hình ảnh ở đây

Đang tải chúng trong QGIS, chúng trông như thế này:

nhập mô tả hình ảnh ở đâ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).


Giải pháp sử dụng Python (GDAL)

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.


2
Chỉ cần một bình luận nhanh chóng mà các ví dụ về cách QGIS làm cho chúng trông lạ chỉ vì phong cách phù hợp với bản thân với sự phân bố của các giá trị cho mỗi hình ảnh . Dữ liệu hoàn toàn ổn :)
bugmenot123

Cảm ơn, trước hết cho câu trả lời của bạn thực sự hữu ích, nhưng tôi muốn đạt được kết quả tương tự bằng cách sử dụng python? Bạn có thể giúp tôi về điều đó không bởi vì nó nhiều thủ công hơn là lập trình như vậy.
Anup Panwar

@ bugmenot123 Cảm ơn, tôi chỉnh sửa câu trả lời với nhận xét hữu ích của bạn.
mgri

@Anup Panwar, nếu tôi tìm thấy giải pháp với PyQGIS, tôi sẽ chỉnh sửa câu trả lời của mình! =)
mgri

@HowToInQGIS Cảm ơn, nếu không, nếu bạn muốn một cách trong python cũng sẽ giúp :)
Anup Panwar

5

Đừ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.


2

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


2

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.