🛰️ Uzaktan Algılama

Uydu Görüntüsü Sınıflandırması: K-Means ve ISODATA ile Arazi Örtüsü Analizi

📅 4 Temmuz 2026 ⏱️ 26 dk okuma 🛰️ Uzaktan Algılama & CBS

Uydu görüntülerini bitki örtüsü, su kütlesi, kentsel alan ve çıplak toprağa ayırmak — yani arazi örtüsü haritası üretmek — uzaktan algılamanın temel görevidir. Bu rehberde denetimsiz sınıflandırmanın iki en yaygın algoritmasını, K-Means ve ISODATA'yı hem teori hem uygulama boyutlarıyla ele alıyoruz. Python kodu ve QGIS SCP eklentisi ile gerçek bir iş akışını adım adım gösteriyoruz.

1. Arazi Örtüsü Sınıflandırması Nedir?

Arazi örtüsü (land cover), yeryüzünün fiziksel durumunu tanımlar: ormanlık, tarım alanı, yerleşim, su, çıplak toprak gibi kategoriler. Arazi kullanımı (land use) ise insan faaliyetini anlatır ve arazi örtüsünden farklıdır — aynı tarım alanı seralık, meyvelik veya tahıl tarlası olabilir.

Uydu görüntüsü sınıflandırması, her pikseli belirli bir arazi örtüsü kategorisine atar. Binlerce piksellik görüntülerde bunu elle yapmak imkansızdır — makine öğrenmesi algoritmaları devreye girer.

Uygulama Alanları

  • Orman izleme: Ormansızlaşma ve yeniden ormanlaşma tespiti (REDD+ projeleri)
  • Tarım: Ekim alanı tespiti, mahsul takibi, sulanmış alan belirleme
  • Kentsel yayılım: Yapılaşma artışı ve yeşil alan kaybı analizi
  • Su kaynakları: Göl ve rezervuar alanı değişimi, sulak alan haritalama
  • Afet: Yangın, sel ve deprem sonrası hasar tespiti
  • İklim değişikliği: Kar örtüsü ve buzul değişimi izleme

2. Denetimli ve Denetimsiz Sınıflandırma

Uydu görüntüsü sınıflandırmasında iki temel yaklaşım vardır:

Denetimli (Supervised)Denetimsiz (Unsupervised)
Nasıl çalışır?Araştırmacı eğitim alanları (training samples) seçer, algoritma bu örneklerden öğrenirAlgoritma pikselleri kendi başına gruplar; araştırmacı sonradan etiketler
AvantajSınıflar önceden biliniyor; doğruluk genellikle daha yüksekSaha bilgisi gerekmez; hızlı ön analiz için ideal
DezavantajEğitim verisi toplamak zahmetli ve özneldirKümeler sınıflarla bire-bir örtüşmeyebilir; etiketleme gerekir
AlgoritmalarRandom Forest, SVM, Maximum LikelihoodK-Means, ISODATA, Gaussian Mixture
Ne zaman?Saha veriniz varsa veya yüksek doğruluk şartsaHızlı keşif, büyük alan, saha verisi yoksa

Hibrit yaklaşım: Pratikte denetimsiz sınıflandırma ile başlayıp kümeleri keşfedebilir, sonra denetimli sınıflandırma için eğitim alanlarını bu kümelerden seçebilirsiniz. Bu iki yaklaşımı birleştirmenin en verimli yoludur.

3. Spektral Uzay: Pikseller Nasıl Gruplandırılır?

Çok bantlı bir uydu görüntüsünde her piksel birden fazla değere sahiptir: kırmızı banttan bir değer, yeşil banttan bir değer, yakın kızılötesi (NIR) banttan bir değer... Bu değerler, pikseli çok boyutlu bir spektral uzayda bir noktaya yerleştirir.

Benzer yüzey özelliklerine sahip pikseller (örneğin hepsi çimen olan pikseller) bu spektral uzayda birbirine yakın kümelenir. Denetimsiz sınıflandırma algoritmaları bu doğal kümeleri tespit eder.

Örnek: Sentinel-2'nin 4 bandı (B2-Mavi, B3-Yeşil, B4-Kırmızı, B8-NIR) kullanıldığında her piksel 4 boyutlu bir uzayda bir nokta haline gelir. Su pikselleri NIR'da çok düşük, mavi-yeşilde orta değerler alırken; sağlıklı bitki örtüsü NIR'da çok yüksek, kırmızıda çok düşük değerler alır. Bu ayrım kümelemeyi mümkün kılar.

Önemli Spektral İndeksler

Bantları doğrudan kullanmak yerine, indeksler hesaplayarak kümeleme kalitesini artırabilirsiniz:

  • NDVI (Normalized Difference Vegetation Index) = (NIR − Kırmızı) / (NIR + Kırmızı) → bitki yoğunluğu
  • NDWI (Normalized Difference Water Index) = (Yeşil − NIR) / (Yeşil + NIR) → su kütleleri
  • NDBI (Normalized Difference Built-up Index) = (SWIR − NIR) / (SWIR + NIR) → yapılı çevre
  • BSI (Bare Soil Index) = [(SWIR + Kırmızı) − (NIR + Mavi)] / [(SWIR + Kırmızı) + (NIR + Mavi)] → çıplak toprak

4. K-Means Algoritması: Adım Adım

K-Means, uzaktan algılamada en yaygın kullanılan denetimsiz sınıflandırma algoritmasıdır. Temel mantığı çok basittir: pikselleri K adet kümeye atayın, öyle ki her piksel en yakın küme merkezine ait olsun.

1
Başlangıç merkezleri seç K adet başlangıç küme merkezi belirlenir. Rastgele seçim veya K-Means++ (daha akıllı başlangıç) kullanılır.
2
Pikselleri ata Her piksel, spektral uzaydaki Öklid mesafesine göre en yakın merkeze atanır.
3
Merkezleri güncelle Her kümenin yeni merkezi, o kümedeki tüm piksellerin ortalama spektral değeri olarak hesaplanır.
4
Yakınsama kontrolü Merkezler artık değişmiyorsa veya maksimum iterasyon sayısına ulaşıldıysa dur. Değilse 2. adıma dön.
5
Kümeleri etiketle Algoritma "küme 1, küme 2..." der; araştırmacı bunları "orman, su, kentsel..." olarak yorumlar.

K-Means'in Parametreleri

  • K (küme sayısı): En kritik parametre. Sezgisel kural: hedef sınıf sayısının 2–3 katı. 5 sınıf hedefliyorsanız K = 10–15 ile başlayın.
  • Başlangıç yöntemi: random veya k-means++. K-Means++ yerel minimuma takılma riskini azaltır.
  • Maksimum iterasyon: 300 genellikle yeterlidir.
  • n_init: Farklı başlangıç noktalarından kaç kez çalıştırılsın? 10+ önerilir (en iyi sonucu seçer).

K-Means'in Sınırlılıkları

  • K önceden belirtilmek zorundadır.
  • Küre şeklinde olmayan kümeleri iyi yakalayamaz.
  • Aykırı değerlere (bulutlu pikseller!) duyarlıdır.
  • Yerel minimuma takılabilir — n_init arttırarak azaltılır.
  • Küme sayısı iterasyonlar sırasında değişmez.

5. ISODATA Algoritması: K-Means'ın Akıllı Versiyonu

ISODATA (Iterative Self-Organizing Data Analysis Technique), K-Means'i iki kritik özellikle genişletir: kümeleri bölebilir ve birleştirebilir. Bu, küme sayısının iterasyonlar sırasında değişmesini sağlar.

ISODATA'nın Ek Kuralları

KuralKoşulİşlem
Silme Bir kümedeki piksel sayısı minimum eşiğin (θ_N) altına düşerse Küme silinir, pikseller en yakın kümeye aktarılır
Birleştirme İki küme merkezi birbirine yeterince yakınsa (eşik: θ_C) İki küme tek kümede birleştirilir
Bölme Bir kümenin standart sapması θ_S'yi aşıyorsa ve küme yeterince büyükse Küme iki alt kümeye bölünür

