Работая с библиотекой компьютерного зрения, я подумал, что будет идеальной структурой данных для сохранения данных изображения.
Кто-то сказал мне, что использование std :: vector — это плохо, потому что смежность данных не гарантируется, поэтому простой более эффективен.
Проблема в том, что содержимое вектора должно зависеть от цветового пространства. Кроме того, для проблем с размером было бы лучше иметь неподписанный символ на канал, хотя для операций лучше использовать поплавки.
Чтобы обрабатывать цветовые пространства, я должен увеличить размер вектора (например, утроить его для обработки RGB), чтобы я мог получить доступ к данным следующим образом:
data[0] => pixel 1, Red
data[1] => pixel 1, Green
data[2] => pixel 1, Blue
data[3] => pixel 2, Red
data[4] => pixel 2, Green
... etc
Или возможно сделать это более эффективно (например, используя long int или float для хранения всех значений канала в одной переменной), и если да, то как? Как я могу сделать это универсальным для обработки 1, 2, 3 или 4 каналов, чтобы я мог легко (относительно) изменить цветовое пространство?
Вопрос не в контейнере (я уже использую один std :: vector), а в самом содержимом.
РЕДАКТИРОВАТЬ: Поскольку этот вопрос был помечен как основанный на мнениях, я постараюсь прояснить его.
На данный момент я храню данные изображения в std::vector<float>
, Проблема в том, что я не знаю, сколько элементов хранить (например, в 3 раза больше, чтобы обрабатывать RGB / HSV, или реализовать структуру из 4 элементов (RGBA), даже когда я использую только один (оттенки серого)?) для того, чтобы эффективно изменить цветовое пространство или выполнять операции с матрицами, когда мне нужно. Поскольку это должно быть интегрировано в библиотеку компьютерного зрения, очень вероятно случиться хотя бы раз в каждом кадре.
Я чего-то прошу эффективное в моем случае здесь, который не имеет ничего общего (или очень мало) с мнением. Может быть несколько хороших ответов, и выбор среди них зависит от мнения, но это должен быть мой призыв.
Какая «лучшая» структура данных для данных изображения в значительной степени зависит от того, какие операции вы хотите выполнить над изображением, и в основном от того, какие операции вы хотите оптимизировать.
Обычно std::vector
может быть достаточно байтов (для всего изображения, а не вектора для каждой отдельной строки); вектор гарантирует, что данные хранятся в непрерывном блоке памяти, что может соответствовать или не соответствовать вашим случаям использования (т.е. это не так, если вам нужно управлять шагами дольше, чем линиями сканирования).
Если вам требуется более детальный доступ к информации о формате пикселя (то есть одноцветных компонентах), вы можете использовать пользовательскую структуру для представления пикселей.
Кроме того, структура данных может быть более сложной в зависимости от того, каким типом изображений вам нужно управлять.
То есть Вы ограничены 1 или несколькими пиксельными форматами?
Вы ограничены «упакованными» изображениями (последовательные цветовые компоненты в 1 «плоскости») или вам необходимо управлять также «плоскими» изображениями (несколько «плоскостей», по одному для каждого цветового компонента)?
Вы также можете посмотреть некоторые доступные графические библиотеки в Интернете.
Тот, который (на мой взгляд) имеет интересное управление пиксельными компонентами (с пользовательскими итераторами и другими средствами) Повышение GIL
Других решений пока нет …