Yıllardır kullandığım filtrenin aslında ne kadar basit bir işlem ile yapıldığını öğrendim.
Median ve Smooting (Averaging) flitreleme fonksiyonları
Ortalama filtresi
Birkaç farklı isimi vardır, ensık kullanılanları Mean filterin(Ortalama filtresi), Smooting(yumuşatma), Averaging(ortalama) , Box filtering(kutu filtresi)
Ortalama filtre; bir pikselin değerini diğer piksellerin değişim miktarı ile azaltmaktır.
Ortalama filtre; görüntüdeki her bir pikselin komşularının ve kendisinin ortalaması ile değeri değişmektedir. Bu şekilde çevresindekiler ile uyumsuz olan piksellerin değerlerinin ortadan kalması sağlanır.
Ortalama filtre, bir evrişimi işlemidir, bir fonksiyonun şeklinin başka bir fonksiyon tarafından nasıl değiştirildiğini gösterir ( Konvolüsyon )
Kaynak : https://tr.wikipedia.org/wiki/Konvol%C3%BCsyon
Ortalam filrenin bazı ana sorunları vardır.
- Görüntüyü temsil etmeyan pikseller yakın bölgedeki piksellerin değerinin değişmesine neden olmaktadadır. Bu görüntünü bozulmasına neden olur.
- Kenarlarda bulanıklaşmaya neden olur, kenar piksellerde ortalamaya katılan piksel olmadığından değişim oranı yüksek olmasına neden olacaktır.Aşağıda ki örneklerde her bir resime 3×3, 5×5, 7×7 maske ( kernel ) kullanarak ortalama filtre uygulanmıştır.
Median filtre
Bu filtrenin yaygın olan isimleri; Medyan filtresi (Orta Değer filtresi) (Median filtering), Sıralama filtresi (Rank filtering)
Median filtresi, Averaging filtresi gibi görüntüdeki parazitleri(gürültü) azatlamak için kullanılır. Median filtresi görüntüdeki detayların kaybolmaması nedeni ile Averaging filtresinden çok daha iyi sonuçlar vermektedir.
Temel olarak median filtresi sıralama işlemi yapmaktadır. Görüntüdeki her bir pikselin komşu (kernel kullanarak) piksellerini küçükten büyüğe sıralama yapar ve ortasındaki değeri alıp pikselin değerin değiştirir. Eğer incelenen kernel bölgesindeki piksel sayısı çift ise, orta değer olarak ortada bulunan iki pikselin ortalaması alınır.
# load and show an image with Pillow from PIL import Image def smoothing_filter(image, width, height, kernel_size=3): start = time.time() # yeni bir image oluştur img_new = np.zeros([height, width],dtype="uint8") k = int((kernel_size - 1) / 2) for x in range(k, (width - k) - 1): for y in range(k, (height - k) - 1): toplam = 0 for i in range(-(k), k): for j in range(-(k), k): toplam = toplam + image[y + i, x + j] img_new[y, x] = toplam / (kernel_size * kernel_size) end = time.time() print("kernel ",kernel_size,"x",kernel_size," uygulama suresi:", end - start) return img_new.astype(np.uint8) # Open the image form working directory image = Image.open('kolala.jpeg') # summarize some details about the image print(image.format) print(image.size) print(image.mode) smoothing_filter(image, image.size[0], image.size[1], kernel_size=3) Orjinal resim
3×3 Averaging Filtering uygulandıktan sonra
# median filitresi uygula def median_filter(image, width, height, kernel_size=3): start = time.time() # yeni bir image oluştur img_new = np.zeros([height, width],dtype="uint8") k = int((kernel_size - 1) / 2) size_item = (kernel_size * kernel_size) tmp = [0] * size_item for x in range(k, (width - k) - 1): for y in range(k, (height - k) - 1): item = 0 for i in range(-(k), k): for j in range(-(k), k): tmp[item] = image[y + i, x + j] item += 1 tmp = sorted(tmp) img_new[y, x] = tmp[int(item / 2)] end = time.time() print("kernel ",kernel_size,"x",kernel_size," uygulama suresi:", end - start) return img_new.astype(np.uint8)
Median Filtering 5×5 uygulanmış hali