Gauss Bulanıklığı Nasıl Uygulanır?


42

Bulanıklığın gerçek zamanlı grafiklerde bir eksende sonra da diğerinde yapıldığını okudum.

Geçmişte 1D'de bir miktar evrişim yaptım ama bu konuda tam olarak ne rahat edeceğimi de bilmiyorum.

Görüntünün 2B Gauss Bulanıklığının nasıl yapıldığını açık bir şekilde kimse açıklayabilir mi?

Bulanıklığın yarıçapının performansı etkileyebileceğini de duydum. Bunun nedeni daha büyük bir evrişim yapmak zorunda mı?

Yanıtlar:


48

Evrişimde, üçüncü bir işlev üretmek için iki matematiksel işlev birleştirilir. Görüntü işleme fonksiyonlarına genellikle çekirdek denir. Bir çekirdek (kare) piksel dizisinden başka bir şey değildir (konuşmak için küçük bir resim). Genellikle, çekirdekteki değerler bire kadar ekler. Bu, işlemden sonra görüntüden enerji eklenmemesini veya görüntüden çıkarılmamasını sağlamak içindir.

Spesifik olarak, bir Gauss çekirdeği (Gauss bulanıklığı için kullanılır), piksel değerlerinin bir Gauss eğrisinin değerlerine (2B) karşılık geldiği kare piksel dizisidir.

Http://homepages.inf.ed.ac.uk/rbf/HIPR2/gsmooth.htm adresinden bağlantı verilen resim

Görüntüdeki her piksel Gauss çekirdeği ile çarpılır. Bu, çekirdeğin merkez pikselini görüntü pikseline yerleştirerek ve orijinal görüntüdeki değerleri üst üste binen çekirdekteki piksellerle çarparak yapılır. Bu çarpmalardan kaynaklanan değerler toplanır ve bu sonuç hedef pikseldeki değer için kullanılır. Görüntüye bakıldığında, giriş dizisindeki (0,0) 'daki değeri çekirdek dizisindeki (i)' deki değerle, giriş dizisindeki (1,0) 'daki (h)' deki değer ile çarpın. ) çekirdek dizisinde, vb. ve sonra çıkış görüntüsündeki (1,1) değerini almak için tüm bu değerleri ekleyin.

Http://www.songho.ca/dsp/convolution/convolution.html adresinden bağlantı verilen resim

Önce ikinci sorunuzu cevaplamak için, çekirdek ne kadar büyükse, işlem o kadar pahalı olur. Bu nedenle, bulanıklığın yarıçapı büyüdükçe işlem daha uzun sürer.

İlk sorunuza cevap vermek için yukarıda açıklandığı gibi her giriş pikselini çekirdeğin tamamı ile çarparak evrişim yapılabilir. Bununla birlikte, eğer çekirdek simetrik ise (bu bir Gauss çekirdeğidir), her ekseni (x ve y) bağımsız olarak çarparak toplam çarpım sayısını azaltabilirsiniz. Uygun matematiksel terimlerle, eğer bir matris ayrılabilirse, (M × 1) ve (1 × N) matrislere ayrıştırılabilir. Bunun üstündeki Gauss çekirdeği için aşağıdaki çekirdekleri de kullanabilirsiniz:

1256[1464141624164624362464162416414641]=1256[14641][14641]

Şimdi, giriş görüntüsündeki her pikseli iki çekirdekli ile çarpacak ve elde edilen değerleri, çıkış pikselinin değerini almak için ekleyeceksiniz.

Bir çekirdeğin ayrılabilir olup olmadığını nasıl göreceğiniz hakkında daha fazla bilgi için bu bağlantıyı izleyin .

Düzenleme: Yukarıda gösterilen iki çekirdek biraz farklı değerler kullanır. Bunun nedeni Gauss eğrisinin bu çekirdekleri oluşturmak için kullandığı (sigma) parametresinin her iki durumda da biraz farklı olmasıdır. Hangi parametrelerin Gauss eğrisinin şeklini etkilediğinin ve dolayısıyla çekirdekteki değerlerin nasıl olduğunu açıklama için bu linki takip edin.

Düzenleme: Yukarıdaki ikinci resimde, kullanılan çekirdeğin çevrilmiş olduğu yazıyor. Bu, elbette, yalnızca kullandığınız çekirdek simetrik değilse herhangi bir fark yaratır. Çekirdeği çevirmenizin nedeni, evrişim işleminin matematiksel özellikleri ile ilgilidir (evrişim hakkında daha ayrıntılı bir açıklama için bağlantıya bakınız ). Basitçe söylemek gerekirse: çekirdeği çevirmezseniz, evrişim işleminin sonucu çevrilir. Çekirdeği çevirerek doğru sonucu elde edersiniz.


1
İki farklı 5'e 5 çekirdeğin neden biraz farklı sayılara sahip olduğunu açıklamak için kısa bir not ekleyebilir misiniz (biri 273'e, diğeri 256'ya toplanır)? Bu konuda yeni biri için potansiyel bir karışıklık gibi görünüyor.
trichoplax

Benzer şekilde, çekirdeğin neden ikinci diyagramınıza çevrildiğini açıklayabilir misiniz? Açıklamanın bununla alakalı olduğunu sanmıyorum, ancak bariz bir ilave adım olduğu gerçeği, gerekli olmadığını bilmeyen birisinin anlaşılmasını engelleyebilir.
trichoplax

doğru sonuçlar için lineer renk alanında çalışmayı unutmayın.
v.oddou

16

İşte konuyla ilgili okuduğum en iyi makale: Doğrusal örneklemeli verimli Gauss bulanıklığı . Tüm sorularınızı ele alıyor ve gerçekten erişilebilir.

Layman için çok kısa bir açıklama: Gaussian, ayrılabilir olma özelliğine sahip bir fonksiyondur, yani 2B Gauss fonksiyonunun, iki 1D Gauss fonksiyonunu birleştirerek hesaplanabileceği anlamına gelir.

Bu nedenle, boyutu ( ) için, sadece değerini ( ) değerlendirmeniz yeterlidir , bu değer önemli ölçüde daha azdır. Operasyonunuz bir doku elemanını okumaktan ibaretse (genellikle "musluk" olarak adlandırılır ), bu iyi bir haber: daha az dokunuş daha ucuz çünkü bir doku alımının bir maliyeti var.n×nO(n2)2×nO(n)

Bu yüzden, bulanıklaştırma algoritmaları bu özelliği iki geçiş yaparak, birini yatay pikselleri toplayarak yatay olarak bulanıklaştırmayı, diğeri dikey pikselleri toplayarak dikey olarak bulanıklaştırmayı kullanır . Sonuç, son bulanık piksel rengidir.nn


13

Genel olarak, iki fonksiyonun ürününün integralini sürgülü bir pencerede almak suretiyle bir evrişim gerçekleştirilir, ancak bir matematik arkaplanından değilseniz, bu çok yararlı bir açıklama değildir ve kesinlikle size faydalı bir sezgi vermez. onun için. Daha sezgisel olarak bir evrişim, bir giriş sinyalindeki çoklu noktaların bir çıkış sinyali üzerindeki tek bir noktayı etkilemesine izin verir.

Konvolüsyonlarla süper rahat olmadığınız için, önce bir konvolüsyonun bunun gibi ayrık bir bağlamda ne anlama geldiğini gözden geçirelim ve daha basit bir bulanıklığa geçelim.

Ayrık bağlamımızda, iki sinyalimizi karşılık gelen her örneği basitçe çarparak çoğaltabiliriz. İntegral ayrıca isteğe bağlı olarak basittir, her örneği sadece üzerinde entegre olduğumuz aralıkta ekleriz. Basit bir ayrık evrişim hareketli bir ortalama hesaplıyor. Hareketli ortalama 10 numuneyi almak istiyorsanız, bunun sinyalinizi 10 örnek uzunluğunda ve 0,1 boyunda bir dağılımla sarsması olarak düşünülebilir, penceredeki her örnek ilk önce 0,1 ile çarpılır, daha sonra 10'un tümü üretmek için bir araya getirilir ortalama. Bu aynı zamanda ilginç ve önemli bir ayrımı ortaya koymaktadır, bir evrişimle bulanıklaştığınızda, kullandığınız dağılım tüm numuneleri için 1.0 olmalıdır, aksi halde uyguladığınızda görüntünün genel parlaklığını arttıracak veya azaltacaktır.

