Self-Organizing Maps for Sentinel 2 Image Segmentation using Python
A step-by-step guide to segmenting a Sentinel-2 image using Self-Organizing Maps (SOM) in Python
Self-Organizing Maps (SOMs) are a type of unsupervised artificial neural network that can be used for various applications, including image segmentation. In this article, we’ll explore how SOMs can be used for Sentinel-2 image segmentation using Python.
Sentinel-2 is a satellite-based Earth observation mission that provides high-resolution multispectral images with 10 spectral bands. These images can be used for various applications, including land cover mapping, crop monitoring, and environmental monitoring. Image segmentation is an important task in remote sensing that involves partitioning an image into several homogeneous regions based on their spectral properties. This can be achieved using various algorithms, including SOMs.
To get started, we’ll need to load the Sentinel 2 image into Python. We can use the
rasterio library to read the image and convert it to a
numpy array. Here's the code to load the image:
from rasterio.plot import show
# Open the image
with rasterio.open('Data/data/SENTINEL2A.tif') as src:
# Read the image data
img = src.read([3,2,1])
# Display the image
profile = src.profile
We’re reading the image using the
rasterio.open function and converting it to a
numpy array using the
astype method. This is important because SOMs require the input data to be normalized.
Next, we’ll need to reshape the image into a 2D array. We can use the
reshape method of
numpy arrays to achieve this. Here's the code:
import numpy as np
# Reshape the image into a 2D array
img = img.transpose(1, 2, 0)
h, w, bands = img.shape
data = np.reshape(img, (h*w, bands))
# Normalize the data
data = (data - np.mean(data, axis=0)) / np.std(data, axis=0)
We’re using the
shape attribute of the
numpy array to get the height, width, and number of bands of the image. We're then using the
reshape method to convert the image into a 2D array where each row corresponds to a pixel in the image and each column corresponds to a spectral band.