Işın İzlemede Kenar Yumuşatma / Filtreleme


20

Işın izleme / yol izlemede, görüntüyü kenar yumuşatmanın en basit yollarından biri piksel değerlerini süper örneklemek ve sonuçları ortalamaktır. IE. her örneği pikselin ortasından çekmek yerine, örnekleri bir miktar dengelersiniz.

İnternette arama yaparken, bunu yapmak için iki farklı yöntem buldum:

  1. İstediğiniz gibi numune oluşturun ve sonucu bir filtreyle tartın
  2. Bir filtrenin şekline eşit dağılımlı örnekler üretin


Üret ve Tart

Temel süreç:

  1. İstediğiniz gibi örnekler oluşturun (rastgele, tabakalı, düşük tutarsızlık dizileri vb.)
  2. Kamera örneğini iki örnek (x ve y) kullanarak ofsetleyin
  3. Işını ray ile render
  4. Bir filtre işlevini ve piksel merkezine referans olarak örneğin mesafesini kullanarak bir ağırlık hesaplayın. Örneğin, Kutu Filtresi, Çadır Filtresi, Gauss Filtresi vb.) Filtre Şekilleri
  5. Renderden renge ağırlık uygulayın


Bir filtre şeklinde üretin

Temel dayanak, bir filtrenin şekline göre dağıtılan örnekleri oluşturmak için Ters Dönüşüm Örneklemesi kullanmaktır . Örneğin, bir Gauss şeklinde dağıtılan örneklerin histogramı şöyle olacaktır:
Gauss Histogramı

Bu ya tam olarak ya da işlevi ayrı bir pdf / cdf'ye bölmek suretiyle yapılabilir. smallpt , bir çadır filtresinin tam ters cdf'sini kullanır. Binning yöntemi örnekleri burada bulunabilir


Sorular

Her yöntemin artıları ve eksileri nelerdir? Ve neden birini diğerinin üzerinde kullanasın ki? Birkaç şey düşünebilirim:

Generate and Weigh en sağlam gibi görünerek, herhangi bir örnekleme yönteminin herhangi bir filtreyle kombinasyonuna izin verir. Ancak, ImageBuffer'daki ağırlıkları izlemenizi ve ardından son bir çözümü gerçekleştirmenizi gerektirir.

Bir Filtre Şeklinde Oluştur, yalnızca pozitif filtre şekillerini (örn. Mitchell, Catmull Rom veya Lanczos yok) destekleyebilir, çünkü negatif bir pdf'niz olamaz. Ancak, yukarıda belirtildiği gibi, uygulamak daha kolaydır, çünkü herhangi bir ağırlığı izlemenize gerek yoktur.

Yine de, sonuçta, yöntem 2'yi yöntem 1'in basitleştirilmesi olarak düşünebilirsiniz, çünkü esasen kapalı bir Kutu Filtresi ağırlığı kullanıyor.


Sadece yüksek sesle düşünmek ... Bir filtrenin negatif kısmını, biri pozitif, diğeri negatif olarak değerlendirilecek iki örnek seti oluşturmak için ayrı ayrı modelleyebilir misiniz? Bu, ikinci yaklaşımınız için rastgele filtrelere izin verir mi (filtre şeklinde oluşturulur)?
trichoplax

Olabilir? Lemme keman ile biraz için
RichieSams

1
Tamam, işlevin sıfırlarını izlerseniz, çıktıyı pdf'ye abs () yapabilirsiniz. Ardından örnekleme yaparken negatif olup olmadığınızı kontrol edebilirsiniz. Burada örnek kod: gist.github.com/RichieSams/aa7e71a0fb4720c8cb41
RichieSams

Yanıtlar:


9

