Быстрые субрекции из многослойного изображения - PullRequest
1 голос
/ 13 июня 2019

У меня есть этот 2-мерный растр, на который наложены слои от 1 до 20 других 2-мерных растров (со случайным размером и смещением). Я ищу быстрый способ доступа к представлению под прямоугольником (со случайным размером и смещением). Представление должно возвращать все слоистые пиксели для каждой координаты X и Y.

Полагаю, это как-то так, скажем, GIMP или другие 2d-приложения рисования рисуют слои друг на друге, за исключением того, что я хочу, чтобы все пиксели располагались друг на друге, а не просто проекция, где верхний пиксель скрывает другой те, что под ним.

Я сталкивался с этой проблемой и раньше, и до сих пор делаю это сейчас, уже потратил много времени на поиск в интернете и здесь подобных проблем, но не могу их найти. Я опишу два возможных решения, оба из которых меня не устраивают:

  1. Имеют в основном трехмерный массив предварительно выделенного размера. Этим легко управлять, но память тратится впустую, а объем памяти очень велик. Для 4K-растров, скажем, 16 слотов, по 4 байта в каждом, это как 1 ГБ памяти? А в случае применения большая часть этого пространства будет потрачена впустую, а не использована.

  2. Мое решение, которое я принял раньше. Имеют два двумерных массива, один с индексами, другой с фактическими значениями. Каждый «пиксель» первого говорит, в каком диапазоне пикселей во втором массиве вы можете найти фактические пиксели, внесенные из всех слоев. Это хорошо сжато по размеру, но любой запрос переходит между двумя областями памяти и немного затрудняет настройку, не говоря уже об обновлении (приятно иметь функцию, но не обязательно).

Итак ... есть какие-нибудь ноу-хау для решения такой проблемы? Заранее спасибо!

Забыл добавить, что я нацеливаюсь на самодостаточное, желательно однопоточное, процессорное решение. Слои, скорее всего, будут иметь оттенки серого с альфа-каналом (то есть определенные пиксельные данные не будут существовать). Операция поиска является приоритетной, такие обновления, как добавление / удаление слоя, могут выполняться медленнее.

Добавлено пользователем Mark (см. Комментарий): На этом изображении, если взять верхний левый угол красного прямоугольника, поиск должен сообщать о красном, зеленом, синем и черном. Если выбран нижний правый угол, он должен отображать только красный и черный.

enter image description here

1 Ответ

0 голосов
/ 13 июня 2019
  1. Я бы сохранял смещения и размер в структуре данных отдельно от данных пикселей.Таким образом, вы не будете прыгать в памяти, пока вычисляете относительные координаты для каждого слоя (или даже если вы можете игнорировать некоторые слои).

  2. Если вы хотите получить доступ к отдельным пикселям или небольшим областям, а не итерировать большие области, Quad-Tree может быть хорошей идеей для хранения ваших данных с большей локальной памятьюдоступ при доступе к пикселям или областям, которые находятся рядом друг с другом (в направлении x или y).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...