Pemotongan Otomatis Bentuk Sewenang-wenang

14

Saya memiliki bentuk arbitrer yang ditentukan oleh topeng biner (abu-abu = bentuk, hitam = latar belakang).

Saya ingin mencari persegi panjang terbesar yang mungkin hanya berisi piksel abu-abu (persegi panjang tersebut digambarkan dengan warna kuning):

masukkan deskripsi gambar di sini

Bentuk selalu "satu bagian" tetapi tidak harus cembung (tidak semua pasangan titik pada batas bentuk dapat dihubungkan oleh garis lurus melalui bentuk).

Kadang-kadang banyak "persegi panjang maksimum" seperti itu ada dan kemudian batasan lebih lanjut dapat diperkenalkan, seperti:

  • Mengambil persegi panjang dengan pusatnya yang terdekat dengan pusat massa bentuk (atau pusat gambar)
  • Mengambil persegi panjang dengan aspek rasio terdekat dengan rasio yang telah ditentukan (yaitu 4: 3)

masukkan deskripsi gambar di sini

Pikiran pertama saya tentang algoritma adalah sebagai berikut:

  1. Hitung transformasi jarak bentuk dan temukan pusat massanya
  2. Tumbuhkan area persegi sementara itu hanya berisi piksel bentuk
  3. Tumbuhkan persegi panjang (awalnya persegi) dengan lebar atau tinggi sementara hanya berisi piksel bentuk.

Namun, saya pikir algoritma seperti itu akan lambat dan tidak akan mengarah pada solusi optimal.

Ada saran?

Libor
sumber
2
Apakah ini membantu? mathworks.com/matlabcentral/fileexchange/…
Atul Ingle
@AtulIngle Extactly! Terima kasih. Bisakah Anda menambahkan jawabannya sehingga saya bisa menerimanya? Saya kemudian akan mencoba mengedit jawaban untuk menguraikan lebih lanjut tentang algoritme - tetapi saya tidak ingin hanya menjawab pertanyaan saya sendiri menggunakan tautan yang Anda berikan ...
Lib
Bagus! Saya akan menantikan untuk membaca jawaban rumit Anda karena saya belum membaca kode.
Atul Ingle
@AtulIngle OK, saya telah menambahkan beberapa diskusi dalam jawaban dan tautan ke artikel lengkap saya.
Libor

Jawaban:

10

Ada kode pada Matlab Fileexchange yang relevan dengan masalah Anda: http://www.mathworks.com/matlabcentral/fileexchange/28155-inscriptionReignangle/content/html/Inscribed_Rectangle_demo.html

Memperbarui

Saya menulis artikel tutorial ini tentang menghitung persegi panjang bertuliskan terbesar berdasarkan tautan di atas dari Atul Ingle.

Algoritma pertama mencari kotak terbesar pada topeng biner. Ini dilakukan dengan menggunakan algoritma pemrograman dinamis sederhana. Setiap piksel baru diperbarui menggunakan tiga tetangga yang sudah dikenal:

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

masukkan deskripsi gambar di sini

Contoh topeng biner dan peta yang dihitung terlihat seperti ini:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Mengambil maksimum di peta mengungkapkan kotak tertulis terbesar:

masukkan deskripsi gambar di sini

Algoritme pencarian persegi panjang daripada memindai topeng dua kali lagi mencari dua kelas persegi panjang:

  • lebar lebih besar dari ukuran kotak (dan tinggi mungkin lebih kecil)
  • tinggi lebih besar dari ukuran persegi (dan lebar mungkin lebih kecil)

Kedua kelas dibatasi oleh kuadrat terbesar karena tidak ada persegi panjang pada titik tertentu dapat memiliki kedua dimensi lebih besar dari kuadrat tertulis (meskipun satu dimensi dapat lebih besar).

Kita harus memilih beberapa metrik untuk ukuran persegi panjang, seperti luas, keliling atau jumlah dimensi tertimbang.

Berikut adalah peta yang dihasilkan untuk persegi panjang:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Lebih mudah untuk menyimpan posisi dan ukuran persegi panjang terbaik yang ditemukan sejauh ini dalam sebuah variabel daripada membangun peta dan kemudian mencari maxima.

masukkan deskripsi gambar di sini

Aplikasi praktis dari algoritma ini adalah memotong gambar non-persegi panjang. Saya telah menggunakan algoritme ini di pustaka jahitan gambar saya SharpStitch :

masukkan deskripsi gambar di sini

Atul Ingle
sumber