Как мне следует реализовать алгоритмы, которые будут использоваться с черно-белыми и цветными изображениями? - PullRequest
3 голосов
/ 15 августа 2011

Я думал о:

1) Реализуйте все для черно-белых изображений, затем создайте обертки для методов, которые проверяют, является ли это цветным изображением.Если это так, разделите каналы, выполните операции для каждого из них по отдельности, а затем объедините их.

2) Используйте функторы для правильного обновления значений в зависимости от того, с чем я имею дело.Проблема в том, что ошибки компилятора были бы действительно сложными, и я к этому не привык, и я думаю, что мне может понадобиться довольно много из них.Не уверен, что это хорошая идея.

Здесь может быть правильный шаблон дизайна, которого я тоже не вижу.Также может быть способ сделать это, который не зависит от канала / цвета в OpenCV, хотя я еще не нашел его, и пока книга, которую я читаю (OpenCV 2 Computer Vision Application Programming Cookbook), не показала мне такоговозможность еще.

Ответы [ 4 ]

1 голос
/ 15 августа 2011

Если важна скорость, не надо.

Звучит так, будто вы пытаетесь инкапсулировать или абстрагировать тип пикселя с помощью ОО-технологий или чего-то подобного. Это может добавить дополнительный уровень косвенности для каждого пиксельного доступа, снижая вашу производительность.

Если вы вызываете staight для функции вместо указателя на одну (например, делегат, переопределенный метод, функтор), это все равно может быть быстрее для ЦП, но если вы выполняете вызовы функций вообще, пересмотрите; это все еще дополнительная работа, и если вы сможете вложить все во внешний цикл FOR, это будет выглядеть уродливо, а снобы функционального программирования будут насмехаться над вами, помните, что это не большое LOB-приложение, которое будет сложно поддерживать. Вот почему инженеры все еще могут отлично поддерживать 30-летний код быстрого задания, проблемному пространству не нужно ничего более умного (однако обычно их проблемы сами нуждаются в чем-то более умном, чем я!)

Лучше всего реализовать простые вещи (например, пороговое значение или изменение размера), оптимизированные для каждого типа изображения, если вам нужна скорость. Вы также можете исследовать матрицу преобразования и посмотреть, сможете ли вы выполнить свою работу таким образом. Таким образом, вы можете написать только 2 алгоритма преобразования (ч / б) и, используя похожую (или одинаковую) матрицу, сделать то же самое для обоих типов изображений.

Следовательно, достижение главной цели абстракции в любом случае - плавное повторное использование, разделение интересов. И скорость загрузки (но, надеюсь, не перезагрузка!) Удачи

0 голосов
/ 15 августа 2011

Мой собственный класс Image использует планарную структуру (то есть цветовые каналы раздельные) вместо чередующейся структуры. Однако это ОЧЕНЬ ограничивает, когда речь идет о квантовании изображения и других совместных задачах по обработке цвета.

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

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

Честно говоря, я считаю, что разбиение плоскостей довольно неэффективно, поскольку вы вычисляете различные накладные расходы несколько раз. Например, если вы хотите изменить размер изображения, вычисление различных коэффициентов фильтра очень дорого, и было бы НАМНОГО лучше просто рассчитать их один раз и применить Pixel :: operator * и + вместо того же с базовыми подпиксельными компонентами. .

0 голосов
/ 15 августа 2011

Для большинства алгоритмов не нужно беспокоиться о монохромных и цветных изображениях.Вы либо используете значение серого для монохромного изображения, либо вычисляете яркость / интенсивность / любой другой цвет и используете его.Вы выбираете меру яркости и т. Д., Глядя на то, какое цветовое пространство даст желаемый результат.

Когда вы рассчитали, как вы собираетесь изменять свои изображения, вы используете некоторую обработку с учетом пикселей, например смешивание двух пикселейможет быть pixel_a*0.5 + pixel_b*0.5, ваш класс пикселей определит, как применить это к различным цветным каналам, например Pixel::operator+(const Pixel &), Pixel::operator*(float) и т. д.

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

0 голосов
/ 15 августа 2011

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

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

Третий вариант, не упомянутый, - это перевод черно-белых изображений в полноцветный режим, их обработка и преобразование.вернуться к ч / б.Это оптимизирует полную обработку цвета за счет ч / б.

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