1

どの画像処理ライブラリでも、すべての単一の画像形式(色空間、チャネル、ビット深度、メモリレイアウトなど)に対してすべての単一のアルゴリズムの実装を提供する必要があるという問題が常にあります。この問題に対する非常に洗練された解決策の1つは、BoostGILです。C ++のパワーと優れたデザインにより、これらの問題はすべて抽象化され、あらゆるタイプの画像で機能する単一のアルゴリズムを作成できます。

C#で似たようなものを作成したかったのですが、テンプレートや特定の演算子のオーバーロード(単項*など)などの必要な構成要素の多くが欠落しています。私が作成できるものはGILほど堅牢でエレガントではないことを受け入れたいと思いますが、可能な限りコンセプトをモデル化したいと思います。最終的には、画像の違いを抽象化し、一般的な処理アルゴリズムを作成することが目的になります。

C#、ジェネリック、ラムダ、さらには動的IL / cringeで利用できるものがあるので、ライブラリを設計するためのいくつかの可能なアプローチは何だと人々は思いますか?

4

2 に答える 2

0

私の答えは非常に遅くなりますが、他の人に役立つことを願っています.

OPがこれまでに特定したC#の制限を考慮して、ピクセル形式に関してプログラマーに制限された自由を与える基準のリストを次に示します。

  • C# ジェネリック クラスではなく、さまざまなピクセル形式をサポートする柔軟なビットマップ ハンドル C# クラス
    • C# 言語のジェネリック クラスは、画像処理のユーザーに何の利益ももたらさなかったからです。
  • いくつかの安全性の保証 - ビットマップ ハンドル オブジェクトの特定の特性は不変でなければなりません
    • 特に、ビットマップのピクセル形式とピクセルの寸法は、一度作成すると変更できないようにする必要があります。これらを変更するには、新しいオブジェクトを作成する必要があります。
  • 可変インターフェイス (ピクセル値の変更を許可) と不変オブジェクト モデル インターフェイスの両方を提供
    • 特定のビットマップ引数への書き込みを試みてはならないことを API 関数に示すため。
  • ビットマップ ハンドル クラスを受け取って返す一連の画像処理アルゴリズム クラス。
    • 各アルゴリズムは、経済的に実現可能な範囲で、さまざまな種類のピクセル形式を処理するために最善を尽くします。

基準を念頭に置いて、構築するライブラリの基盤としてSystem.Windows.Media.Imagingを使用することをお勧めします。

名前空間は、Microsoft Windows Imaging Component (WIC)ライブラリSystem.Windows.Media.Imagingに相当する C#です。そのため、基礎となる処理はネイティブ C++ で実装されており、実用に必要な速度を実現しています。

WIC に実装された幅広いピクセル形式のサポートのおかげで、対応する C# も同じ範囲のピクセル形式をサポートしています。


WIC (および System.Windows.Media.Imaging) は高度な画像処理機能を提供しません (キャニー エッジ検出、ハフ変換、オブジェクト検出などの類のものは何も提供しません)。

ただし、インメモリ ビットマップ オブジェクト交換インターフェイス (さまざまなイメージ ライブラリを C# インターフェイスまたはバインディングと統合するため) であるという点では、 と の両方System.Windows.Media.Imaging.WriteableBitmapSystem.Drawing.Bitmap適しています。


アルゴリズムの実装に関しては、アルゴリズムを単一チャネルの画像とマルチチャネルの画像に等しく適用することが難しい場合があります。これには、多変量数学の研究に何十年とは言わないまでも何年もかかる。

したがって、画像処理アルゴリズム クラスが、ピクセル形式の狭いサブセットのサポートに重点を置くのが一般的です。

  • 1bpp Black White (エッジ マップや接続されたコンポーネント ブロブ メンバーシップなどの論理/決定ビットマップ用)
  • 8bpp グレー
  • 24bpp BGR
  • 32bpp BGRA
  • 32bpp グレーフロート
  • 96bpp BGR フロート
  • 128bpp BGRA フロート

アルゴリズム クラスは、上記のタイプのいずれでもない入力ビットマップ ハンドルを検出した場合、入力形式を上記の形式のいずれかに無損失で "昇格" するために最善を尽くします。

この自動アップコンバートを念頭に置くと、このアルゴリズム クラスのユーザーは、出力ビットマップのピクセル形式を厳密に制御できなくなりますが、出力の視覚的外観が期待どおりになるという保証が得られます。

于 2014-04-23T18:50:45.700 に答える
0

Aforge.NETを見たことがありますか。その設計方法はかなり汎用的です。

そのライブラリの作成者は、インターフェースを通じて、あなたが話している多くの問題を解決しました。IFilter、IFilterColourToAny などのような頭のてっぺんから

.NET で効率的な画像処理を行うには、Bitmap.LockData (私が思うに) を使用して安全でないコードに入る必要があります。

于 2009-11-26T09:19:13.067 に答える