Görüntü mozaikleri yapmak için algoritmalar - bundan daha hızlı bir yol var mı?


9

Görüntü mozaikleri yapmakla oynuyorum. Betiğim çok sayıda resim alır, küçük resim boyutuna ölçeklendirir ve ardından bir hedef görüntüye yaklaşmak için bunları karo olarak kullanır.

Yaklaşım aslında oldukça hoş:

Her karo konumundaki her başparmak için ortalama kare hatasını hesaplıyorum.

İlk başta sadece açgözlü bir yerleşim kullandım: başparmağın en uygun olduğu kiremit üzerinde en az hatayı ve sonra bir sonraki ve benzeri.

Açgözlü problem, en yakın zamanda en az popüler karolara en yakın başparmakları yerleştirmenize izin verir; Burada örnekleri gösteriyorum: http://williamedwardscoder.tumblr.com/post/84505278488/making-image-mosaics

Bu yüzden komut dosyası kesilene kadar rastgele takaslar yaparım. Sonuçlar gayet iyi.

İki karonun rastgele değiştirilmesi her zaman bir gelişme değildir, ancak bazen üç veya daha fazla karonun dönüşü küresel bir iyileşme ile sonuçlanır, yani A <-> Biyileşmeyebilir, ancak A -> B -> C -> A1..

Bu nedenle, iki rastgele kiremit seçtikten ve gelişmediklerini keşfettikten sonra, böyle bir rotasyonda üçüncü kiremit olup olmadıklarını değerlendirmek için bir demet fayans seçiyorum. Herhangi bir dört kiremit kümesinin karlı bir şekilde döndürülüp döndürülemeyeceğini keşfetmiyorum vb. bu çok pahalı gerçek olurdu.

Ama bu zaman alıyor .. Çok zaman!

Daha iyi ve daha hızlı bir yaklaşım var mı?


Ödül Güncellemesi

Macar Yöntemi'nin çeşitli Python uygulamalarını ve bağlantılarını test ettim .

Şimdiye kadar en hızlısı saf Python idi https://github.com/xtof-durr/makeSimple/blob/master/Munkres/kuhnMunkres.py

Benim önsezim bunun en uygun cevaba yaklaşması; bir test görüntüsü üzerinde çalıştırıldığında, diğer tüm kütüphaneler sonuç üzerinde anlaştılar, ancak bu kuhnMunkres.py, büyüklük siparişleri daha hızlı olurken, diğer uygulamaların üzerinde anlaştığı puana çok yaklaştı.

Hız çok verilere bağlıdır; Mona Lisa 13 dakikada kuhnMunkres.py'ye koştu, ancak Scarlet Chested Parakeet 16 dakika sürdü.

Sonuçlar Parakeet için rastgele takaslar ve rotasyonlarla aynıydı:

resim açıklamasını buraya girinresim açıklamasını buraya girin

(kuhnMunkres.py solda, rastgele takaslar; karşılaştırma için orijinal görüntü )

Bununla birlikte, test ettiğim Mona Lisa görüntüsü için, sonuçlar belirgin şekilde iyileştirildi ve aslında tanımlanmış 'gülümsemesi' parladı:

resim açıklamasını buraya girinresim açıklamasını buraya girin

(kuhnMunkres.py solda, rastgele takaslar sağda)


1
İlgili ... imsi. Codegolf damak dönüşümü benzer sorunları vardı.

1
Ve başka bir ilgili görüntü seti allRGB'dir (her bir görüntü (bu size nasıl yapılacağına dair çok fazla ipucu vermiyor olsa da ... sadece bu sorunun ele alındığı başka bir alan var).

1
Birkaç yıl önce bir mozaik üreticisi ile bu problemle karşılaştım. Benim akıl yürütme çizgim o zaman ve şimdi problem algoritmanızla (MSE bölümü) çok değil, giriş görüntü paletinizin sınırlı boyutuyla ilgili. Çalışmak için bir milyar görüntüye sahip olmadığım için, görüntünün bir süre sonra tekrar kullanılmasına izin vererek taklit ettim. Bununla birlikte, yaklaşımınıza devam etmek istiyorsanız, "iyi" uyumlar için ilk geçiş yapmak ve daha sonra görüntülerin geri kalanını rastgele (veya rastgele-ish) olarak işlemek iyi olabilir - sınırlı bir giriş seti ile birçok seçenek.
J Trana

@MichaelT bu mükemmel bağlantı için teşekkürler :) Codegolf özellikle büyüleyici. Ben olarak-en iyi çözüm ... (rastgele değil rotasyonlar) rastgele swapları kullanıyor ve muhtemelen uzunca bir süre çalışan bulmak
Will

