Bokeh simüle etmek için hangi algoritmayı kullanabilirim?


12

Bir fotoğraftaki her pikselden geçen ve bir bütün olarak görüntüye bir bokeh uygulayan bir senaryo yazmaya çalışıyorum.

Bu bağlantıyı temel alan bir komut dosyası oluşturdum , ancak bu bir hack gibi görünüyor.

Üç giriş resmim var: siyah beyaz derinlik haritası, fotoğraf ve bokeh "fırça" görüntüsü (şu anda altıgen). Fotoğrafın her pikseli için, bokeh fırçasını o piksel üzerinde ve o pikselin renginde ortalanacak şekilde damgalarım.

Görünüşe göre ... küçük bokeh fırçalarında iyi, ama bir kez bokeh fırça boyutunu arttırdığımda, Gauss bulanıklığına benziyor. İşte algoritmam ile zaman kare bulanık bir resim:

resim açıklamasını buraya girin

Karanlık kenarları boşver, bunu düzeltebilirim.

Gaussiandan farklı olduğunu söyleyebilirsin, ama hala keskin kenarları olan, saygın bir şekilde bokeh olarak adlandırılabilecek olandan çok uzakta:

resim açıklamasını buraya girin

Algoritmamın neden yaptığını anlıyorum ... bir bokeh'i nasıl daha doğru bir şekilde taklit edebilirim?



@ Farkları anlıyorum ve Bokeh'e genellikle bir lens ve Gaussian'ın da post-processing neden olduğu, ancak Bokeh'i simüle etmek istiyorum.
Varlık

@Entity: Doğru derinlik haritasına sahip örnek resimleri nasıl arayabilirim? Seninki doğru mu? Bunu kendim denemek istiyorum (finallerden sonra). Belki birkaç hafta sonra bir cevap bulurum. Sizinki herkese açıksa, bununla bağlantı kurabilir miyim?
Martijn Courteaux

@MartijnCourteaux İlk testlerim için her şeyin bulanık olması için düz bir derinlik haritası kullanıyorum. Basit geometri için (örneğin bir masa üzerinde bir fincan), iyi görünümlü bir derinlik haritası yapmanın oldukça basit olacağını düşünüyorum. Daha karmaşık görüntüler için, muhtemelen gerçek bir derinlik haritasına ihtiyacınız olacaktır. Bu iki görüntüden, hatta sadece tek bir görüntünüzden hesaplanabilir .
Varlık

Yanıtlar:


20

Bence asıl sorun dinamik aralıklardan biri, algoritmanız muhtemelen doğru ama yanlış veri türü üzerinde çalışıyorsunuz.

Aksi halde saf beyazı kırpıp gidecek bir nokta ışık kaynağı, odaklanmamış bir lens tarafından daha geniş bir alana yayılır, böylece parlak olmayan ve bu nedenle klipslenmeyen bir disk oluşturur.

Bu yüzden bu güzel daireleri gerçek bokeh görüntünüzde elde edersiniz. Sinyali kırpırsanız (aksi halde olduğundan daha az parlak hale getirir ve daha sonra bokeh simülasyonunuzla dağıtırsanız, göze çarpmayan ve gerçekçi görünmeyen bir loş daire (veya altıgen veya herhangi bir şey) elde edersiniz.

Gerçek bir görüntü zincirinde sahip olduğunuz şey:

bokeh (from the lens) -> digitisation (clipping) -> gamma correction & dynamic range compression

Ne yapıyorsun

sharp image -> digitisation (clipping) -> gamma correction & dynamic range compression -> bokeh simulation

Doğrusal verilerle çalışmadığınız için doğru sonucu elde edemezsiniz.

Yapabileceğiniz şey, verileri doğrusallaştırmaya, kırpılmadan kaybolan herhangi bir dinamik aralığı değiştirmeye, bokeh simülasyonunuzu gerçekleştirmeye ve ardından doğrusal olmayan işlemleri yeniden yapmaya çalışmaktır!

İşte bir örnek. Tonemapped bir HDR görüntü ile başladım, son derece doğrusal olmayan bir sonuç verir. Bu, bokeh simülasyonunu denemek için en kötü görüntü türüdür!

Bokeh simüle etmek için standart bir evrişim işlemi yapmak (photoshop'un lens bulanıklaştırma aracını kullanarak), bu sonucu elde ettiğinize çok benzer:

Daha iyi bir sonuç elde etmek için, görüntüyü tonemapping'ten önce ne olacağını, vurguların görüntünün geri kalanından çok daha parlak olduğu kabaca geri almak için aşırı bir eğri uyguladım. Bunu seviyeler aracıyla yaptım, merkez girdisini sağa doğru uzun bir yoldan 1.0'dan 0.2'ye iterek). Daha sonra, daha önce olduğu gibi lens bulanıklaştırma aracını uyguladım. Sonunda ilk eğriye zıt yönde aşırı bir eğri uyguladım. Sonuç, mükemmelden çok uzak olsa da, gerçek lens bokehine çok benziyor:

 

Bunu kodda yapıyorsanız, her bir değeri küp haline getirmeyi deneyin, ardından bokeh simülasyon rutininizi uygulayın, ardından her değerin küp kökünü alın. Bir gelişme görmelisiniz. Biraz değişiklik yapmak gerekebilir.

tl; dr mükemmel bir matematiksel bokeh modeli uygulasanız bile, kırpılmamış doğrusal verilere uygulanmalıdır. Aynı hesaplamaları yoğun şekilde değiştirilmiş verilere uygularsanız (kamera JPEG'de bir standart bile matematiksel açıdan büyük ölçüde değiştirilir) çok farklı bir sonuç elde edersiniz.


12

Her şeyden önce, optikte, sadece ışık toplanır ve karanlık yapmaz. Algoritmanızın karanlık pikselleri orijinal konumlarından dışarı akmadığından emin olun. Ortaya çıkan pikseller, ortalamadan daha çok yakındaki kaynak piksele benzemelidir. Daha da net olmak gerekirse, kaynak pikselleri etkileyen logaritmaları özetlersiniz.

Kenarlarınızın keskin olmamasının bir başka olası nedeni, maskenizin kenarları keskin değilse olabilir. Referans olarak sağladığınız sayfadaki animasyon yanlış anlaşılabilir, böylece maskede orijinal piksel parlak ve diğerleri yavaş yavaş daha koyu olur. Bu hesaplanan bokehte de çamurlu kenarlara dönüşecektir. Fotoğrafta, açıklıkların kademeli olanların değil, belirli kenarları vardır. Yani aslında bir maskedeki piksellerin çoğu eşit parlaklıkta olmalı ve sadece kenarlar (düzgün bir çizgi için bir pikselden daha az renklendirilmesi gereken yerlerde) bir miktar gri tonu olabilir.

Ayrıca bir derinlik haritasına sahip olduğunuzdan bahsediyorsunuz , ancak onu kullanmakla ilgili bir kelime yok . Bokeh maske boyutunuz piksel derinliği ve odak düzlemi derinlik farkı ile ilişkili olmalıdır - bir piksel odak düzleminden ne kadar uzaksa (her iki yönde), maskesi o kadar büyük olmalıdır. Odak düzleminde maske boyutu 1 × 1 piksel olmalıdır.


Operasyonların tümü katkısı sağlandığında, karanlık alanların yayılma problemini alamazsınız. Keskin daireler elde etmek için keskin bir maskeye ihtiyacınız olduğu doğrudur, ancak asıl sorun bokeh operasyonunun doğrusal olmayan verilere uygulanmasıdır.
Matt Grum
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.