2006'dan bu konuda Filtre Önemi Örneklemesi adlı harika bir makale var . Yöntem 2'yi önerir, özellikleri inceler ve genel olarak lehine ortaya çıkarlar. Bu yöntemin daha düzgün oluşturma sonuçları verdiğini iddia ederler, çünkü bir piksele eşit katkıda bulunan tüm numuneleri ağırlıklandırır, böylece son piksel değerlerindeki sapmayı azaltır. Monte Carlo'da genel bir maksimuma sahip olduğundan, önem örneklemesinin ağırlıklı örneklere göre daha düşük varyans sağlayacağını gösteren bu bir anlam ifade eder.

Yöntem 2'nin paralelleştirilmesi biraz daha kolay olma avantajına sahiptir, çünkü her pikselin hesaplamaları diğer tüm piksellerden bağımsızdır, yöntem 1'de örnek sonuçları komşu pikseller arasında paylaşılır (ve bu nedenle pikseller arasında paralelleştirildiğinde bir şekilde senkronize edilmesi / iletilmesi gerekir) çoklu işlemciler). Aynı nedenden dolayı, yöntem 2 ile adaptif örnekleme (görüntünün yüksek varyanslı alanlarında daha fazla örnek) yöntem 1'den daha kolaydır.

Makalede ayrıca, bir filtrenin abs () 'sinden numune alan ve daha sonra @trichoplax'ın önerdiği gibi her bir örneği +1 veya −1 ile ağırlıklandıran bir Mitchell filtresi ile denemeler yaptılar. Ancak bu aslında varyansı arttırdı ve yöntem 1'den daha kötü oldu, bu yüzden yöntem 2'nin sadece pozitif filtreler için kullanılabilir olduğu sonucuna varıyorlar.

Bununla birlikte, bu makaleden elde edilen sonuçlar evrensel olarak uygulanabilir olmayabilir ve hangi örnekleme yönteminin daha iyi olduğu sahneye bağlı olabilir. Bu soruyu araştıran bir blog yazısı yazdım2014'te bağımsız olarak, tam renderleme yerine sentetik bir "görüntü fonksiyonu" kullanarak ve yüksek kontrastlı kenarları daha güzel düzeltmesi nedeniyle görsel olarak daha hoş sonuçlar vermek için yöntem 1'i buldu. Benedikt Bitterli de bu yazının oluşturucusuyla benzer bir sorun rapor ettiğini söyledi (yöntem 2'yi kullanırken ışık kaynakları etrafında aşırı yüksek frekanslı gürültü). Bunun ötesinde, yöntemler arasındaki temel farkı, ortaya çıkan gürültünün frekansı olarak buldum: yöntem 2, daha yüksek frekanslı, "piksel boyutunda" gürültü verirken, yöntem 1, 2-3 piksel olan gürültü "taneleri" verir, ancak gürültünün genliği her ikisi için de benzerdi, bu yüzden hangi tür gürültü daha az kötü görünüyor muhtemelen kişisel tercih meselesidir.


Teşekkürler! Bunlar harika kaynaklar. Sonunda, 3 yöntem var mı? 1. Splatting ile üretin ve tartın 2. Splatting olmadan üretin ve tartın 3. Filtre
Şeklinde Üretin

Generate ve Weight ile splatting arasında nasıl paralellik kuracağınızı araştıran herhangi bir makale, blog vb. Biliyor musunuz? Başımın üstünden, karo başına bir muteks olabilir veya her piksel atomunu yapabilirsiniz.
16:15 tarihinde RichieSams

2
@RichieSams Neden "uyarmadan üret ve tart" kullanacağınızı bilmiyorum - aslında her durumda filtre önemi örneklemesinden daha kötü gibi görünüyor. Ben "üretmek ve tartmak" sıçramak anlamına geliyordu. Sıçramanın paralelleştirilmesine gelince, başımın üstünden, bir yol görüntüyü karolara bölmek, ancak her karoya karo kenarını geçen uyarıları yakalamak için 2‒3 piksel kenarlık vermek olacaktır. Daha sonra son bir geçişte, kenarlıklı karoları son görüntüye ek olarak birleştirin.
Nathan Reed
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.