Ana içeriğe geç

Goruntuyu yumusatma smoothing images

Görüntüyü Yumuşatma - \( Smoothing Images \)

Smoothing Images olarak geçer.

Hedefler

  • Çeşitli düşük geçişli filtrelerle görüntüleri bulanıklaştırma
  • Görüntülere özel filitreler uygulamak \(2B kıvrım\)

2D Kıvrım \( Resim Filtreleme \)

Tek boyutlu sinyaller olarak, çeşitli düşük geçişli \(LPF\) filtreler ile resimler
ayrıca filtrelenebilir, yüksek geçişli filtreler \(HPF\) vs. Bir LPF gürültünün
giderilmesinde yardım eder veya resmi bulanıklaştırmada. HPF ise resimlerdeki kenarları
bulmada yardım eder.

Bir resim ile çekirdeği \( kernel \) çevirmek, evirmek vs için OpenCV kütüphanesinde
cv2.filter2D() fonksiyonunu vardır. Örnekte görüldüğü gibi, biz resim üzerinde
ortalama filtre deniyoruz. 5x5 ortalama bir filtre çekirdeği bu şekilde tanımlanabilir.

Yukarıdaki çekirdek ile filtreleme, aşağıdakilerin gerçekleştirilmesine neden olur. Her
bir pixel, 5x5 bu pixel’in üzerinde ekran ordalıdır, bu pencerenin içine giren bütün
pixel’ler toplanır ve bunun sonucunda 25’e bölünür.Bu, o pencere içindeki piksel
değerlerinin ortalamasının hesaplanmasına denktir. Bu işlem çıktı filtrelenmiş görüntüyü
üretmek için görüntünün tüm pikselleri için gerçekleştirilir. Bu kodu deneyin ve
sonucunu kontrol edin:

Python
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('opencv_logo.png')
kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img,-1,kernel)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(dst),plt.title('Averaging')
plt.xticks([]), plt.yticks([])
plt.show()

Sonuç;

Resim Bulanıklaştırma \( Görüntü Yumuşatma \)

Görüntü bulanıklaştırma düşük geçişli filtreler ile resmi evriştirilerek yapılır.Bu
görüntü kirliliğini kaldırmak için iyi bir yöntemdir.Aslında yüksek frekanslı içeriği
\(ör. Gürültü, kenar\) görüntüden kaldırır ve böylece filtre uygulandığında kenarları
bulanık hale getirir.OpenCV, esas olarak dört tür bulanıklaştırma tekniği sunar.

1. Averaging \( Ortalama \)

Bu normalize edilmiş kutu filtresi ile resmin evriştirilmesi sonuçu yapılır. Çekirdek
alanı altındaki tüm piksellerin ortalamasını alır ve merkezi öğeyi bu ortalama ile
değiştirir. Bu olay OpenCV de ki cv2.blur() ve cv2.boxFilter() fonksiyonları ile
yapılır.Çekirdek hakkında daha fazla bilgi edinmek için, çekirdeğin genişlik ve
yüksekliğini belirlemeliyiz 3x3 normalize edilmiş bir kutu filtresi şuna benzer:

NOT; Eğer normalize edilmesin istiyorsanız cv2.boxFilter\(normalize = False \) demeniz
yeterli oluyor.

Python
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('opencv_logo.png') # resmi okuduk
blur = cv2.blur(img,(5,5)) # blur filtresi uyguladık
# ve oluşan orjinal ve yeni görüntüyü matplotlib kullanarak ekrana verdik
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()

Sonuç;

2. Gauss Filtreleme

Bu yaklaşım eşit filtre katsayılarından oluşan bir kutu filtresi yerine, bir gauss
çekirdeği kullanır bu işlem cv2.GaussianBlur() fonksiyonu kullanılarak yapılır.Tek ve
pozitif olan çekirdeğin yükseklik ve genişliğini belirlemeliyiz. Standart sapmayı da
sırasıyla X ve Y yönlerinde, sigmaX ve sigmaY olarak belirtmeliyiz. Yalnızca sigmaX
belirtilirse, sigmaY sigmaX’e eşit olarak alınır. Her ikisi de sıfır olarak verilirse,
bunlar çekirdek boyutundan hesaplanır. Gauss filtrelemesi, görüntüdeki Gauss gürültüsünü
gidermede oldukça etkilidir. Bu işlemi yapmak için cv2.getGaussianKernel().
fonksiyonunu kullanmalısınız. Yukarda verdiğimiz kodun ilgili yerini sadece bununla
değiştirerek yapılabilir

