6. ünite / 12
Morfolojik işlemler: aşındırma, genişletme, açma, kapama
Yapı elemanı, aşındırma ve genişletme; açma gürültüyü, kapama delikleri; gradyan, top-hat.
Bu ünitenin sonunda
- Aşındırma ve genişletmeyi en küçük ve en büyük işlemi olarak açıklamak
- Açma ve kapamanın sırasını ve etkisini doğru seçmek
- Yapı elemanının biçim ve boyutunun sonuca etkisini göstermek
- Birbirine değen nesneleri ayırmak ya da kopuk parçaları birleştirmek için morfoloji kullanmak
Ders notları
Morfoloji, ikili (ya da gri) görüntüde nesnelerin biçimini değiştiren komşuluk işlemleridir. Bir yapı elemanı (dikdörtgen, elips ya da artı biçimli küçük maske) her piksele yerleştirilir.
- Aşındırma (erode): yapı elemanının altındaki en küçük değer. Nesneler incelir, küçük beyaz noktalar ve ince köprüler kaybolur.
- Genişletme (dilate): en büyük değer. Nesneler kalınlaşır, küçük delikler ve aralıklar kapanır.
Sıranın önemi
Açma, yapı elemanından küçük beyaz parçaları siler ama büyük nesnelerin boyunu korur. Kapama, nesne içindeki küçük siyah delikleri ve çatlakları doldurur. İkisi birlikte, eşiklemeden sonra maskeyi temizlemenin standart yoludur.
Türev işlemler
Morfolojik gradyan (genişletme − aşındırma) nesnenin çerçevesini verir. Top-hat (f − açma) zeminden küçük ve açık ayrıntıyı, black-hat (kapama − f) küçük ve koyu ayrıntıyı çıkarır: düzensiz ışıkta yazı çıkarmak için kullanılır.
Oyun alanı
Morfolojik işlemler
İkili görüntüde yapı elemanıyla aşındırma ve genişletme; bunların sırası açma (küçük gürültüyü siler) ve kapamayı (delikleri doldurur) verir. Çekirdek biçimini ve boyutunu, yineleme sayısını değiştir.
Kendin dene
Gürültülü pullar sahnesinde eşiklenmiş maskeye bak: kaç kontur var? Açmayı 3×3 elipsle uygula; kontur sayısı ne oldu? Sağ üstte iki pulu birleştiren ince köprüyü hangi çekirdek boyu koparıyor? Sonra kapamaya geç ve pulların içindeki delikleri dolduran en küçük boyu bul. Yineleme sayısını 3 yapınca neden dikdörtgen çekirdekle pullar köşeli görünmeye başlıyor?
Kod
import cv2
import numpy as np
img = cv2.imread('girdi.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, bw = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
k = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) # RECT, ELLIPSE ya da CROSS
ops = {
'erode': cv2.erode(bw, k, iterations=1),
'dilate': cv2.dilate(bw, k, iterations=1),
'open': cv2.morphologyEx(bw, cv2.MORPH_OPEN, k), # aşındır, sonra genişlet
'close': cv2.morphologyEx(bw, cv2.MORPH_CLOSE, k), # genişlet, sonra aşındır
'gradient': cv2.morphologyEx(bw, cv2.MORPH_GRADIENT, k),
'tophat': cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, cv2.getStructuringElement(cv2.MORPH_RECT, (25, 25))),
}
for name, m in ops.items():
n, _ = cv2.connectedComponents((m > 127).astype(np.uint8))
print(f'{name:8s} beyaz={(m > 127).mean():.3f} bileşen={n - 1}')
cv2.imwrite('cikti.png', np.hstack([bw, ops['open'], ops['close']]))Sık yapılan hatalar
- Açma ile kapamanın sırasını karıştırmak: gürültüyü silmek isterken delikleri doldurursun ya da tersi.
- Siyah nesne beyaz zeminde dururken aşındırmanın nesneyi incelteceğini sanmak: OpenCV beyazı nesne sayar; önce maskeyi ters çevir.
- Büyük çekirdek yerine çok yineleme kullanmak ya da tersi: 3×3 ile 3 yineleme yaklaşık 7×7'dir ama biçim farklı olabilir.
- Morfolojiyi ölçümden sonra unutmak: aşındırma alanı küçültür; alan ölçeceksen açma/kapama gibi boyu koruyan işlemleri tercih et.
Yazılım mühendisliği bağlantısı
Morfoloji parametreleri, nesnelerin beklenen boyuna bağlıdır. Bu bağımlılığı belgelenmiş bir varsayım olarak yaz.
- "Gürültü ≤ 3 px, nesne ≥ 20 px" gibi bir varsayım varsa çekirdek boyunu bundan türet ve testi aynı varsayımla kur.
- Kamera çözünürlüğü değişince ölçeklenen parametreler (örneğin genişliğin %1'i) sabit piksel değerlerinden daha dayanıklıdır.
Kendini sına
İkili maskedeki küçük beyaz gürültü noktalarını, büyük nesnelerin boyunu koruyarak silmek için hangisi kullanılır?
Aşındırma bir pikselin değerini nasıl belirler?
Morfolojik gradyan (genişletme − aşındırma) ne verir?
Bir nesnenin içindeki küçük siyah delikleri doldurmak için hangisi?
Bu üniteden sonra bitirme projesinde
- Ön işleme ve kenarlar: onisle ve kenarlar fonksiyonları, --debug çıktıları ve birim testleri.