Мониторинг окружающей среды, сельское хозяйство, городское планирование, борьба со стихийными бедствиями и исследования изменения климата — все они выиграли от анализа спутниковых изображений.
Мы можем получить важные сведения о характеристиках, изменениях и динамике нашей планеты, используя огромное количество данных, записанных спутниками наблюдения за Землей.
Python, универсальный и сильный язык программирования, предлагает богатую экосистему библиотек и инструментов для быстрой и эффективной обработки спутниковых изображений.
Использование анализ спутниковых снимков открывает мир возможностей. Это позволяет нам извлекать полезную информацию из спутниковых фотографий, такую как классификация земного покрова, оценка состояния растительности, отслеживание расширения городов и картографирование береговой линии.
Мы можем легко обрабатывать, отображать и анализировать спутниковые изображения, используя универсальность Python и такие модули, как rasterio, numpy и matplotlib.
Одним из основных преимуществ использования Python для анализа спутниковых изображений является широкий спектр модулей обработки геопространственных данных.
Rasterio, например, имеет простой интерфейс для чтения и изменения растровой информации, что делает его пригодным для работы с файлами спутниковых снимков.
Модуль numpy предоставляет сложные операции с массивами для выполнения быстрых вычислений и статистики по данным изображения. Matplotlib также позволяет нам создавать соответствующие визуальные эффекты, которые помогают интерпретировать и передавать аналитические результаты.
В следующих разделах мы рассмотрим реальные примеры и фрагменты кода, чтобы показать, как можно использовать Python для анализа спутниковых фотографий.
Мы рассмотрим, как открывать спутниковые фотографии, визуализировать данные изображений, извлекать метаданные, вычислять статистику каналов и проводить конкретный анализ, такой как Нормализованный разностный индекс растительности (NDVI).
Эти примеры помогут вам начать изучение интригующей темы анализа спутниковых изображений с помощью Python.
Во-первых, нам нужно импортировать некоторые библиотеки, которые помогут нам в нашей задаче.
import rasterio
import matplotlib.pyplot as plt
import numpy as np
1. Визуализация и открытие спутникового изображения
В этом разделе мы воспользуемся библиотекой Rasterio для доступа к спутниковому изображению, предоставленному параметром Satellite_image_path.
Файл изображения открывается с помощью метода rasterio.open(), и результирующий объект, Satellite_image, представляет открытое изображение.
Для этой задачи я использовал изображение по этой ссылке: https://unsplash.com/photos/JiuVoQd-ZLk и сохранил его на своем компьютере как «satellite.jpg».
# Open the satellite image using rasterio
satellite_image_path = 'satellite.jpg'
satellite_image = rasterio.open(satellite_image_path)
После открытия изображения мы читаем его как массив с помощью функции read() объекта Satellite_image. Значения пикселей для каждого диапазона спутниковых изображений сохраняются в массиве изображений.
# Read the image as an array
image_array = satellite_image.read()
Чтобы визуально оценить изображение со спутника, мы используем инструмент matplotlib.pyplot для создания фигуры размером 10×10 дюймов.
Массив изображений отображается с помощью метода imshow(). Операция транспонирования (1, 2, 0) используется для изменения размеров массива изображений в соответствии с порядком, ожидаемым функцией imshow().
Наконец, axis('off') скрывает метки осей, обеспечивая четкое представление спутникового изображения.
# Visualize the image
plt.figure(figsize=(10, 10))
plt.imshow(image_array.transpose(1, 2, 0))
plt.axis('off')
plt.show()
2. Извлечение метаданных
Мы извлекаем важные метаданные о спутниковом изображении после его открытия и отображения. Эта информация помогает нам понять качества изображения и предлагает контекст для будущих исследований.
image_width = satellite_image.width
image_height = satellite_image.height
image_crs = satellite_image.crs
image_count = satellite_image.count
print("Image Width:", image_width)
print("Image Height:", image_height)
print("Coordinate Reference System:", image_crs)
print("Number of Bands:", image_count)
Используя атрибуты width и height объекта Satellite_image, мы извлекаем ширину и высоту изображения. Свойство crs используется для получения системы координат изображения (CRS).
CRS предоставляет информацию о системе пространственной привязки изображения, что позволяет нам сопоставлять координаты изображения с реальными местами.
Наконец, мы используем атрибут count объекта Satellite_image для подсчета количества каналов на изображении. Эти данные имеют решающее значение для последующего анализа, поскольку они позволяют нам получить значения пикселей для каждой полосы в массиве изображений.
3. Расчет статистики полосы
В этой части мы вычисляем статистику для каждой полосы в массиве изображений. Цикл повторяется по каждой полосе, и для вычисления этой статистики используются функции min, max, mean и std библиотеки numpy.
Список словарей хранит статистику для каждого диапазона.
band_stats = []
for band in range(image_count):
band_data = image_array[band]
band_min = np.min(band_data)
band_max = np.max(band_data)
band_mean = np.mean(band_data)
band_std = np.std(band_data)
band_stats.append({'Band': band+1, 'Min': band_min, 'Max': band_max, 'Mean': band_mean, 'Std': band_std})
print("Band Statistics:")
for stats in band_stats:
print(stats)
Цикл циклически повторяется по каждой полосе, при этом переменная полоса представляет собой индекс полосы. Используя image_array[band], мы извлекаем значения пикселей из массива изображений для каждого канала.
Затем для текущей полосы используются функции np.min(), np.max(), np.mean() и np.std() для определения минимального, максимального, среднего и стандартного отклонения пикселя. ценности.
Расчетные данные для каждой полосы сохраняются в словаре с такими ключами, как «Полоса», «Мин.», «Макс.», «Среднее» и «Стандартное». Каждый словарь добавляется к списку статистики группы. Наконец, данные каждого диапазона выводятся на консоль.
4. Расчет NDVI (нормализованный разностный индекс растительности).
NDVI — популярная мера для измерения здоровья растений. В этом разделе мы проверяем, включает ли изображение хотя бы четыре полосы, необходимые для расчета NDVI.
red_band = None
nir_band = None
if image_count >= 4:
red_band = image_array[2] # assuming red band is at index 2
nir_band = image_array[3] # assuming near-infrared band is at index 3
if red_band is not None and nir_band is not None:
ndvi = (nir_band - red_band) / (nir_band + red_band)
# Visualize the NDVI
plt.figure(figsize=(10, 10))
plt.imshow(ndvi, cmap='RdYlGn')
plt.colorbar(label='NDVI')
plt.title('Normalized Difference Vegetation Index (NDVI)')
plt.axis('off')
plt.show()
else:
print("Error: The satellite image does not have the required bands for NDVI calculation.")
Для начала мы устанавливаем для переменных red_band и nir_band значение None. Затем используется переменная image_count, чтобы определить, содержит ли изображение по крайней мере четыре канала.
Если это так, мы делаем вывод, что красная полоса имеет индекс 2, а полоса ближнего инфракрасного диапазона (NIR) — индекс 3. Соответствующие полосы из массива изображений назначаются переменным red_band и nir_band.
Если доступны и красный, и БИК-диапазон, NDVI рассчитывается по формуле (БИК – красный) / (БИК + красный). Полученные числа NDVI указывают индекс растительности для каждого пикселя изображения.
Затем мы видим NDVI, создавая новую фигуру и отображая массив NDVI с помощью imshow(). Метод colorbar() добавляет на график цветную полосу, предоставляя значениям NDVI визуальную ссылку.
Чтобы полностью сосредоточиться на отображении NDVI, мы дополнительно указываем заголовок для графика и удаляем метки осей с помощью оси («выкл.»). Наконец, график отображается с помощью plt.show().
На консоль записывается сообщение об ошибке, если в изображении отсутствуют необходимые каналы для расчета NDVI (т. е. менее четырех каналов).
5. Завершение спутникового изображения
Рекомендуется использовать функцию close() для закрытия файла изображения со спутника после проведения анализа и просмотра. Это освобождает любые системные ресурсы, связанные с файлом изображения.
satellite_image.close()
Вот мое решение:
Это оно!
Заключительные замечания
Роль Python в изучении этих массивных наборов данных становится все более важной по мере увеличения доступности и разрешения спутниковых изображений.
Возможность использовать Python для доступа, обработки, анализа и отображения спутниковых изображений открывает путь для творческих приложений и идей, которые могут привести к хорошим изменениям и лучшему познанию нашего мира.
Не забудьте изучить большой выбор ресурсов, руководств и библиотек, доступных для расширения ваших знаний и способностей, когда вы продолжите свое приключение в анализе спутниковых изображений с использованием Python.
Продолжайте интересоваться, исследовать и использовать возможности Python для раскрытия тайн, скрытых в спутниковых снимках.
Оставьте комментарий