1
Bir cevap seçtikten ve bir ödül kazandıktan sonra buna geliyorum. Farklı bir yaklaşım, bunu Simüle Tavlama problemi olarak ele almak olacaktır . SA'yı çözüm hattınızın aşamalarından biri olarak kullanabilirsiniz.
andy256

Yanıtlar:


3

Evet, daha iyi ve daha hızlı iki yaklaşım var.

  • Daha basit sorun: her döşemede en iyi başparmağı seçin (olası çoğaltma ile). Tamam, bu hile yapıyor, ancak sadece daha iyi görsel sonuca yol açabilir.
  • Almanız algoritmik olarak daha ilginçtir ve MSE'yi toplamı minimum olması gereken eşleşme maliyetleri olarak kabul ettiğiniz varsayımıyla "doğrusal atama problemi" ne dayanır. Bu tür bir problem polinom zamanda, örneğin "Macar Yöntemi" ile çözülebilir.

Ardından, temel algoritmayı değiştirmeden MSE'yi görsel olarak daha doğru bir mesafe ile değiştirerek maliyetlerinizi ayarlayabilirsiniz.


Teşekkür! LAP ve Hungarian Method ihtiyacım oldu! Söz konusu sonuçlarla güncelleyin.
Will

3

Bunun NP zor bir sorun olduğuna eminim. 'Mükemmel' bir çözüm bulmak için her olasılığı kapsamlı bir şekilde denemeniz gerekir ve bu üsteldir.

Bir yaklaşım, açgözlü uyumu kullanmak ve daha sonra onu geliştirmeye çalışmak olacaktır. Bu, kötü yerleştirilmiş bir görüntü (sonunculardan biri) alıp koymak için başka bir yer bulmak, daha sonra bu görüntüyü alıp hareket ettirmek olabilir. (A) Zamanınız bittiğinde (b) uyum 'yeterince iyi' olduğunda yapılır.

Olasılıksal bir unsur eklerseniz , simüle edilmiş bir tavlama yaklaşımına veya genetik bir algoritmaya yol açabilir . Belki de elde etmeye çalıştığınız tek şey hataları eşit olarak yaymaktır. Bunun zaten yaptığınız şeye yaklaştığından şüpheleniyorum, bu yüzden cevap: doğru algoritma ile daha hızlı daha iyi sonuç alabilirsiniz, ancak Nirvana için sihirli bir kısayol yoktur.


Evet, bu zaten yaptıklarınıza benzer. Önemli olan sihirli bir cevabı unutmak ve 2 algoritma açısından düşünmektir: önce doldurun, sonra optimize edin.

Dolgu şu olabilir: rastgele, en iyi kullanılabilir, ilk en iyi, yeterince iyi, bir tür sıcak nokta.

Optimizasyon rastgele olabilir, en kötüsünü düzeltebilir veya (önerdiğim gibi) simüle edilmiş tavlama veya genetik algoritma olabilir.

Bir "iyilik" metriğine ve buna harcamak ve sadece denemek için hazır olduğunuz bir süreye ihtiyacınız vardır. Veya gerçekte bunu yapan birini bulun.


Soruda açıklanan yaklaşımı tam olarak açıklıyorsunuz ...?
Will

1

Son fayanslar sizin probleminizse, onları bir şekilde erken yerleştirmeye çalışmalısınız;)

Bir yaklaşım, maçlarının en üstteki% x'inden en uzak olan karoya bakmak (sezgisel olarak% 33 ile giderdim) ve bunu en iyi maçına yerleştirmek olacaktır. Zaten alabileceği en iyi maç bu.

Ayrıca, en kötü kutucuk için en iyi eşleşmeyi kullanmamayı tercih edebilirsiniz, ancak o slot için en iyi eşleşmeye kıyasla en az hatayı verdiği yer, böylece " hasar kontrolü ".

Akılda tutulması gereken başka bir şey, sonunda bir göz tarafından işlenecek bir görüntü ürettiğinizdir. Gerçekten istediğiniz şey, görüntünüzdeki hangi konumların en önemli olduğunu belirlemek için bazı kenar algılamayı kullanmaktır. Benzer şekilde, görüntünün tam çevresinde olan şey efektin kalitesine çok az değer verir. Bu iki ağırlığı üst üste getirin ve bunları mesafe hesaplamanıza ekleyin. Bu şekilde aldığınız herhangi bir titreşim, sınıra doğru ve kenarlardan uzaklaşarak çok daha az rahatsız etmelidir.

Ayrıca kenar algılaması yerinde olduğunda, ilk% 'yi iştahla yerleştirmek isteyebilirsiniz (belki de soldaki döşemelerde belirli bir "kenarlık" eşiğinin altına düşene kadar), böylece "sıcak noktalar" gerçekten güzel bir şekilde ele alınır, ve geri kalanı için "hasar kontrolü" ne geçin.

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.