Şimdi konvolüsyonlara baktığımızda, bulanıklığa geçebiliriz. Bir Gauss bulanıklığı, bir Gauss dağılımıyla bir görseli birleştirerek uygulanır. Diğer bulanıklaştırmalar genellikle görüntünün başka dağılımlara sarılmasıyla uygulanır. En basit bulanıklık, kutu bulanıklığıdır ve yukarıda tanımladığımız aynı dağılımı, birim alanı olan bir kutuyu kullanır. 10x10'luk bir alanı bulanıklaştırmak istiyorsak, kutudaki her örneği 0.01 ile çarptıktan sonra orta pikseli üretmek için hepsini bir araya getiriyoruz. Bulanıklık dağılımımızdaki tüm örneklerin toplamının, görüntünün daha parlak veya daha koyu olmadığından emin olmak için 1.0 olmasını sağlamamız gerekir.

Gauss bulanıklığı, kutu bulanıklığı ile aynı geniş prosedürü izler, ancak ağırlıkları belirlemek için daha karmaşık bir formül kullanır. Dağıtım merkezinden mesafeye göre hesaplanabilir r, değerlendirerek Gauss tüm örnekler toplamı sonunda olacak Her bir pikseli örneklemeniz durumunda yaklaşık 1.0, ancak bir Gaussian'ın sonsuz bir desteğe sahip olması (her yerde değerleri vardır), yalnızca birkaç değer kullanarak 1.0'a tekabül eden biraz değiştirilmiş bir sürüm kullanmanız gerektiği anlamına gelir.

ex2/22π

Tabii ki bu işlemlerin her ikisi de çok büyük bir yarıçapta gerçekleştirilirse çok pahalı olabilir, çünkü bulanıklığı hesaplamak için çok fazla piksel örneklemeniz gerekir. Son hilenin girdiği yer burası: hem Gauss bulanıklığı hem de kutu bulanıklığı “ayrılabilir” bulanıklığı olarak adlandırılan şeydir. Bu, bulanıklığı bir eksen boyunca uygularsanız ve ardından diğer eksen boyunca gerçekleştirirseniz, aynı anda her iki eksen boyunca gerçekleştirdiğiniz gibi aynı sonucu verir. Bu çok önemli olabilir. Bulanıklığınız 10 piksel arasındaysa, naif formda 100 numune gerekir, ancak ayrıldıklarında yalnızca 20 adet gerekir. Fark sadece büyür, çünkü birleşik bulanıklık iken, ayrılmış form .O(n2)O(n)


1
Diğer cevabınıza baktığımda, matematik geçmişiniz çalışmakta olduğumdan daha iyi görünüyor, ama yardımcı olmak için hala yeterli ayrıntıya girdiğini umuyorum. Bunun içine giren herhangi bir geçmişi olan insanlar için faydalı olmasını istedim.
porglezomp

1
Benimle konuşuyorsan, hiç de değil. Cevabınız ve Bert'in inanılmaz aydınlatıcı. Çok teşekkür ederim! Bilgileri şimdi biraz sindirmeliyim (:
Alan Wolfe

11

Gauss bulanıklığını uygularken göz önünde bulundurulması gereken en önemli şey, diğerleri belirttiği gibi, 2D konvolüsyon filtresini iki 1D konvolüsyona ayırmaktır, çünkü karmaşıklığı den ye düşürür .O(n2)O(n)

Ancak gerçek bir uygulamada göz önünde bulundurmanız gereken iki püf noktası daha var:

Filtrenin belirli bir yarıçapı vardır ve bu nedenle, o sınırda görüntünün dışına düşen piksellerle hesaplamanız gerekecektir. Bu durumda, aşağıdakilerden birini deneyebilirsiniz: dış pikseller için son olası değeri alırsınız (yani, en sınırındaki piksel, içinde olduğu gibi max(x, 0). Veya görüntüyü dışa doğru ("olduğu gibi" "yansıtabilirsiniz" x < 0 ? -x : x). Ya da sadece sınırda durabilirsiniz, ancak sonra konvolüsyon filtresinde paydayı 1'e kadar toplaması için ayarlamanız gerekir. Örneğin:

sum1256[1464141624164624362464162416414641]=sum1225[0000001624160024361600162416000000]=1.
Başka bir numara, çekirdeğin gerçek katsayılarının nasıl hesaplanacağı ile ilgilidir. Belli ki Gauss fonksiyonunu uygulamaya çalışabilirsiniz ancak çok daha hızlı bir yol, 1D çekirdeğinin Pascal üçgenini yeniden birleştirdiğini gözlemlemektir . Örneğin:
     1
    1 1
   1 2 1
  1 3 3 1
[1 4 6 4 1]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.