Reklasyfikacja rastra w R
Często w przetwarzaniu obrazów chcemy przypisać konkretnemu zakresowi wartości rastra jedną niepowtarzalną liczbę, na przykład przy tworzeniu różnego rodzaju masek. W teledetekcji taka metoda zamiany wartości pikseli na klasy nazywa się klasyfikacją progową. Przykładem takiego opracowania jest maska wód z zobrazowania satelitarnego, gdzie piksele reprezentujące zbiorniki przyjmują wartość 1. Pozostałe mają wartości 0.
Jak to zrobić w R? Nic prostszego. Najpierw wczytujemy zobrazowanie korzystając z funkcji raster w bibliotece raster. Ja skorzystam z zobrazowanie satelity Sentinel pozyskanego w kanale 8 (podczerwonym). Wyświetlamy wczytane zobrazowanie:
1 |
plot(b8,col=grey.colors(255)) |

W programie GISowym zwektoryzowałem wcześniej cztery obszary, gdzie występują zbiorniki wodne. Wykorzystam tą warstwę do określenia wartości progowej dla maski. Wczytujemy utworzoną warstwę używając funkcji readOGR. Korzystając z funkcji extract odczytujemy wartości pikseli dla obszarów ze zbiornikami wodnymi i zapisujemy je do zmiennej ext:
1 |
ext = extract(b8, obszary) |
Zmienna ext zawiera listę czterech wektorów z wartościami pikseli odczytanych dla poszczególnych obszarów:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
ext [[1]] [1] 274 274 276 273 266 267 269 266 275 260 273 270 266 267 266 270 272 [18] 258 262 266 259 259 253 260 274 267 267 267 268 265 266 264 258 265 … [[2]] [1] 264 262 261 256 258 264 261 256 256 260 262 255 258 256 256 256 256 [18] 258 258 259 261 257 257 256 257 256 256 256 256 256 256 257 259 256 … [[3]] … [[4]] … |
Funkcja unlist zamieni listę na jeden wektor zawierający wartości pikseli dla wszystkich obszarów:
1 2 3 4 5 6 7 8 9 |
ext = unlist(ext) ext [1] 290 296 290 288 290 286 281 276 274 276 283 285 282 281 274 268 [17] 260 268 276 275 282 281 277 270 269 264 263 264 273 270 270 275 … |
Policzmy średnią z wartości w ext:
1 |
avg = mean(ext) |
Wartość średnia będzie naszym progiem. Reklasyfikujmy piksele obrazu zgodnie z założeniem, że wszystkie wartości poniżej średniej będą miały wartość 1. Pozostałe przyjmują wartość 0. Skorzystamy z funkcji reclassify. Dla funkcji tej musimy zdefiniować raster, który będziemy reklasyfikować oraz wektor zmiany wartości, który ma postać:
c(próg_lewy, próg_prawy, nowa_wartość, próg_lewy, próg_prawy, nowa_wartość, …)
Progami może być wartość nieskończona definiowana jako -Inf i Inf. Ostatecznie naszą maskę tworzymy używając wyrażenia:
1 |
mask = reclassify(b8,c(-Inf,avg,1,avg,Inf,0)) |
Wyświetlamy wynik:
1 |
plot(mask) |

Otrzymaliśmy maskę zbiorników wodnych na podstawie zobrazowania satelitarnego wykonanego w bliskiej podczerwieni. Narzędziem możemy tworzyć dowolne maski różnego rodzaju danych rastrowych.