Руководство по проектированию C # для универсальной библиотеки обработки изображений - PullRequest
1 голос
/ 26 ноября 2009

В любой библиотеке обработки изображений всегда существует проблема обеспечения реализации каждого отдельного алгоритма для каждого отдельного формата изображения (цветового пространства, каналов, глубины цвета, разметки памяти и т. Д.). Одним из очень элегантных решений проблемы является Boost GIL. Благодаря возможностям C ++ и великолепному дизайну все эти проблемы устранены, и вы можете написать единый алгоритм, который будет работать с любым типом изображения.

Я хотел создать нечто подобное в C #, но многие из необходимых конструкций, таких как шаблоны и определенные перегрузки операторов (например, унарные *), отсутствуют. Я готов согласиться с тем, что то, что я могу создать, будет не таким надежным и элегантным, как GIL, но, насколько это возможно, я хотел бы смоделировать концепции. В конечном счете, целью будет абстрагирование различий в изображениях и написание общих алгоритмов обработки.

С тем, что есть в C #, дженерики, лямбды, даже динамический IL / Cringe, как люди думают, что некоторые возможные подходы могут быть при проектировании библиотеки?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2014

Хотя мой ответ приходит с большим опозданием, я надеюсь, что он будет полезен для других людей.

Учитывая ограничения C #, которые ОП определили до сих пор, вот список критериев, которые все еще дают ограниченную свободу программисту с точки зрения форматов пикселей.

  • Гибкий битовый дескриптор класса C #, который поддерживает множество форматов пикселей, не являясь универсальным классом C #
    • Поскольку универсальный класс на языке C # не дал бы никакой выгоды пользователю обработки изображений.
  • Некоторые гарантии безопасности - определенные характеристики объекта дескриптора растрового изображения должны быть неизменными
    • В частности, формат пикселя растрового изображения и размеры в пикселях не должны изменяться после создания. Чтобы изменить их, необходимо создать новый объект.
  • Предоставляет как изменяемый интерфейс (позволяет изменять значения в пикселях), так и интерфейс неизменяемой объектной модели.
    • Чтобы указать любой функции API, что не следует пытаться записать определенный аргумент растрового изображения.
  • Набор классов алгоритмов обработки изображений, которые принимают и возвращают класс дескриптора растрового изображения.
    • Каждый алгоритм изо всех сил старается обрабатывать различные типы форматов пикселей, насколько это экономически целесообразно.

Принимая во внимание критерии, я бы рекомендовал использовать System.Windows.Media.Imaging в качестве подложки библиотеки, которую вы строите.

Пространство имен System.Windows.Media.Imaging является аналогом C # библиотеки Microsoft Windows Imaging Component (WIC) . Следовательно, базовая обработка реализована в собственном C ++, что дает ему скорость, необходимую для практического использования.

Благодаря широкой поддержке форматов пикселей, реализованной в WIC, аналог C # также поддерживает тот же диапазон форматов пикселей .


WIC (и System.Windows.Media.Imaging) не предоставляет каких-либо расширенных возможностей обработки изображений (ничего подобного обнаружению краев Канни, преобразованию Хафа, обнаружению объектов и т. Д.)

Однако, с точки зрения интерфейса обмена растровыми объектами в памяти (для интеграции различных библиотек изображений с интерфейсами или привязками C #), оба System.Windows.Media.Imaging.WriteableBitmap и System.Drawing.Bitmap подходят.


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

Таким образом, классы алгоритмов обработки изображений обычно фокусируются на поддержке узкого подмножества форматов пикселей:

  • 1bpp Black White (для логических / решающих растровых изображений, например, карты границ или членства BLOB-объектов подключенных компонентов)
  • 8bpp Grey
  • 24bpp BGR
  • 32bpp BGRA
  • 32bpp Grey Float
  • 96bpp BGR Float
  • 128bpp BGRA Float

Если класс алгоритма видит дескриптор входного растрового изображения, который не относится к указанному выше типу, он будет стараться изо всех сил «преобразовать» формат ввода в один из вышеуказанных форматов.

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

0 голосов
/ 26 ноября 2009

Вы видели Aforge.NET , способ, которым он разработан, довольно универсален.

Автор этой библиотеки решил многие проблемы, о которых вы говорите, через интерфейсы. Сверху в голове такие вещи, как, IFilter, IFilterColourToAny и т. Д.

Чтобы сделать эффективную обработку изображений в .NET, вам нужно войти в небезопасный код, используя Bitmap.LockData (я думаю), что может свести на нет все классные вещи .NET, о которых вы говорите ...

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