Đôi khi dữ liệu Landsat được tải xuống theo từng băng tần riêng lẻ thay vì một tệp duy nhất. Bài viết này đề cập đến cách xử lý dữ liệu Landsat bằng Python với mỗi băng tần trong cảnh vệ tinh Landsat thường được lưu trữ trong một tệp .tif riêng lẻ. Kể từ năm 1972, các vệ tinh Landsat đã liên tục thu được các hình ảnh không gian của bề mặt Trái đất, cung cấp dữ liệu liên tục để giúp các nhà quản lý đất đai và các nhà hoạch định chính sách đưa ra quyết định sáng suốt về tài nguyên thiên nhiên và môi trường của chúng ta. Lịch sử 40 năm của các vệ tinh Landsat. Nguồn: USGS - USGS Landsat Timeline Dữ liệu Landsat là dữ liệu quang phổ và được thu thập bằng cách sử dụng các cảm biến gắn trên vệ tinh trong không gian quay quanh trái đất. Các dải phổ và độ phân giải không gian liên quan của 9 dải đầu tiên trong cảm biến Landsat 8 được liệt kê trong bảng bên dưới. Band Wavelength range (nanometers) Spatial Resolution (m) Spectral Width (nm) Units Data Type Fill Value (no data) Range Valid Range Scale Factor Band 1 - Coastal aerosol 430 - 450 30 2.0 Reflectance 16-bit signed integer (int16) -9999 -2000 to 16000 0 to 10000 0.0001 Band 2 - Blue 450 - 510 30 6.0 Reflectance 16-bit signed integer (int16) -9999 -2000 to 16000 0 to 10000 0.0001 Band 3 - Green 530 - 590 30 6.0 Reflectance 16-bit signed integer (int16) -9999 -2000 to 16000 0 to 10000 0.0001 Band 4 - Red 640 - 670 30 0.03 Reflectance 16-bit signed integer (int16) -9999 -2000 to 16000 0 to 10000 0.0001 Band 5 - Near Infrared (NIR) 850 - 880 30 3.0 Reflectance 16-bit signed integer (int16) -9999 -2000 to 16000 0 to 10000 0.0001 Band 6 - SWIR 1 1570 - 1650 30 8.0 Reflectance 16-bit signed integer (int16) -9999 -2000 to 16000 0 to 10000 0.0001 Band 7 - SWIR 2 2110 - 2290 30 18 Reflectance 16-bit signed integer (int16) -9999 -2000 to 16000 0 to 10000 0.0001 Có các dải được thu thập bổ sung không được phân phối trong sản phẩm phản xạ bề mặt Landsat 8, chẳng hạn như dải toàn sắc, cung cấp độ phân giải tốt hơn, hình ảnh thang màu xám của bề mặt được sử dụng trong quy trình đánh giá chất lượng của dữ liệu. Band Wavelength range (nanometers) Spatial Resolution (m) Spectral Width (nm) Band 8 - Panchromatic 500 - 680 15 18 Band 9 - Cirrus 1360 - 1380 30 2.0 Khi xử lý dữ liệu Landsat, điều quan trọng là phải hiểu cả siêu dữ liệu và quy ước đặt tên tệp. Siêu dữ liệu cho chúng ta biết dữ liệu được xử lý như thế nào, dữ liệu đến từ đâu và chúng được cấu trúc như thế nào. Tên tệp cho bạn biết cảm biến nào đã thu thập dữ liệu, ngày thu thập dữ liệu, v.v. Trước khi xử lý chúng ta nên kiểm tra kỹ xem đang làm việc với cảm biến hay không và khoảng thời gian chúng ta cần xử lý, có thông tin này trong tên tệp giúp bạn dễ dàng theo dõi hơn khi xử lý dữ liệu của mình. Bước đầu tiên của việc xử lý dữ liệu Landsat bằng Python, chúng ta cần tạo tệp lệnh gọi các hàm cần thiết, xác định thư mục làm việc và tải dữ liệu cần sử dụng theo yêu cầu (ví dụ với dữ liệu LC080340322016072301T1-SC20180214145802): import os from glob import glob import matplotlib.pyplot as plt import numpy as np import geopandas as gpd import xarray as xr import rioxarray as rxr import earthpy as et import earthpy.spatial as es import earthpy.plot as ep # Cài đặt thư mục làm việc và tải dữ liệu data = et.data.get_data("cold-springs-fire") os.chdir(os.path.join(et.io.HOME, "earth-analytics", "data")) # Tạo thư mục chứa dữ liệu được tải về landsat_post_fire_path = os.path.join("cold-springs-fire", "landsat_collect", "LC080340322016072301T1-SC20180214145802", "crop") # Tạo danh sách các tập tin dữ liệu tif post_fire_paths = glob(os.path.join(landsat_post_fire_path, "*band*.tif")) # Sắp xếp dữ liệu để đảm bảo các dải phổ theo đúng thứ tự post_fire_paths.sort() post_fire_paths Tiếp theo, mở một băng tần từ cảnh Landsat đã được tải. Đoạn mã dưới đây sử dụng phương thức .squeeze() để đảm bảo rằng đối tượng xarray đầu ra chỉ có 2 chiều. # Mở một dải phổ không nén band_1 = rxr.open_rasterio(post_fire_paths[0], masked=True) band_1.shape band_1 = rxr.open_rasterio(post_fire_paths[0], masked=True).squeeze() band_1.shape # Thể hiện dữ liệu để xem xét f, ax=plt.subplots() band_1.plot.imshow(ax=ax, cmap="Greys_r") ax.set_axis_off() ax.set_title("Plot of Band 1") plt.show() Tiếp theo chúng ta sử dụng một hàm có tên open_clean_bands để mở một tệp tif và trả về một đối tượng xarray. def open_clean_bands(band_path): """A function that opens a Landsat band as an (rio)xarray object Parameters ---------- band_path : list A list of paths to the tif files that you wish to combine. Returns ------- An single xarray object with the Landsat band data. """ return rxr.open_rasterio(band_path, masked=True).squeeze() Mã bên dưới lấy từng dải mà bạn đã mở và xếp nó thành một mảng đầu ra mới. LƯU Ý: phương pháp này chỉ hiệu quả nếu bạn muốn xử lý TẤT CẢ các băng tần trong dữ liệu. Với kích thước của dữ liệu Landsat, chúng ta có thể muốn loại bỏ bớt các dải phổ không cần thiết và nếu khu vực được quan tâm nhỏ hơn toàn bộ cảnh ảnh, chúng ta cũng có thể cắt bỏ bớt dữ liệu. all_bands = [] for i, aband in enumerate(post_fire_paths): all_bands.append(open_clean_bands(aband)) all_bands[i]["band"]=i+1 landsat_post_fire_xr = xr.concat(all_bands, dim="band") landsat_post_fire_xr landsat_post_fire_xr.plot.imshow(col="band", col_wrap=3, cmap="Greys_r") plt.show() Và kết quả được thể hiện như hình bên dưới. Từng băng Landsat 8 riêng lẻ được thu thập. Hình ảnh này là của Vụ cháy Cold Springs ngay sau đám cháy. Chúng ta cũng có thể vẽ các hình ảnh tổng hợp màu 3 dải cho Landsat bằng cách sử dụng hàm Earthpy ep.plot_rgb(). Tham khảo các dải vệ tinh Landsat trong bảng ở đầu trang này để tìm ra các dải màu đỏ, lục và lam. Hoặc đọc bài kết hợp băng tần Landsat 8 của ESRI. ep.plot_rgb(landsat_post_fire_xr.values, rgb=[3, 2, 1], title="RGB Composite Image\n Post Fire Landsat Data") plt.show() Hình ảnh Landsat 8 với 3 băng tần RGB. Chúng ta cũng có thể sử dụng đối số được tích hợp trong hàm Earthpyplot_rgb() để điều chỉnh độ sáng của sản phẩm. Khi phạm vi giá trị độ sáng pixel gần bằng 0, hình ảnh tối hơn sẽ được hiển thị theo mặc định, chúng ta có thể sử dụng các giá trị để mở rộng đến toàn bộ phạm vi giá trị tiềm năng 0-255 nhằm tăng độ tương phản hình ảnh. Dữ liệu Landsat với 3 dải màu RGB được điều chỉnh độ sáng và độ tương phản. Chúng ta cũng có thể tạo biểu đồ để xem phân bổ giá trị pixel trong dải rgb được vẽ ở trên bằng đoạn mã lệnh sau. # Plot all band histograms using earthpy band_titles = ["Band 1", "Blue", "Green", "Red", "NIR", "Band 6", "Band7"] ep.hist(landsat_post_fire_xr.values, title=band_titles) plt.show() Biểu đồ Landsat 8 cho mỗi dải.