2009-11-26 3 views
1

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

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

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

+0

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

+0

MEF классный, но я не уверен, что он обращается к тому, что я говорю. Можете ли вы взглянуть на GIL? http://www.boost.org/doc/libs/1_39_0/libs/gil/doc/index.html. Это буквально позволяет писать один алгоритм для записи в любом формате изображения. Создайте итератор, который может перечислять каждый пиксель независимо от количества каналов или глубины бита или даже если каналы были выложены в чередующемся или планарном порядке.Это и многое другое сделано в GIL, но на близких ручных закодированных скоростях из-за шаблонов. – Charles

+0

Я предполагаю, что яснее: скажем, у меня есть алгоритм вычисления гистограммы. Я не хочу писать отдельный для оттенков серого, 565 RGB, 24 RGB, 32 RGB, RGBA, ARGB, BGRA, ABGR или даже других цветовых пространств, таких как CYMK и HSL. Благодаря магии программного обеспечения эти различия должны быть абстрагированы, поэтому разработчику алгоритма обработки изображений нужно написать только один алгоритм, который будет работать во всех форматах. – Charles

ответ

0

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

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

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

+0

Это отличная библиотека, но они не обобщают ни одну из подпрограмм обработки изображений как агностик формата. Все, что у них есть, работает с растровым изображением RGB или полутоновым изображением. Я ищу способ обобщения итерации по пикселям и форматам пикселей, например, GIL. В GIL вы можете написать один алгоритм для чего-то вроде порога, например, и он может работать с любым изображением в любом цветовом пространстве с любым количеством каналов с любым количеством бит на канал. Это, в конечном счете, то, что я пытаюсь выполнить. – Charles

+0

@Charles: Я бы хотел, чтобы это было выполнено на C#. Мне еще предстоит найти способ. Шаблоны C++ просто * намного мощнее, чем C# generics. C# действительно падает на его лицо, когда дело доходит до общего числа хрустов. –

0

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

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

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

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

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

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


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

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


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

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

  • 1bpp Черной Белом (для логического/решения растровых изображений, например, краевой карты или подключенного членства компонента блобы)
  • 8bpp Серый
  • 24bpp BGR
  • 32bpp BGRA
  • 32bpp Серый Поплавок
  • 96bp р BGR Float
  • 128bpp BGRA Поплавок

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

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

Смежные вопросы