Saya memiliki serangkaian gambar satelit (5 band) dan ingin mengklasifikasikannya berdasarkan kmeans dalam R. Skrip saya berfungsi dengan baik (loop melalui gambar saya, mengonversi gambar ke data.frame, mengelompokkannya, dan mengubahnya kembali menjadi raster):
for (n in files) {
image <- stack(n)
image <- clip(image,subset)
###classify raster
image.df <- as.data.frame(image)
cluster.image <- kmeans(na.omit(image.df), 10, iter.max = 10, nstart = 25) ### kmeans, with 10 clusters
#add back NAs using the NAs in band 1 (identic NA positions in all bands), see http://stackoverflow.com/questions/12006366/add-back-nas-after-removing-them/12006502#12006502
image.df.factor <- rep(NA, length(image.df[,1]))
image.df.factor[!is.na(image.df[,1])] <- cluster.image$cluster
#create raster output
clusters <- raster(image) ## create an empty raster with same extent than "image"
clusters <- setValues(clusters, image.df.factor) ## fill the empty raster with the class results
plot(clusters)
}
Masalah saya adalah: Saya tidak dapat membandingkan hasil klasifikasi satu sama lain karena cluster assignents berbeda dari gambar ke gambar. Misalnya, "air" ada di cluster gambar pertama nomor 1, di 2 berikutnya dan di 10 ketiga, sehingga tidak mungkin untuk membandingkan hasil air antara tanggal.
Bagaimana saya bisa memperbaiki tugas cluster?
Dapatkah saya menentukan titik awal yang tetap untuk semua gambar (berharap bahwa air selalu terdeteksi pertama dan dengan demikian diklasifikasikan sebagai 1)?
Dan jika ya, bagaimana?
sumber
Untuk menerapkan pengelompokan pada tumpukan gambar, Anda tidak melakukannya satu per satu melainkan pada seluruh tumpukan gambar secara bersamaan. Kalau tidak, seperti yang ditunjukkan oleh @nmatton, statistiknya tidak masuk akal.
Namun, saya tidak setuju bahwa ini tidak mungkin, hanya memori intensif. Pada data satelit nyata ini akan menjadi masalah besar, dan mungkin tidak mungkin pada data resolusi tinggi, tetapi Anda dapat memproses dalam memori dengan memaksa raster Anda menjadi satu objek tunggal yang dapat diteruskan ke fungsi clustering. Anda perlu melacak nilai-nilai NA di seluruh raster karena mereka akan dihapus selama pengelompokan dan Anda akan perlu mengetahui posisi dalam raster sehingga Anda dapat menetapkan nilai-nilai cluster ke sel yang benar.
Kita dapat melangkah melalui satu pendekatan di sini. Mari kita tambahkan perpustakaan yang diperlukan dan beberapa contoh data (logo RGB R untuk memberi kita 3 band untuk bekerja dengan).
Pertama, Kita bisa memaksa objek tumpukan raster multi-band ke data.frame menggunakan getValues. Perhatikan bahwa saya menambahkan nilai NA di baris 1, kolom 3 sehingga saya bisa menggambarkan cara menangani tanpa data.
Di sini, kita bisa turun ke bisnis dan membuat indeks sel dari nilai-nilai non-NA yang akan digunakan untuk menetapkan hasil cluster.
Sekarang, kita membuat objek cluster dari nilai-nilai RGB 3 band dengan k = 4. Saya menggunakan metode clara K-Medoid karena bagus dengan data besar dan lebih baik dengan distribusi ganjil. Ini sangat mirip dengan K-Means.
Demi kesederhanaan, kita dapat membuat raster kosong dengan menarik salah satu band raster dari objek tumpukan raster asli kita dan menetapkannya nilai-nilai NA.
Akhirnya, menggunakan indeks, kami menetapkan nilai cluster ke sel yang sesuai di raster kosong dan plot hasilnya.
Untuk raster besar Anda mungkin ingin melihat ke dalam paket memori besar yang menulis matriks ke disk dan beroperasi pada blok dan ada fungsi k-means yang tersedia. Juga, perlu diingat bahwa ini bukan apa R dirancang untuk dan bahwa pemrosesan gambar atau perangkat lunak GIS mungkin lebih tepat. Saya tahu bahwa SAGA dan kotak alat Orfeo keduanya adalah perangkat lunak gratis yang memiliki pengelompokan k-means yang tersedia untuk tumpukan gambar. Bahkan ada perpustakaan RSAGA yang memungkinkan perangkat lunak dipanggil dari R.
sumber