Вы в сетке (т.е. изображение) или в непрерывном 2D пространстве? Мой ответ для случая, когда каждая точка имеет целочисленные координаты. В другом случае вы можете получить приближение с моим ответом.
Если я правильно понимаю ваш вопрос, вам нужно две вещи:
- список всех крупнейших пустых прямоугольников (т.е. прямоугольник заполняется только белыми точками, которым не может быть продлен в любом направлении, не включая черная точка) (также называемая «максимальные пустые прямоугольники», или MER в литературе).
- 2D-массив указателей прямоугольника, который указывает для каждой точки самый большой пустой прямоугольник, включающий эту точку. Другая структура данных также возможна, но я не буду описывать их, так как выбор зависит в основном от требований вашего целевого приложения.
Для того чтобы вычислить этот список, вы можете использовать алгоритм O (N), где N - количество пикселей в черно-белом изображении. Вы можете найти документ, описывающий такой алгоритм, в http://www.ulg.ac.be/telecom/rectangles, с некоторым (не оптимизированным) исходным кодом на C++. На практике это очень быстро.
Чтобы вычислить 2D-массив пинтов, вам необходимо пройти список всех самых больших пустых прямоугольников, а для каждого - обновить указатель (если необходимо) для всех включенных пикселей. Поскольку существует не более N наибольших пустых прямоугольников (для prrof, см. Бумагу, связанную с http://www.ulg.ac.be/telecom/rectangles), и каждый прямоугольник включает в себя большинство N пикселей, этот шаг в худшем случае O (N^2). Я не знаю, можно ли снизить стоимость этого шага.
Первое, что вы упомянули (список всех MER) это то, что мне нужно. Я находится в целочисленном пространстве, однако я бы хотел избежать решения проблемы на уровне пикселей, но решить ее со сложностью в функции количества черных прямоугольников. Причиной этого является то, что количество черных прямоугольников никогда не будет большим числом (больше 20-30), поэтому я считаю, что можно получить более быстрое решение. Тем не менее, спасибо за ответ. –