blur = cv2.GaussianBlur(img,(5,5),0)

3. Medyan \( Ortanca \) Filtreleme

Burada, cv2.medianBlur() fonksiyonu çekirdek penceresinin altındaki tüm piksellerin
ortanca değerini hesaplar ve orta piksel bu orta değerle değiştirilir. Bu, tuz ve biber
gürültüsünü gidermede son derece etkilidir. Dikkat çekilmesi gereken ilginç bir nokta,
Gauss ve kutu filtrelerinde, merkezi öğe için filtrelenmiş değer, orijinal resimde
bulunmayan bir değer olabilir. Bununla birlikte, medyan filtrelemede bu geçerli
değildir, çünkü merkezi öğe daima görüntüdeki bazı piksel değerleri ile değiştirilir.
Bu, gürültüyü etkili bir şekilde azaltır. Çekirdek boyutu pozitif tek sayıyla olmalıdır.

Bu demoda, orijinal resmimize % 50 gürültü ekliyoruz ve bir medyan filtre kullanıyoruz.
Sonucu kontrol edin:

median = cv2.medianBlur(img,5)

4. Bilateral Filtreleme

Not ettiğimiz gibi daha önce gösterdiğimiz filtrelerin kenarlarını bulanıklaştırma
olaylarında. Kenarları korurken gürültünün giderilmesinde oldukça etkili olan ikili
filtre cv2.bilateralFilter() için durum böyle değildir. fakat bu işlem, diğerlerine
göre daha yavaş çalışır.

Zaten bir Gauss filtresinin pikselin çevresini aldığını ve Gauss ağırlıklı ortalamasını
bulduğunu gördük. Bu Gauss filtresi yalnızca alanın bir fonksiyonudur; diğer bir
deyişle, filtreleme sırasında yakındaki pikseller dikkate alınır. Piksellerin hemen
hemen aynı yoğunluk değerine sahip olup olmadığına bakmaz ve pikselin bir kenar üzerinde
olup olmadığını düşünmez. Ortaya çıkan sonuç, Gauss filtrelerinin kenarları
bulanıklaştırma eğiliminde olmasıdır, bu istenmeyen bir durumdur.

Bilateral filtre aynı zamanda uzay alanında bir Gauss filtresi kullanır, ancak piksel
yoğunluğu farklılıklarının bir fonksiyonu olan bir tane daha \(çarpımsal\) Gauss filtre
bileşenini kullanır. Uzayın Gauss fonksiyonu, yoğunluk alanına uygulanan Gauss bileşeni
\(yoğunluk farklılıklarının bir Gauss fonksiyonu\) yalnızca piksellerin ‘filtreleme
için’ uzaysal komşular ‘olarak düşünülmesini sağlarken, yoğunluk farklılıklarının bir
Gauss fonksiyonu, sadece merkeze benzer yoğunluklara sahip olan piksellerin bulanık
yoğunluk değerini hesaplamak için piksel \('yoğunluklu komşular'\) dahil edilmiştir.
Sonuç olarak, bu yöntem kenarları korur, çünkü kenarların yakınında bulunan pikseller
için kenarın diğer tarafına yerleştirilen komşu pikseller ve bu nedenle merkez pikselle
karşılaştırıldığında büyük yoğunluk değişiklikleri sergilemek bulanıklaştırma için dahil
edilmez.

Aşağıdaki örnek bilateral filtrelemeyi göstermektedir \(argümanlar hakkında ayrıntılı bilgi için OpenCV dokümanlarına bakın\).

blur = cv2.bilateralFilter(img,9,75,75)

Sonuç;