Python Median ve Averaging Filtering

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

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir