Автоматичне обрізання довільних форм


14

У мене довільна форма, визначена двійковою маскою (сірий = форма, чорний = фон).

Я хотів би знайти найбільший можливий прямокутник, що містить лише сірі пікселі (такий прямокутник зображений жовтим кольором):

введіть тут опис зображення

Форма завжди "цільна частина", але вона не обов'язково опукла (не всі точки точок на межі форми можуть бути з'єднані прямою лінією, що проходить через форму).

Іноді існує багато таких "максимальних прямокутників", і тоді можна ввести додаткові обмеження, такі як:

  • Візьміть прямокутник з його центром, найближчим до центру мас форми (або центру зображення)
  • Беремо прямокутник із співвідношенням сторін, найближчим до заданого співвідношення (тобто 4: 3)

введіть тут опис зображення

Моя перша думка про алгоритм полягає в наступному:

  1. Обчисліть відстань перетворення форми і знайдіть її центр маси
  2. Зростайте квадратної площі, хоча вона містить лише пікселі форми
  3. Виростіть прямокутник (спочатку квадрат) по ширині чи висоті, тоді як він містить лише пікселі форми.

Однак я думаю, що такий алгоритм був би повільним і не призвів до оптимального рішення.

Будь-які пропозиції?



@AtulIngle Рівно! Спасибі. Чи можете ви додати відповідь, щоб я міг її прийняти? Потім я спробую відредагувати відповідь, щоб детальніше розглянути алгоритм - але я не хочу просто відповідати на власне запитання, використовуючи посилання, яке ви надали ...
Libor

Чудово! Я з нетерпінням чекаю вашої детальної відповіді, оскільки я не прочитав код.
Atul Ingle

@AtulIngle Гаразд, я додав деяку дискусію у відповідь та посилання на повну мою статтю.
Libor

Відповіді:


10

На Matlab Fileexchange є код, що відповідає вашій проблемі: http://www.mathworks.com/matlabcentral/fileexchange/28155-inscribedrectangle/content/html/Inscribed_Rectangle_demo.html

Оновлення

Я написав цю статтю підручника щодо обчислення найбільших вписаних прямокутників на основі вищезазначеного посилання від Atul Ingle.

Алгоритм спочатку шукає найбільші квадрати на бінарній масці. Це робиться за допомогою простого алгоритму динамічного програмування. Кожен новий піксель оновлюється за допомогою вже відомих трьох сусідів:

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

введіть тут опис зображення

Зразок бінарної маски та обчислена карта виглядають так:

введіть тут опис зображення введіть тут опис зображення

Максимум на карті показує найбільший вписаний квадрат:

введіть тут опис зображення

Алгоритм пошуку прямокутника, ніж сканує маску ще два рази, шукаючи два класи прямокутників:

  • ширина більша за розмір квадрата (і можливо висота, можливо, менша)
  • висота більша за розмір квадрата (і можливо ширина, менша)

Обидва класи обмежені найбільшими квадратами, оскільки жоден прямокутник у даній точці не може мати обох розмірів, ніж вписаний квадрат (хоча один вимір може бути більшим).

Слід вибрати деякий показник для розмірів прямокутника, наприклад, площа, окружність або зважена сума розмірів.

Ось отримана карта для прямокутників:

введіть тут опис зображення введіть тут опис зображення

Зручно зберігати положення та розміри найкращого прямокутника, знайденого на даний момент у змінній, а не будувати карти, а потім шукати максимуми.

введіть тут опис зображення

Практичне застосування цього алгоритму - обрізання не прямокутних зображень. Я використовував цей алгоритм у своїй бібліотеці зшивання зображень SharpStitch :

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.