ISODATA'nın Parametreleri

  • K₀: Başlangıç küme sayısı (K-Means'teki K gibi ama sabit değil)
  • K_min / K_max: İzin verilen minimum ve maksimum küme sayısı
  • θ_N: Minimum piksel sayısı eşiği (küme silme için)
  • θ_C: Birleştirme mesafesi eşiği
  • θ_S: Bölme standart sapma eşiği
  • Maksimum iterasyon sayısı

ISODATA ne zaman gerçekten fark yaratır? Çalışma alanınızda bazı sınıflar çok heterojen (örneğin orman hem ibreli hem yapraklı hem seyrek) ve bazıları çok küçük (dar bir nehir) ise ISODATA büyük kümeleri bölerek, küçük anlamsız kümeleri birleştirerek daha anlamlı sonuçlar verir. Homojen tarım arazilerinde ise K-Means ile fark az olur.

6. K-Means vs ISODATA: Hangisi, Ne Zaman?

KriterK-MeansISODATA
Küme sayısıSabit (K)Dinamik (K_min – K_max arası)
HızDaha hızlıDaha yavaş (ek kurallar nedeniyle)
Parametre sayısıAz (K, n_init)Çok (θ_N, θ_C, θ_S, K_min, K_max)
Heterojen görüntülerZayıfGüçlü
Homojen görüntülerYeterliAşırı parametre
QGIS SCP desteğiEvetEvet
Python (scikit-learn)Evet (sklearn.cluster.KMeans)Hayır (özel implementasyon gerekir)
Tercih edildiği alanHomojen tarım, hızlı ön analizOrman, kentsel, karmaşık peyzaj

7. Uydu Verisi Hazırlama: Landsat ve Sentinel-2

Veri Kaynakları (Ücretsiz)

  • Sentinel-2 (ESA): 10 m çözünürlük, 13 bant, 5 günde bir tekrar, Copernicus Open Access Hub veya Google Earth Engine üzerinden ücretsiz
  • Landsat 8/9 (USGS): 30 m çözünürlük, 11 bant, 16 günde bir tekrar, Earth Explorer üzerinden ücretsiz
  • MODIS (NASA): 250 m–1 km, günlük tekrar, büyük ölçekli analizler için

Ön İşleme Adımları

  • Atmosferik düzeltme: Ham DN değerleri → Yansıma (reflectance). Sentinel-2 L2A ürünü zaten düzeltilmiş gelir. Landsat için QGIS SCP'nin DOS1 veya FLAASH modülü kullanılabilir.
  • Bulut maskesi: Bulutlu ve gölgeli pikseller çıkarılmalıdır. Sentinel-2'de SCL (Scene Classification Layer) bandı kullanılır.
  • Kırpma (clip): Çalışma alanınızla görüntüyü kırpın — gereksiz pikseller hesaplama süresini uzatır.
  • Bant yığma (stack): Tek bantlı dosyaları çok bantlı bir görüntüde birleştirin.
  • Normalizasyon: Kümeleme öncesi bantları 0–1 aralığına normalize etmek, farklı ölçeklerin kümelemeyi olumsuz etkilemesini önler.

Dikkat: Bulutlu pikseller sınıflandırmayı ciddi biçimde bozar. Mümkünse bulutsuz (%10'dan az bulut örtüsü) görüntüler seçin. Yoksa bulut maskesi kesinlikle uygulanmalıdır.

8. Python ile Denetimsiz Sınıflandırma

Gerekli kütüphaneler: rasterio (görüntü okuma/yazma), numpy, scikit-learn (K-Means), matplotlib (görselleştirme).

pip install rasterio scikit-learn numpy matplotlib
import numpy as np import rasterio from rasterio.plot import show import matplotlib.pyplot as plt # Çok bantlı Sentinel-2 görüntüsü (B2, B3, B4, B8 yığılmış) img_path = "sentinel2_L2A_clip.tif" with rasterio.open(img_path) as src: img = src.read() # (bands, rows, cols) profile = src.profile n_bands, n_rows, n_cols = img.shape print(f"Görüntü boyutu: {n_bands} bant, {n_rows}x{n_cols} piksel")
# (bands, rows, cols) → (rows*cols, bands) X = img.reshape(n_bands, -1).T.astype(np.float32) # NaN ve negatif değerleri çıkar mask_valid = np.all(X > 0, axis=1) X_valid = X[mask_valid] # Min-Max normalizasyon (her bant ayrı) from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() X_scaled = scaler.fit_transform(X_valid) print(f"Geçerli piksel sayısı: {X_valid.shape[0]:,}")
from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score # Büyük görüntüler için örneklem al (hız için) sample_size = min(50000, X_scaled.shape[0]) idx = np.random.choice(X_scaled.shape[0], sample_size, replace=False) X_sample = X_scaled[idx] inertias = [] sil_scores = [] K_range = range(3, 16) for k in K_range: km = KMeans(n_clusters=k, init='k-means++', n_init=10, random_state=42) labels = km.fit_predict(X_sample) inertias.append(km.inertia_) sil_scores.append(silhouette_score(X_sample, labels, sample_size=5000)) print(f"K={k}: inertia={km.inertia_:.0f}, silhouette={sil_scores[-1]:.3f}") # Grafiği çiz fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4)) ax1.plot(K_range, inertias, 'bo-') ax1.set_xlabel('K (küme sayısı)'); ax1.set_ylabel('Inertia') ax1.set_title('Elbow Yöntemi') ax2.plot(K_range, sil_scores, 'rs-') ax2.set_xlabel('K (küme sayısı)'); ax2.set_ylabel('Silhouette Skoru') ax2.set_title('Silhouette Analizi') plt.tight_layout() plt.savefig('elbow_silhouette.png', dpi=150) plt.show()
# Seçilen K ile tam sınıflandırma K_optimal = 10 # Elbow/silhouette grafiğinden belirlendi km_final = KMeans( n_clusters=K_optimal, init='k-means++', n_init=15, max_iter=500, random_state=42 ) # Tüm pikselleri sınıflandır labels_valid = km_final.fit_predict(X_scaled) # Tam görüntü boyutuna geri döndür (-1: geçersiz piksel) labels_full = np.full(n_rows * n_cols, -1, dtype=np.int16) labels_full[mask_valid] = labels_valid result_img = labels_full.reshape(n_rows, n_cols) print("Küme dağılımı:") unique, counts = np.unique(labels_valid, return_counts=True) for u, c in zip(unique, counts): print(f" Küme {u}: {c:,} piksel ({c/len(labels_valid)*100:.1f}%)")
# Orijinal koordinat sistemi ve projeksiyon ile kaydet out_profile = profile.copy() out_profile.update( dtype=rasterio.int16, count=1, compress='lzw' ) with rasterio.open('kmeans_result.tif', 'w', **out_profile) as dst: dst.write(result_img[np.newaxis, :, :]) print("✓ kmeans_result.tif kaydedildi — QGIS'te açabilirsiniz")
band_names = ['B2-Mavi', 'B3-Yeşil', 'B4-Kırmızı', 'B8-NIR'] centers = scaler.inverse_transform(km_final.cluster_centers_) fig, ax = plt.subplots(figsize=(10, 5)) for i, center in enumerate(centers): ax.plot(band_names, center, marker='o', label=f'Küme {i}') ax.set_ylabel('Yansıma Değeri') ax.set_title('Küme Merkezlerinin Spektral Profili') ax.legend(bbox_to_anchor=(1.05, 1)) plt.tight_layout() plt.savefig('spektral_profil.png', dpi=150) plt.show() # NIR yüksek + Kırmızı düşük → bitki örtüsü # Mavi yüksek + NIR çok düşük → su # Tüm bantlar yüksek → bulut veya kar
# Bant sıralaması: B2=0, B3=1, B4=2, B8=3 red = img[2].astype(np.float32) nir = img[3].astype(np.float32) ndvi = np.where( (nir + red) > 0, (nir - red) / (nir + red), 0 ) # 5. bant olarak ekle ve tekrar sınıflandır img_with_ndvi = np.concatenate([img, ndvi[np.newaxis]], axis=0) print("NDVI eklendi, yeni bant sayısı:", img_with_ndvi.shape[0])

Büyük görüntüler için ipucu: Milyonlarca piksel içeren görüntülerde sklearn.cluster.MiniBatchKMeans kullanın — tam K-Means'e benzer sonuçlar verir ama bellek ve zaman açısından çok daha verimlidir.

9. QGIS SCP ile Denetimsiz Sınıflandırma

Semi-Automatic Classification Plugin (SCP), QGIS için geliştirilmiş güçlü ve ücretsiz bir uzaktan algılama eklentisidir. K-Means ve ISODATA algoritmalarını GUI üzerinden çalıştırmanızı sağlar.

SCP Kurulumu

QGIS Eklentiler Eklentileri Yönet ve Yükle
Arama: "Semi-Automatic Classification Plugin"
Yükle Kapat
Menü çubuğunda SCP ikonu görünecektir.

Bant Yığma (Band Set)

SCP Band Set
Tek bantlı görüntüleri listeye ekle Bant sırasını kontrol et
Uydu türünü seç (Sentinel-2 veya Landsat 8)
Run Çok bantlı sanal yığın oluşturulur

Denetimsiz Sınıflandırma: K-Means

SCP Unsupervised Classification

Algorithm: K-Means
Number of classes (K): 10 (başlangıç için)
Maximum iterations: 100
Distance threshold: 0.0001
Minimum class size: 10 piksel

Çıktı dosya yolunu belirle RUN

Denetimsiz Sınıflandırma: ISODATA

SCP Unsupervised Classification

Algorithm: ISODATA
Initial clusters (K₀): 10
Min clusters (K_min): 5
Max clusters (K_max): 20
Max iterations: 50
Min class size (θ_N): 10
Split threshold (θ_S): 0.3
Merge threshold (θ_C): 0.5

RUN

Kümeleri Arazi Örtüsü Sınıflarına Dönüştürme

SCP Postprocessing Classification Report
Sınıflandırma rasterini yükle Piksel sayısı ve yüzde çıktısını incele

Kümeleri yorumlamak için:
QGIS Layer Panel Sınıflandırma rasterine sağ tık Properties
Symbology Paletted/Unique Values Her kümeye renk ve isim ata
(örn. Küme 3 → Orman, Küme 7 → Su ...)

SCP'de Reclassify: Kümeleri yorumladıktan sonra birleştirmek için Postprocessing → Reclassification kullanın. Örneğin Küme 2, 5, 8 → 1 (Orman) olarak yeniden sınıflandırabilirsiniz.

10. Sınıflandırma Doğruluğu Nasıl Değerlendirilir?

Denetimsiz sınıflandırmada doğrulama zorunludur — algoritmanın ürettiği kümeler her zaman anlamlı arazi örtüsü sınıflarına karşılık gelmeyebilir.

Referans Veri Toplama

  • GPS ile saha çalışması: Çalışma alanında farklı arazi örtüsü kategorilerini temsil eden noktalar toplayın ve koordinatlarını kaydedin. Altın standarttır.
  • Yüksek çözünürlüklü görüntü: Google Earth veya Bing uydu fotoğraflarından manuel yorum yapın.
  • Var olan haritalar: Orman envanteri, imar planı, CORINE gibi mevcut arazi örtüsü verilerini referans olarak kullanın.

Confusion Matrix (Hata Matrisi)

Her sınıf için gerçek değer ile tahmin edilen değerin çapraz tablosudur. Üç temel ölçüt türetilir:

ÖlçütFormülİdeal Değer
Overall AccuracyDoğru sınıflandırılan toplam / Toplam referans nokta> %85
Producer's AccuracyHer sınıf için doğru tespit / O sınıfın gerçek sayısı> %80
User's AccuracyHer sınıf için doğru tespit / Tahmin edilen toplam> %80
Kappa Katsayısı (κ)Şansa göre düzeltilmiş uyum ölçüsü> 0.80 = çok iyi

Kappa yorumlama rehberi:
κ < 0.20 → Kötü | 0.20–0.40 → Makul | 0.40–0.60 → Orta | 0.60–0.80 → İyi | > 0.80 → Çok iyi

Python ile Confusion Matrix

from sklearn.metrics import confusion_matrix, classification_report, cohen_kappa_score import pandas as pd # y_true: GPS veya referans görüntüden alınan gerçek sınıflar # y_pred: sınıflandırma sonucundan okunan tahmin sınıfları y_true = [1, 1, 2, 3, 2, 4, 1, 3, ...] # referans noktaları y_pred = [1, 2, 2, 3, 2, 4, 1, 1, ...] # sınıflandırma sonucu class_names = ['Orman', 'Tarım', 'Kentsel', 'Su'] cm = confusion_matrix(y_true, y_pred) kappa = cohen_kappa_score(y_true, y_pred) print("Confusion Matrix:") print(pd.DataFrame(cm, index=class_names, columns=class_names)) print(f"\nKappa katsayısı: {kappa:.3f}") print(classification_report(y_true, y_pred, target_names=class_names))

QGIS SCP ile Doğruluk Değerlendirmesi

SCP Postprocessing Accuracy
Classification raster: sınıflandırma çıktısı
Reference shapefile: referans noktaları (alan sınıfı sütunuyla)
RUN

Çıktı: Confusion matrix tablosu + Overall Accuracy + Kappa değeri

11. Pratik Tavsiyeler ve Yaygın Hatalar

Bant Seçimi

  • NIR bandı arazi örtüsü ayrımında en belirleyici banttır — her zaman dahil edin.
  • SWIR (Short-Wave Infrared) yapılı çevre ve çıplak toprağı orman/bitki örtüsünden ayırmada çok etkilidir.
  • Sadece RGB ile sınıflandırma yapmaktan kaçının — spektral bilgi çok zayıf kalır.
  • NDVI, NDWI gibi indeksler bantlarla birlikte kullanıldığında sınıflandırma doğruluğunu artırır.

Küme Sayısı Stratejisi

  • Çok az küme (K = 3–4): Farklı arazi örtüleri tek kümede birleşir, aşırı genelleştirme.
  • Çok fazla küme (K = 30+): Aynı arazi örtüsü onlarca kümeye bölünür, etiketleme zorlaşır.
  • Altın kural: Hedef sınıf sayısının 2–3 katı K ile başla, spektral profillere bakarak birleştir.

Yaygın Hatalar

  • Atmosferik düzeltme yapmamak: Ham DN değerleriyle kümeleme, mevsimsel veya bölgeler arası karşılaştırmaları geçersiz kılar.
  • Bulutu maskelememek: Bulutlar yüksek yansımalı piksel olarak "kar" veya "kentsel" kümesine girer, tüm sınıflandırmayı kirletir.
  • Tek iterasyonla karar vermek: n_init = 1 ile K-Means yerel minimuma takılabilir. n_init ≥ 10 kullanın.
  • Farklı mevsim görüntülerini karıştırmak: Tarım alanları yaz-kış çok farklı görünür; tutarlı bir tarih aralığı seçin.
  • Doğrulama yapmadan sonuç yayımlamak: Görsel olarak güzel görünen bir sınıflandırma %60 doğrulukta olabilir.

Sonuçları İyileştirme Yöntemleri

  • Majority filter (çoğunluk filtresi): Tek piksellik gürültü kümeciklerini temizler — tüm sınıflandırmaların sonunda uygulanmalıdır.
  • Çok zamanlı analiz: Aynı alan için farklı mevsimlerdeki görüntüleri birlikte kullanmak (örn. yaz + kış Sentinel-2) tarım ve orman ayrımını büyük ölçüde iyileştirir.
  • Texture özellikleri: Doku (entropy, contrast) bantlara eklenirse kentsel ile ormanlık alanlar daha iyi ayrışır.

Projeniz İçin Uydu Görüntüsü Analizi Yaptırmak İster misiniz?

Arazi örtüsü haritalaması, değişim analizi, NDVI izleme ve uzaktan algılama projelerinde profesyonel destek.

Ücretsiz Danışmanlık Alın

Kaynaklar

  • Congalton, R. G., & Green, K. (2019). Assessing the Accuracy of Remotely Sensed Data: Principles and Practices (3. Baskı). CRC Press.
  • Jensen, J. R. (2015). Introductory Digital Image Processing: A Remote Sensing Perspective (4. Baskı). Pearson.
  • Lillesand, T., Kiefer, R. W., & Chipman, J. (2015). Remote Sensing and Image Interpretation (7. Baskı). Wiley.
  • Sentinel-2 veri erişimi: Copernicus Open Access Hub — scihub.copernicus.eu
  • Landsat veri erişimi: USGS Earth Explorer — earthexplorer.usgs.gov
  • Semi-Automatic Classification Plugin belgeleri — fromgistors.blogspot.com/p/semi-automatic-classification-plugin.html