Keyfi Şekillerin Otomatik Kırpılması


14

İkili maske (gri = şekil, siyah = arka plan) tarafından tanımlanan rasgele bir şeklim var.

Ben sadece gri piksel içeren bu mümkün olan en büyük dikdörtgen bulmak istiyorum (bu dikdörtgen sarı resimde):

resim açıklamasını buraya girin

Şekil her zaman "tek parça" dır, ancak zorunlu olarak dışbükey değildir (şeklin sınırındaki tüm nokta çiftleri, şekilden geçen düz bir çizgi ile birleştirilemez).

Bazen bu tür "maksimum dikdörtgenlerin" birçoğu vardır ve daha sonra aşağıdaki gibi başka kısıtlamalar getirilebilir:

  • Dikdörtgenin merkezi, şeklin kütle merkezine (veya görüntünün merkezine) en yakın olması
  • Önceden tanımlanmış bir orana en yakın en boy oranına sahip dikdörtgen alma (örn. 4: 3)

resim açıklamasını buraya girin

Algoritma hakkında ilk düşüncem şudur:

  1. Şeklin mesafe dönüşümünü hesaplayın ve kütle merkezini bulun
  2. Yalnızca şeklin piksellerini içerirken kare alanı büyütün
  3. Dikdörtgeni (başlangıçta bir kare) yalnızca şeklin piksellerini içerecek şekilde genişlik veya yükseklikte büyütün.

Ancak, böyle bir algoritmanın yavaş olacağını ve optimal bir çözüm getirmeyeceğini düşünüyorum.

Herhangi bir öneri?



@AtulIngle Kesinlikle! Teşekkürler. Cevabı kabul edebilmem için ekleyebilir misiniz? Daha sonra algoritma hakkında daha fazla ayrıntı oluşturmak için cevabı düzenlemeye çalışacağım - ama sadece sağladığınız bağlantıyı kullanarak kendi sorumu cevaplamak istemiyorum ...
Libor

Harika! Kodda okumadığım için ayrıntılı cevabınızı okumak için sabırsızlanıyorum.
Atul Ingle

@AtulIngle Tamam, cevaba biraz tartışma ekledim ve tam bir makaleme bağlantı verdim.
Libor

Yanıtlar:


10

Matlab Fileexchange'te sorununuzla ilgili bir kod var: http://www.mathworks.com/matlabcentral/fileexchange/28155-inscribedrectangle/content/html/Inscribed_Rectangle_demo.html

Güncelleme

Atul Ingle'ın yukarıdaki bağlantısına dayanan en büyük yazılı dikdörtgenleri hesaplamaya dair bu eğitici makaleyi yazdım .

Algoritma önce bir ikili maske üzerindeki en büyük kareleri arar. Bu basit dinamik programlama algoritması kullanılarak yapılır. Her yeni piksel, zaten bilinen üç komşu kullanılarak güncellenir:

squares[x,y] = min(squares[x+1,y], squares[x,y+1], squares[x+1,y+1]) + 1

resim açıklamasını buraya girin

Örnek ikili maske ve hesaplanmış harita şöyle görünür:

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

Haritada maksimum sayı alınması, en büyük yazılı kareyi gösterir:

resim açıklamasını buraya girin

Dikdörtgen arama algoritması, iki dikdörtgen sınıfı aramak için maskeyi iki kez daha tarar:

  • karenin boyutundan daha büyük genişlik (ve yükseklik muhtemelen daha küçük)
  • kare boyutundan daha büyük (ve muhtemelen daha küçük genişlik)

Her iki sınıf en büyük karelerle sınırlıdır, çünkü belirli bir noktadaki hiçbir dikdörtgenin yazılı kareden daha büyük her iki boyutu olamaz (ancak bir boyut daha büyük olabilir).

Alan, çevre veya ağırlıklı boyutlar gibi dikdörtgen boyutlar için bir metrik seçilmelidir.

Dikdörtgenler için ortaya çıkan harita:

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

Harita oluşturmak ve daha sonra maxima aramak yerine şimdiye kadar bulunan en iyi dikdörtgenin konumunu ve boyutunu depolamak uygundur.

resim açıklamasını buraya girin

Bu algoritmanın pratik uygulaması dikdörtgen olmayan görüntüleri kırpmaktır. Bu algoritmayı SharpStitch görüntü dikiş kütüphanemde kullandım :

resim açıklamasını buraya girin

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.